18/11/2013
					Создание и доступ к информации фильтра слоёв
Ниже примеры с использованием ObjectARX и .NET создания и манипулирования фильтрами слоёв. Простейший способ для того, чтобы узнать выражение фильтра слоёв – это создать его средствами AutoCAD и использовать этот код для поиска фильтра слоёв. Это можно затем использовать в коде для создания нового фильтра слоёв.ObjectARX :
Код - C++: [Выделить]
- Acad::ErrorStatus es = Acad::eOk;
 - AcDbDatabase *pDb =
 - acdbHostApplicationServices()->workingDatabase();
 - AcLyLayerFilterManager *pLayerFilterManager =
 - aclyGetLayerFilterManager(pDb);
 - AcLyLayerFilter *pRoot = NULL;
 - AcLyLayerFilter *pCurrent = NULL;
 - es = pLayerFilterManager->getFilters(pRoot, pCurrent);
 - if(es != Acad::eOk)
 - return;
 - if(pRoot != NULL)
 - {
 - AcArray<AcLyLayerFilter *> filters;
 - filters = pRoot->getNestedFilters();
 - // Печатаем информацию о корневом фильтре
 - acutPrintf
 - (
 - ACRX_T("\n(Корневой) Имя : %s Выражение : %s"),
 - pRoot->name(),
 - pRoot->filterExpression()
 - );
 - // Печатаем информацию о всех фильтрах
 - for(int i=0; i < filters.length();i++)
 - {
 - acutPrintf
 - (
 - ACRX_T("\nИмя : %s Выражение : %s"),
 - filters.at(i)->name(),
 - filters.at(i)->filterExpression()
 - );
 - }
 - // Выводим информацию о текущем фильтре
 - if(pCurrent != NULL)
 - {
 - acutPrintf
 - (
 - ACRX_T("\n(Текущий) Имя : %s Выражение : %s"),
 - pCurrent->name(),
 - pCurrent->filterExpression()
 - );
 - }
 - // Создаём и добавляем новый фильтр слоев
 - AcLyLayerFilter *pMyLyFilter = new AcLyLayerFilter();
 - pMyLyFilter->setName(ACRX_T("MyLyFilter"));
 - pMyLyFilter->setFilterExpression(ACRX_T("NAME == \"*Test*\""));
 - es = pRoot->addNested(pMyLyFilter);
 - es = pLayerFilterManager->setFilters(pRoot, pMyLyFilter);
 - delete pRoot;
 - }
 
AutoCAD .Net API :
Код - C#: [Выделить]
- using Autodesk.AutoCAD.LayerManager;
 - [CommandMethod("CreateLayerFilter")]
 - public void CreateLayerFilter()
 - {
 - Document doc
 - = Application.DocumentManager.MdiActiveDocument;
 - Database db = doc.Database;
 - Editor ed = doc.Editor;
 - LayerFilterTree filterTree = db.LayerFilters;
 - LayerFilterCollection filters
 - = filterTree.Root.NestedFilters;
 - // Выводим информацию о корневом фильтре
 - ed.WriteMessage
 - (
 - String.Format("\n(Корневой) Имя : {0} Выражение : {1}",
 - db.LayerFilters.Root.Name,
 - db.LayerFilters.Root.FilterExpression)
 - );
 - // Выводим информацию о всех фильтрах
 - foreach(LayerFilter f in filters)
 - {
 - ed.WriteMessage
 - (
 - String.Format("\nИмя : {0} Выражение : {1}",
 - f.Name,
 - f.FilterExpression)
 - );
 - }
 - // Выводим информацию о текущем фильтре
 - if(db.LayerFilters.Current != null)
 - {
 - ed.WriteMessage
 - (
 - String.Format("\n(Текущий) Имя : {0} Выражение : {1}",
 - db.LayerFilters.Current.Name,
 - db.LayerFilters.Current.FilterExpression)
 - );
 - }
 - // Создаём новый фильтр слоёв
 - LayerFilter layerFilter = new LayerFilter();
 - layerFilter.Name = "MyLyFilter";
 - layerFilter.FilterExpression = "NAME == \"*Test*\"";
 - filters.Add(layerFilter);
 - // Устанавливаем изменённые фильтры для базы данных
 - db.LayerFilters = filterTree;
 - }
 
Источник: 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