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

18/11/2013

Создание и доступ к информации фильтра слоёв

Ниже примеры с использованием ObjectARX и .NET создания и манипулирования фильтрами слоёв. Простейший способ для того, чтобы узнать выражение фильтра слоёв – это создать его средствами AutoCAD и использовать этот код для поиска фильтра слоёв. Это можно затем использовать в коде для создания нового фильтра слоёв.

ObjectARX :

Код - C++: [Выделить]
  1. Acad::ErrorStatus es = Acad::eOk;
  2. AcDbDatabase *pDb =
  3.              acdbHostApplicationServices()->workingDatabase();
  4.  
  5. AcLyLayerFilterManager *pLayerFilterManager =
  6.                                aclyGetLayerFilterManager(pDb);
  7.  
  8. AcLyLayerFilter *pRoot = NULL;
  9. AcLyLayerFilter *pCurrent = NULL;
  10. es = pLayerFilterManager->getFilters(pRoot, pCurrent);
  11. if(es != Acad::eOk)
  12.     return;
  13.  
  14. if(pRoot != NULL)
  15. {
  16.     AcArray<AcLyLayerFilter *> filters;
  17.     filters = pRoot->getNestedFilters();
  18.  
  19.     // Печатаем информацию о корневом фильтре
  20.     acutPrintf
  21.             (
  22.                 ACRX_T("\n(Корневой) Имя : %s Выражение : %s"),
  23.                 pRoot->name(),
  24.                 pRoot->filterExpression()
  25.             );
  26.  
  27.     // Печатаем информацию о всех фильтрах
  28.     for(int i=0; i < filters.length();i++)
  29.     {
  30.         acutPrintf
  31.                 (
  32.                     ACRX_T("\nИмя : %s Выражение : %s"),
  33.                     filters.at(i)->name(),
  34.                     filters.at(i)->filterExpression()
  35.                 );
  36.     }
  37.  
  38.     // Выводим информацию о текущем фильтре
  39.     if(pCurrent != NULL)
  40.     {
  41.         acutPrintf
  42.                 (
  43.                     ACRX_T("\n(Текущий) Имя : %s Выражение : %s"),
  44.                     pCurrent->name(),
  45.                     pCurrent->filterExpression()
  46.                 );
  47.     }
  48.  
  49.     // Создаём и добавляем новый фильтр слоев
  50.     AcLyLayerFilter *pMyLyFilter = new AcLyLayerFilter();
  51.     pMyLyFilter->setName(ACRX_T("MyLyFilter"));
  52.     pMyLyFilter->setFilterExpression(ACRX_T("NAME == \"*Test*\""));
  53.  
  54.     es = pRoot->addNested(pMyLyFilter);
  55.     es = pLayerFilterManager->setFilters(pRoot, pMyLyFilter);
  56.  
  57.     delete pRoot;
  58. }

AutoCAD .Net API :

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.LayerManager;
  2. [CommandMethod("CreateLayerFilter")]
  3. public void CreateLayerFilter()
  4. {
  5.     Document doc
  6.                 = Application.DocumentManager.MdiActiveDocument;
  7.     Database db = doc.Database;
  8.     Editor ed = doc.Editor;
  9.  
  10.     LayerFilterTree filterTree = db.LayerFilters;
  11.     LayerFilterCollection filters
  12.                             = filterTree.Root.NestedFilters;
  13.  
  14.     // Выводим информацию о корневом фильтре
  15.     ed.WriteMessage
  16.             (
  17.                 String.Format("\n(Корневой) Имя : {0} Выражение : {1}",
  18.                 db.LayerFilters.Root.Name,
  19.                 db.LayerFilters.Root.FilterExpression)
  20.             );
  21.  
  22.     // Выводим информацию о всех фильтрах
  23.     foreach(LayerFilter f in filters)
  24.     {
  25.         ed.WriteMessage
  26.                 (
  27.                     String.Format("\nИмя : {0} Выражение : {1}",
  28.                     f.Name,
  29.                     f.FilterExpression)
  30.                 );
  31.     }
  32.  
  33.     // Выводим информацию о текущем фильтре
  34.     if(db.LayerFilters.Current != null)
  35.     {
  36.         ed.WriteMessage
  37.         (
  38.             String.Format("\n(Текущий) Имя : {0} Выражение : {1}",
  39.             db.LayerFilters.Current.Name,
  40.             db.LayerFilters.Current.FilterExpression)
  41.         );
  42.     }
  43.  
  44.     // Создаём новый фильтр слоёв
  45.     LayerFilter layerFilter = new LayerFilter();
  46.     layerFilter.Name = "MyLyFilter";
  47.     layerFilter.FilterExpression = "NAME == \"*Test*\"";
  48.     filters.Add(layerFilter);
  49.  
  50.     // Устанавливаем изменённые фильтры для базы данных
  51.     db.LayerFilters = filterTree;
  52. }

 

Источник: http://adndevblog.typepad.com/autocad/2012/05/creating-and-accessing-layer-filter-information.html

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

Опубликовано 18.11.2013
Отредактировано 18.11.2013 в 04:15:34