Importing Layer Filters

<?xml encoding=”UTF-8″>By Balaji Ramamoorthy

Here is a sample code snippet to import layer filters including nested layer filters from another drawing. The layers that qualify the filters are also imported.

A sample drawing with a few nested layer filters that I tested this code with can be downloaded here.

Download Test

 <span>using</span><span>  Autodesk.AutoCAD.LayerManager;</span>
 
 [<span>CommandMethod</span><span> (<span>"ImportLayerFilters"</span><span> )]</span></span>
 <span>public</span><span>  <span>static</span><span>  <span>void</span><span>  ImportLayerFilters()</span></span></span>
 <span>{</span>
     String filePath = <span>@"D:\\Temp\\Test1.dwg"</span><span> ;</span>
     <span>if</span><span>  (!System.IO.File.Exists(filePath))</span>
         <span>return</span><span> ;</span>
 
     Document doc = Application.DocumentManager.MdiActiveDocument;
     Database destDb = doc.Database;
 
     LayerFilterTree lft = destDb.LayerFilters;
     <span>using</span><span>  (Database srcDb</span>
                     = <span>new</span><span>  Database(<span>false</span><span> , <span>false</span><span> ))</span></span></span>
     <span>{</span>
         srcDb.ReadDwgFile(
             filePath,
             FileOpenMode.OpenForReadAndAllShare,
             <span>false</span><span> , String.Empty);</span>
 
         ImportNestedFilters(
             srcDb.LayerFilters.Root,
             lft.Root, srcDb, destDb);
     <span>}</span>
 
     destDb.LayerFilters = lft;
 <span>}</span>
 
 <span>public</span><span>  <span>static</span><span>  <span>void</span><span>  ImportNestedFilters(</span></span></span>
                             LayerFilter srcFilter,
                             LayerFilter destFilter,
                             Database srcDb,
                             Database destDb)
 <span>{</span>
     <span>using</span><span>  (Transaction tr</span>
         = srcDb.TransactionManager.StartTransaction())
     <span>{</span>
         LayerTable lt = tr.GetObject(
                         srcDb.LayerTableId,
                         OpenMode.ForRead, <span>false</span><span> )</span>
                         <span>as</span><span>  LayerTable;</span>
 
         <span>foreach</span><span>  (LayerFilter sf <span>in</span><span>  srcFilter.NestedFilters)</span></span>
         <span>{</span>
             <span>// Get the layers to be cloned to the dest db. </span><span> </span>
             <span>// Only those that are pass the filter </span><span> </span>
             ObjectIdCollection layerIds
                                 = <span>new</span><span>  ObjectIdCollection();</span>
             <span>foreach</span><span>  (ObjectId layerId <span>in</span><span>  lt)</span></span>
             <span>{</span>
                 LayerTableRecord ltr = tr.GetObject(
                     layerId, OpenMode.ForRead, <span>false</span><span> )</span>
                                 <span>as</span><span>  LayerTableRecord;</span>
 
                 <span>if</span><span>  (sf.Filter(ltr))</span>
                 <span>{</span>
                     layerIds.Add(layerId);
                 <span>}</span>
             <span>}</span>
 
             <span>// clone the layers to the dest db </span><span> </span>
             IdMapping idmap = <span>new</span><span>  IdMapping();</span>
             <span>if</span><span>  (layerIds.Count > 0)</span>
             <span>{</span>
                 srcDb.WblockCloneObjects(
                                 layerIds,
                                 destDb.LayerTableId,
                                 idmap,
                                 DuplicateRecordCloning.Replace,
                                 <span>false</span><span> );</span>
             <span>}</span>
 
             <span>// Find if a destination database already  </span><span> </span>
             <span>// has a layer filter with the same name </span><span> </span>
             LayerFilter df = <span>null</span><span> ;</span>
             <span>foreach</span><span>  (LayerFilter f <span>in</span><span>  destFilter.NestedFilters)</span></span>
             <span>{</span>
                 <span>if</span><span>  (f.Name.Equals(sf.Name))</span>
                 <span>{</span>
                     df = f;
                     <span>break</span><span> ;</span>
                 <span>}</span>
             <span>}</span>
 
             <span>if</span><span>  (df == <span>null</span><span> )</span></span>
             <span>{</span>
                 <span>if</span><span>  (sf <span>is</span><span>  LayerGroup)</span></span>
                 <span>{</span>
                     <span>// create a new layer filter group </span><span> </span>
                     <span>// if nothing found </span><span> </span>
                     LayerGroup sfgroup = sf <span>as</span><span>  LayerGroup;</span>
                     LayerGroup dfgroup = <span>new</span><span>  LayerGroup();</span>
                     dfgroup.Name = sf.Name;
 
                     df = dfgroup;
 
                     LayerCollection lyrs = sfgroup.LayerIds;
                     <span>foreach</span><span>  (ObjectId lid <span>in</span><span>  lyrs)</span></span>
                     <span>{</span>
                         <span>if</span><span>  (idmap.Contains(lid))</span>
                         <span>{</span>
                             IdPair idp = idmap[lid];
                             dfgroup.LayerIds.Add(idp.Value);
                         <span>}</span>
                     <span>}</span>
                     destFilter.NestedFilters.Add(df);
                 <span>}</span>
                 <span>else</span><span> </span>
                 <span>{</span>
                     <span>// create a new layer filter </span><span> </span>
                     <span>// if nothing found </span><span> </span>
                     df = <span>new</span><span>  LayerFilter();</span>
                     df.Name = sf.Name;
                     df.FilterExpression = sf.FilterExpression;
                     destFilter.NestedFilters.Add(df);
                 <span>}</span>
             <span>}</span>
 
             <span>// Import other filters </span><span> </span>
             ImportNestedFilters(sf, df, srcDb, destDb);
         <span>}</span>
         tr.Commit();
     <span>}</span>
 <span>}</span>
 


Comments

6 responses to “Importing Layer Filters”

  1. Hi, I get an error on df = destFilter.NestedFilters.Cast()
    LayerManager.LayerFilterCollection does not contain “Cast”. Perhaps this is for 2015? I am using 2014 for the moment.

  2. Hi Dale,
    I am not sure why that fails. You can simply replace it using this for now. It simply finds if the destination filter with the same name already exists. If so, we will not create it again. This is needed for some of the default layer filters.
    LayerFilter df = null;
    foreach(LayerFilter f in destFilter.NestedFilters)
    {
    if(f.Name.equals(sf.Name))
    {
    df = f;
    break;
    }
    }
    Regards,
    Balaji

  3. Matinau Avatar
    Matinau

    I get the same error on the second loop, think the destFilter is still open.

  4. I will review the code and get back to you.
    Thanks
    Balaji

  5. Hi Matinau,
    Can you please try the updated code.
    Sorry, It was my mistake to have ignored Layer filter groups. The earlier code only considered the Layer property filters.
    Regards,
    Balaji

  6. Is there a way to modify this so that it will not import the layers too?
    Thanks
    JH

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading