05/08/2015
Как удалить полностью словарь расширения (ExtDict) примитива?
Вопрос:
Как удалить полностью словарь расширения (ExtDict) примитива?
Ответ:
В статье О методе AcDbObject::releaseExtensionDictionary описано как и для чего использовать этот метод. Однако для того, чтобы воспользоваться эти методом следует сначала очистить (т.е. удалить все элементы) словаря расширения. Следующий код показывает, как это сделать и результаты его работы:
Код - C++: [Выделить]
- static void ExtDict () {
- Acad::ErrorStatus es;
- ads_name en; ads_point p;
- if (acedEntSel(_T("\nВыберите примитив со словарём расширения: "),en,p) != RTNORM)
- return;
- AcDbObjectId eId; acdbGetObjectId(eId, en);
- AcDbEntityPointer pEnt(eId, AcDb::kForRead);
- if (pEnt.openStatus() == Acad::eOk) {
- AcDbObjectId idExtDict = pEnt->extensionDictionary();
- if (idExtDict.isNull() || idExtDict.isErased()) {
- acutPrintf(_T("\nУ примитива нет словаря расширения!"));
- return;
- }
- AcDbDictionaryPointer pDict(idExtDict, AcDb::kForWrite);
- if (pDict.openStatus() == Acad::eOk) {
- AcDbDictionaryIterator *pIter = pDict->newIterator();
- AcStringArray keys; keys.setPhysicalLength(pDict->numEntries()+1);
- // Получаем все имена ключей в словаре
- for (; !pIter->done(); pIter->next()) {
- keys.append(pIter->name());
- }
- delete pIter;
- // Удаляем все имена ключей в словаре
- for (int i = 0; i < keys.length(); i++) {
- pDict->remove(keys[i]);
- }
- // Закрываем словарь, так как releaseExtensionDictionary
- // требует чтобы он был закрыт
- pDict->close();
- }
- if (pEnt->upgradeOpen() == Acad::eOk) {
- es = pEnt->releaseExtensionDictionary();
- if (es != Acad::eOk) {
- acutPrintf(_T("\nОшибка releaseExtensionDictionary() = %s"),
- acadErrorStatusText(es));
- }
- }
- }
- }
До удаления словаря расширения:
После удаления:
Автор: Александр Ривилис
Отредактировано 10.08.2015 в 19:29:07
Обсуждение: http://adn-cis.org/forum/index.php?topic=2899
Опубликовано 05.08.2015Отредактировано 10.08.2015 в 19:29:07