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