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

14/06/2013

AcDb::ePermanentlyErased при открытии клонированных методом wblock объектов внутри одного DWG

Вопрос:
Возможно ли открыть клонированные объекты в реакторах AcEditorReactor::beginDeepCloneXlation() или AcEditorReactor::endDeepClone() если выполняется ПБЛОК (WBLOCK) внутри одного dwg-файла?

Попытка открыть их в AcEditorReactor::beginDeepCloneXlation() или endDeepClone(), приводит к получению кода возврата "ePermanentlyErased". Нам требуется доступ к ним в режиме kForWrite для дополнительной обработки.

Ответ:
Проблема связана с тем, что в контексте операции wblock внутри одного чертежа, AutoCAD выполняет «быструю» операцию wblock, что означает, что AutoCAD в действительности не клонирует объекты, а симулирует эту операцию т.к. целью является сохранить клоны в файл. Чтобы предотвратить возможность модификации клонированных объектов (т.к. и клон и оригинальный объект – это один и тот же объект) AutoCAD возвращает код ошибки "ePermanentlyErased" когда приложение пытается открыть и модифицировать клон.

Есть два варианта, чтобы открыть клонированный объект:
Первый – открыть оригинальный объект вместо клона и считать информацию из него. Но если вы хотите его модифицировать, помните, что и исходный и клонированный объект будут изменены.

Второй вариант – это запретить механизм «быстрого» wblock при помощи вызова AcDbDatabase::forceWblockDatabaseCopy(). Сделав это мы заставим AutoCAD создать реальные клоны объектов. Тогда вы сможете открыть и изменить объекты-клоны и только их. Посмотрите в файле справки описание использования метода forceWblockDatabaseCopy()

Источник: http://adndevblog.typepad.com/autocad/2013/03/acdbepermanentlyerased-when-open-cloned-object-during-wblock-entire-dwg.html

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

Опубликовано 14.06.2013
Отредактировано 15.06.2013 в 15:40:01