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