ADN Open CIS
Сообщество программистов Autodesk в СНГ

22/08/2014

Импортирование фильтров слоев

Здесь пример кода для импортирования фильтра слоев, включая вложенные фильтры, из другого чертежа. Слои, которые фигурируют в этих фильтрах, также копируются.

А вот пример чертежа, на котором проводились тесты: Загрузить тестовый чертеж


Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.LayerManager;
  2.  
  3. [CommandMethod("ImportLayerFilters")]
  4. public static void ImportLayerFilters()
  5. {
  6.   String filePath = "D:\\Temp\\Test1.dwg";
  7.   if (!System.IO.File.Exists(filePath))
  8.     return;
  9.  
  10.   Document doc = Application.DocumentManager.MdiActiveDocument;
  11.   Database destDb = doc.Database;
  12.  
  13.   LayerFilterTree lft = destDb.LayerFilters;
  14.   using (Database srcDb
  15.                   = new Database(false, false))
  16.   {
  17.     srcDb.ReadDwgFile(
  18.         filePath,
  19.         FileOpenMode.OpenForReadAndAllShare,
  20.         false, String.Empty);
  21.  
  22.     ImportNestedFilters(
  23.         srcDb.LayerFilters.Root,
  24.         lft.Root, srcDb, destDb);
  25.   }
  26.  
  27.   destDb.LayerFilters = lft;
  28. }
  29.  
  30. public static void ImportNestedFilters(
  31.                             LayerFilter srcFilter,
  32.                             LayerFilter destFilter,
  33.                             Database srcDb,
  34.                             Database destDb)
  35. {
  36.   using (Transaction tr
  37.       = srcDb.TransactionManager.StartTransaction())
  38.   {
  39.     LayerTable lt = tr.GetObject(
  40.                     srcDb.LayerTableId,
  41.                     OpenMode.ForRead, false)
  42.                     as LayerTable;
  43.  
  44.     foreach (LayerFilter sf in srcFilter.NestedFilters)
  45.     {
  46.       // Получаем слои, которые следует клонировать в db
  47.       // Только те, которые участвуют в фильтре
  48.       ObjectIdCollection layerIds
  49.                           = new ObjectIdCollection();
  50.       foreach (ObjectId layerId in lt)
  51.       {
  52.         LayerTableRecord ltr = tr.GetObject(
  53.             layerId, OpenMode.ForRead, false)
  54.                         as LayerTableRecord;
  55.  
  56.         if (sf.Filter(ltr))
  57.         {
  58.           layerIds.Add(layerId);
  59.         }
  60.       }
  61.  
  62.       // Клонируем слои во внешнюю db 
  63.       IdMapping idmap = new IdMapping();
  64.       if (layerIds.Count > 0)
  65.       {
  66.         srcDb.WblockCloneObjects(
  67.                         layerIds,
  68.                         destDb.LayerTableId,
  69.                         idmap,
  70.                         DuplicateRecordCloning.Replace,
  71.                         false);
  72.       }
  73.  
  74.       // Опеределяем не было ли фильтра слоев
  75.       // с таким же именем во внешней db
  76.       LayerFilter df = null;
  77.       foreach (LayerFilter f in destFilter.NestedFilters)
  78.       {
  79.         if (f.Name.Equals(sf.Name))
  80.         {
  81.           df = f;
  82.           break;
  83.         }
  84.       }
  85.  
  86.       if (df == null)
  87.       {
  88.         if (sf is LayerGroup)
  89.         {
  90.           // Создаем новую группу слоев если
  91.           // ничего не найдено
  92.           LayerGroup sfgroup = sf as LayerGroup;
  93.           LayerGroup dfgroup = new LayerGroup();
  94.           dfgroup.Name = sf.Name;
  95.  
  96.           df = dfgroup;
  97.  
  98.           LayerCollection lyrs = sfgroup.LayerIds;
  99.           foreach (ObjectId lid in lyrs)
  100.           {
  101.             if (idmap.Contains(lid))
  102.             {
  103.               IdPair idp = idmap[lid];
  104.               dfgroup.LayerIds.Add(idp.Value);
  105.             }
  106.           }
  107.           destFilter.NestedFilters.Add(df);
  108.         }
  109.         else
  110.         {
  111.           // Создаем фильтр слоев если
  112.           // ничего не найдено
  113.           df = new LayerFilter();
  114.           df.Name = sf.Name;
  115.           df.FilterExpression = sf.FilterExpression;
  116.           destFilter.NestedFilters.Add(df);
  117.         }
  118.       }
  119.  
  120.       // Импортируем другие фильтры
  121.       ImportNestedFilters(sf, df, srcDb, destDb);
  122.     }
  123.     tr.Commit();
  124.   }
  125. }

Источник: http://adndevblog.typepad.com/autocad/2014/06/importing-layer-filters.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=928

Опубликовано 22.08.2014
Отредактировано 22.08.2014 в 14:42:11