22/08/2014
Импортирование фильтров слоев
Здесь пример кода для импортирования фильтра слоев, включая вложенные фильтры, из другого чертежа. Слои, которые фигурируют в этих фильтрах, также копируются.
А вот пример чертежа, на котором проводились тесты: Загрузить тестовый чертеж
Код - C#: [Выделить]
- using 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)
- {
- // Получаем слои, которые следует клонировать в db
- // Только те, которые участвуют в фильтре
- 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);
- }
- }
- // Клонируем слои во внешнюю db
- IdMapping idmap = new IdMapping();
- if (layerIds.Count > 0)
- {
- srcDb.WblockCloneObjects(
- layerIds,
- destDb.LayerTableId,
- idmap,
- DuplicateRecordCloning.Replace,
- false);
- }
- // Опеределяем не было ли фильтра слоев
- // с таким же именем во внешней db
- 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)
- {
- // Создаем новую группу слоев если
- // ничего не найдено
- 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
- {
- // Создаем фильтр слоев если
- // ничего не найдено
- df = new LayerFilter();
- df.Name = sf.Name;
- df.FilterExpression = sf.FilterExpression;
- destFilter.NestedFilters.Add(df);
- }
- }
- // Импортируем другие фильтры
- ImportNestedFilters(sf, df, srcDb, destDb);
- }
- tr.Commit();
- }
- }
Источник: 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