Hi.
I´m trying to get layers Id Collection for LayerFilter( properties filter in LayerManager) and LayerGroup (group filter in LayerManager too).
LayerGroup has method "LayerIds()" to get collection but I can´t use because debugger say me that it is a LayerFilter when it is really a LayerGroup.
public static List<Filtros_Capas> Get_FiltrosCapas() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; // List the nested(anidadas) layer filters. NeestedFilters siginifca que hay filtros dentro de otros filtros. List<toolsC3D.Filtros_Capas> listaFiltros = new List<toolsC3D.Filtros_Capas>(); // instancia de la nueva lista Filtros_Capas aBobj = default(Filtros_Capas); LayerFilterTree lft = db.LayerFilters; //esquema en arbol de la lista de filtros. Autodesk.AutoCAD.LayerManager.LayerFilterCollection lfc = db.LayerFilters.Root.NestedFilters; for (int i = 0; i <= lfc.Count - 1; i++) { if (lfc[i].FilterExpression == "") { if (lfc[i].IsIdFilter == true) { aBobj.Name = lfc[i].Name; aBobj.Count = lfc[i].LayerIds.Count; listaFiltros.Add(aBobj); } } else { } } return listaFiltros; }
Also, I don´t know how to differentiate when filter is LayerFilter or LayerGroup. I use:
FilterExpression == ""
and I take for granted that filter is LayerGroup, but it isn´t quite right.
I have tried to do this, but it doesn´t work.
foreach(LayerGroup filter in lfc) { aBobj.Name = filter.Name; aBobj.Count=filter.LayerIds.Count; listaFiltros.Add(aBobj); }
I would like to get id layers collection for LayerFilter and LayerGroup.
Thank you in advance.
Finally, I have made this:
I have used bool method (.Filter) to check if each layer in LayerTable is included in selected filter(with filter´s Name).
I have created two functions that get two list, one for list of name layerfilters, and other to Idlayers inclued in filter.
public static List<Filtros_Capas> Get_FiltrosCapas() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; // List the nested(anidadas) layer filters. NeestedFilters siginifca que hay filtros dentro de otros filtros. List<toolsC3D.Filtros_Capas> listaFiltros = new List<toolsC3D.Filtros_Capas>(); // instancia de la nueva lista Filtros_Capas aBobj = default(Filtros_Capas); LayerFilterTree lft = db.LayerFilters; //esquema en arbol de la lista de filtros. Autodesk.AutoCAD.LayerManager.LayerFilterCollection lfc = db.LayerFilters.Root.NestedFilters; for (int i = 0; i <= lfc.Count - 1; i++) { if (lfc[i].Name == "Nuevas capas no reconciliadas" || lfc[i].Name == "Modificaciones de ventana") { } else { aBobj = new toolsC3D.Filtros_Capas(); aBobj.Name = lfc[i].Name; listaFiltros.Add(aBobj); } } return listaFiltros; } public static List<BaseObject> Get_Capas(string NombreFiltro) { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; List<BaseObject> listaCapas = new List<BaseObject>(); // instancia de la nueva lista BaseObject aBobj = default(BaseObject); Autodesk.AutoCAD.LayerManager.LayerFilterCollection lfc = db.LayerFilters.Root.NestedFilters; int indice = 0; for (int i = 0; i <= lfc.Count - 1; i++) { if (lfc[i].Name == NombreFiltro) { indice = i; } } LayerTableRecord ltr; using (Transaction tr = db.TransactionManager.StartTransaction()) { LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable; foreach (ObjectId oid in lt) { ltr = tr.GetObject(oid, OpenMode.ForRead) as LayerTableRecord; if(lfc[indice].Filter(ltr)==true) //la capa está incluída dentro del filtro { aBobj = new toolsC3D.BaseObject(); aBobj.Id = ltr.Id; listaCapas.Add(aBobj); } } tr.Commit(); } return listaCapas; }