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

05/08/2015

О методе AcDbObject::releaseExtensionDictionary

В чем разница между вызовом метода erase() непосредственно для словаря расширения (extension dictionary) и вызовом releaseExtensionDictionary() для объекта-владельца?

Это API предоставлено для возможности полного удаления словаря расширения объекта. Этот метод позволяет создавать полностью новый словарь расширения вместо того, чтобы очищать существующий в текущей сессии редактирования  чертежа.

Фундаментальное различие между вызовом releaseExtensionDictionary() для родительского объекта и вызовом erase() для словаря расширения становится совершенно очевидным если посмотреть на результаты вызова двух других методов работы со словарём расширения: extensionDictionary и createExtensionDictionary. Рассмотрим следующие две последовательности:

(Мы подразумеваем, что pO инициализирован указателем на корректный  объект, содержащийся в базе и открытый для записи, имеющий словарь расширения. У нас также есть корректный указатель pED на словарь расширения, открытый для записи.)

1.

Код - C++: [Выделить]
  1. pO->releaseExtensionDictionary(); // возвращает Acad::eOk
  2. pO->extensionDictionary(); // возвращает AcDbObjectId::kNull
  3. pO->createExtensionDictionary(); // возвращает Acad::eOk

2.

Код - C++: [Выделить]
  1. pED->erase(); // возвращает Acad::eOk
  2. pO->extensionDictionary(); // возвращает корректный AcDbObjectId
  3. pO->createExtensionDictionary(); // возвращает ошибку: eAlreadyInDatabase

Другими словами вызов erase() для словаря расширения не разрывает связи между объектом и его словарём расширения.  Вы можете получить доступ к его словарю и позднее и даже восстановить (unerase)  его. Отметим, что если вы сохраните базу данных, то удалённый словарь расширения не будет сохранён и будет возвращен AcDbObject::kNull при вызове extensionDictionary() в сохранённой базе.

releaseExtensionDictionary не только удаляет словарь расширения, но и разрывает связь между объектом и его словарям расширения.

Источник: http://adndevblog.typepad.com/autocad/2013/01/about-acdbobjectreleaseextensiondictionary.html

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

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

Опубликовано 05.08.2015