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

05/08/2015

Как удалить полностью словарь расширения (ExtDict) примитива?

Вопрос:
Как удалить полностью словарь расширения (ExtDict) примитива?

Ответ:
В статье О методе AcDbObject::releaseExtensionDictionary описано как и для чего использовать этот метод. Однако для того, чтобы воспользоваться эти методом следует сначала очистить (т.е. удалить все элементы) словаря расширения. Следующий код показывает, как это сделать и результаты его работы:

Код - C++: [Выделить]
  1. static void ExtDict () {
  2.  
  3.   Acad::ErrorStatus es;
  4.   ads_name en; ads_point p;
  5.   if (acedEntSel(_T("\nВыберите примитив со словарём расширения: "),en,p) != RTNORM)
  6.     return;
  7.   AcDbObjectId eId; acdbGetObjectId(eId, en);
  8.   AcDbEntityPointer pEnt(eId, AcDb::kForRead);
  9.   if (pEnt.openStatus() == Acad::eOk) {
  10.     AcDbObjectId idExtDict = pEnt->extensionDictionary();
  11.     if (idExtDict.isNull() || idExtDict.isErased()) {
  12.       acutPrintf(_T("\nУ примитива нет словаря расширения!"));
  13.       return;
  14.     }
  15.     AcDbDictionaryPointer pDict(idExtDict, AcDb::kForWrite);
  16.     if (pDict.openStatus() == Acad::eOk) {
  17.       AcDbDictionaryIterator *pIter = pDict->newIterator();
  18.       AcStringArray keys; keys.setPhysicalLength(pDict->numEntries()+1);
  19.       // Получаем все имена ключей в словаре
  20.       for (; !pIter->done(); pIter->next()) {
  21.         keys.append(pIter->name());
  22.       }
  23.       delete pIter;
  24.       // Удаляем все имена ключей в словаре
  25.       for (int i = 0; i < keys.length(); i++) {
  26.         pDict->remove(keys[i]);
  27.       }
  28.       // Закрываем словарь, так как releaseExtensionDictionary
  29.       // требует чтобы он был закрыт
  30.       pDict->close();
  31.     }
  32.     if (pEnt->upgradeOpen() == Acad::eOk) {
  33.       es = pEnt->releaseExtensionDictionary();
  34.       if (es != Acad::eOk) {
  35.         acutPrintf(_T("\nОшибка releaseExtensionDictionary() = %s"),
  36.           acadErrorStatusText(es));
  37.       }
  38.     }
  39.   }
  40. }

 

До удаления словаря расширения:

 

После удаления:

 

Автор: Александр Ривилис

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

Опубликовано 05.08.2015
Отредактировано 10.08.2015 в 19:29:07