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

30/05/2013

Удаление фильтров слоёв при помощи ObjectARX

Вопрос:

У меня есть клиент, который использует множество dwg-файлов с множеством фильтров слоёв. Как можно удалить эти фильтры с помощью программы?

Ответ:

Фильтры слоёв – это объекты типа AcDbXRecord в двух словарях (с именами ACAD_LAYERFILTERS и ACLYDICTIONARY) содержащихся в расширенном словаре таблицы слоёв. Чтобы удалить фильтры слоёв, вам необходимо пройтись по словарям ACAD_LAYERFILTERS и ACLYDICTIONARY и удалить все AcDbXRecord.

Следующий код открывает фиктивный чертеж и удаляет все фильтры слоёв внутри чертежа:

Код - C++: [Выделить]
  1. static void ASDKLayerFilterDelete_DeleteLayerFilters(void)
  2. {
  3.   // Устанавливаем параметр конструктора в kFalse чтобы база чертежа
  4.   // была создана пустой. Это для того, чтобы потом в неё
  5.   // можно было прочитать из файла.
  6.   AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
  7.  
  8.   // Функция AcDbDatabase::readDwgFile() автоматически
  9.   // добавляет расширение DWG к имени файла, если оно не задано
  10.   // в имени файла.
  11.   pDb->readDwgFile(_T("c:\\Чертеж1.dwg"));
  12.   // Убедимся что весь чертеж прочитан
  13.   pDb->closeInput(true);
  14.  
  15.   // Получаем таблицу слоёв
  16.   AcDbLayerTablePointer pLyrTbl(pDb->layerTableId(), AcDb::kForRead);
  17.   if (pLyrTbl.openStatus() == Acad::eOk)
  18.   {
  19.     // Получаем расширенный словарь
  20.     AcDbObjectId pExtDicId = pLyrTbl->extensionDictionary();
  21.  
  22.     if(pExtDicId.isValid())
  23.     {        
  24.       AcDbDictionaryPointer pDict(pExtDicId,AcDb::kForRead);
  25.       if(Acad::eOk == pDict.openStatus())
  26.       {
  27.         // Получаем словарь фильтров слоёв из расширенного словаря
  28.         AcDbObjectId pObjId;
  29.         pDict->getAt(_T("ACAD_LAYERFILTERS"),pObjId);
  30.  
  31.         if(pObjId.isValid())
  32.         {
  33.           AcDbDictionaryPointer pFiltDict(pObjId,AcDb::kForRead);
  34.  
  35.           if(Acad::eOk == pFiltDict.openStatus())
  36.           {
  37.             // Получение объектов в словаре фильтров слоёв
  38.             AcDbObjectId filtObjId;
  39.             AcDbDictionaryIterator *pItr = pFiltDict->newIterator();
  40.             if (NULL != pItr)
  41.             {
  42.               for(;!pItr->done();pItr->next())
  43.               {
  44.                 AcDbObjectPointer<AcDbXrecord> pLyrFltr(pItr->objectId(),AcDb::kForWrite);
  45.                 if(Acad::eOk == pLyrFltr.openStatus())
  46.                 {
  47.                   pLyrFltr->erase();
  48.                 }
  49.               }
  50.               delete pItr;
  51.             }
  52.           }
  53.         }    
  54.  
  55.         pDict->getAt(_T("ACLYDICTIONARY"),pObjId);
  56.  
  57.  
  58.         if(pObjId.isValid())
  59.         {
  60.           AcDbDictionaryPointer pFiltDict(pObjId,AcDb::kForRead);
  61.           if(Acad::eOk == pFiltDict.openStatus())
  62.           {
  63.             // Получаем объекты из словаря фильтров слоёв
  64.             AcDbObjectId filtObjId;
  65.  
  66.             AcDbDictionaryIterator *pItr = pFiltDict->newIterator();
  67.             if(NULL != pItr)
  68.             {
  69.               for(;!pItr->done();pItr->next())
  70.               {
  71.                 AcDbObjectPointer<AcDbXrecord> pLyrFltr(pItr->objectId(),AcDb::kForWrite);
  72.                 if(Acad::eOk == pLyrFltr.openStatus())
  73.                 {
  74.                   pLyrFltr->erase();
  75.                 }       
  76.               }
  77.               delete pItr;
  78.             }
  79.           }    
  80.         }
  81.       }
  82.     }  
  83.   } 
  84.  
  85.   Acad::ErrorStatus es = pDb->saveAs(_T("c:\\Чертеж1.dwg"));
  86.   delete pDb; 
  87. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/04/delete-layer-filters-using-objectarx.html

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

Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 02:38:57