.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

help: get layerIds collection for LayerFilter and LayerGroup

1 REPLY 1
Reply
Message 1 of 2
joantopo
583 Views, 1 Reply

help: get layerIds collection for LayerFilter and LayerGroup

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.

 

Autocad C3D 2019 SP3, 2020 & 2021
Intel I9 9900K with frontal watercooler alphacool eisbaer 360 (original fans mounted in pull)- 3 fans Corsair 120 ML PRO in push.
MOBO Gygabyte Z390 Aorus Master- Corsair RGB Vengeance 64GB RAM (4x16) CL16
Nvidia Quadro RTX 4000
Samsung 970 EVO PLUS 1TB (unit C). Samsung 970 PRO 512GB (for data)
Power Supply: Corsair TX850M PLUS


Descubre mi programa VisorNET para Civil 3D:
https://apps.autodesk.com/CIV3D/es/Detail/Index?id=appstore.exchange.autodesk.com%3avisornet_windows32and64%3aes
1 REPLY 1
Message 2 of 2
joantopo
in reply to: joantopo

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;
        
        }

 

Autocad C3D 2019 SP3, 2020 & 2021
Intel I9 9900K with frontal watercooler alphacool eisbaer 360 (original fans mounted in pull)- 3 fans Corsair 120 ML PRO in push.
MOBO Gygabyte Z390 Aorus Master- Corsair RGB Vengeance 64GB RAM (4x16) CL16
Nvidia Quadro RTX 4000
Samsung 970 EVO PLUS 1TB (unit C). Samsung 970 PRO 512GB (for data)
Power Supply: Corsair TX850M PLUS


Descubre mi programa VisorNET para Civil 3D:
https://apps.autodesk.com/CIV3D/es/Detail/Index?id=appstore.exchange.autodesk.com%3avisornet_windows32and64%3aes

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost