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://adn-cis.org/forum/index.php?topic=98.0
Отредактировано 15.06.2013 в 15:40:01