30/05/2013
Удаление фильтров слоёв при помощи ObjectARX
Вопрос:
У меня есть клиент, который использует множество dwg-файлов с множеством фильтров слоёв. Как можно удалить эти фильтры с помощью программы?
Ответ:
Фильтры слоёв – это объекты типа AcDbXRecord в двух словарях (с именами ACAD_LAYERFILTERS и ACLYDICTIONARY) содержащихся в расширенном словаре таблицы слоёв. Чтобы удалить фильтры слоёв, вам необходимо пройтись по словарям ACAD_LAYERFILTERS и ACLYDICTIONARY и удалить все AcDbXRecord.
Следующий код открывает фиктивный чертеж и удаляет все фильтры слоёв внутри чертежа:
Код - C++: [Выделить]
- static void ASDKLayerFilterDelete_DeleteLayerFilters(void)
- {
- // Устанавливаем параметр конструктора в kFalse чтобы база чертежа
- // была создана пустой. Это для того, чтобы потом в неё
- // можно было прочитать из файла.
- AcDbDatabase *pDb = new AcDbDatabase(Adesk::kFalse);
- // Функция AcDbDatabase::readDwgFile() автоматически
- // добавляет расширение DWG к имени файла, если оно не задано
- // в имени файла.
- pDb->readDwgFile(_T("c:\\Чертеж1.dwg"));
- // Убедимся что весь чертеж прочитан
- pDb->closeInput(true);
- // Получаем таблицу слоёв
- AcDbLayerTablePointer pLyrTbl(pDb->layerTableId(), AcDb::kForRead);
- if (pLyrTbl.openStatus() == Acad::eOk)
- {
- // Получаем расширенный словарь
- AcDbObjectId pExtDicId = pLyrTbl->extensionDictionary();
- if(pExtDicId.isValid())
- {
- AcDbDictionaryPointer pDict(pExtDicId,AcDb::kForRead);
- if(Acad::eOk == pDict.openStatus())
- {
- // Получаем словарь фильтров слоёв из расширенного словаря
- AcDbObjectId pObjId;
- pDict->getAt(_T("ACAD_LAYERFILTERS"),pObjId);
- if(pObjId.isValid())
- {
- AcDbDictionaryPointer pFiltDict(pObjId,AcDb::kForRead);
- if(Acad::eOk == pFiltDict.openStatus())
- {
- // Получение объектов в словаре фильтров слоёв
- AcDbObjectId filtObjId;
- AcDbDictionaryIterator *pItr = pFiltDict->newIterator();
- if (NULL != pItr)
- {
- for(;!pItr->done();pItr->next())
- {
- AcDbObjectPointer<AcDbXrecord> pLyrFltr(pItr->objectId(),AcDb::kForWrite);
- if(Acad::eOk == pLyrFltr.openStatus())
- {
- pLyrFltr->erase();
- }
- }
- delete pItr;
- }
- }
- }
- pDict->getAt(_T("ACLYDICTIONARY"),pObjId);
- if(pObjId.isValid())
- {
- AcDbDictionaryPointer pFiltDict(pObjId,AcDb::kForRead);
- if(Acad::eOk == pFiltDict.openStatus())
- {
- // Получаем объекты из словаря фильтров слоёв
- AcDbObjectId filtObjId;
- AcDbDictionaryIterator *pItr = pFiltDict->newIterator();
- if(NULL != pItr)
- {
- for(;!pItr->done();pItr->next())
- {
- AcDbObjectPointer<AcDbXrecord> pLyrFltr(pItr->objectId(),AcDb::kForWrite);
- if(Acad::eOk == pLyrFltr.openStatus())
- {
- pLyrFltr->erase();
- }
- }
- delete pItr;
- }
- }
- }
- }
- }
- }
- Acad::ErrorStatus es = pDb->saveAs(_T("c:\\Чертеж1.dwg"));
- delete pDb;
- }
Источник: 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
Отредактировано 08.06.2013 в 02:38:57