<?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.
<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>

Leave a Reply