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

02/12/2013

Получение копий сложных объектов без помещения их в базу

Используя ObjectARX вы можете создать копию одиночного простого объекта без помещения в базу при помощи методов clone() или copyFrom(). Но эти два метода не работают со сложными объектами, такими как AcDbBlockReference (вставка блока) с AcDbAttribute (атрибут). Как описано в документации, метод clone() вызывает  метод copyFrom(), который делает поверхностную копию объекта. Другими словами, эти методы не копируют объекты атрибутов (AcDbAttribute). И не существует прямого метода в ObjectARX чтобы получить полную копию сложного объекта.

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

Если же вам нужна копия в базе такого сложного объекта, не используйте метод deepClone() непосредственно: вы должны использовать метод AcDbDatabase::deepCloneObjects(), передав AcDbObjectId вставки блока в аргументе-массиве. Так как метод deepCloneObjects() учитывает связи AcDbHardOwnerShipId и AcDbHardPointerId, то атрибуты блока будут скопированы автоматически.

Источник: http://adndevblog.typepad.com/autocad/2012/07/making-a-non-database-resident-copy-of-a-complex-object.html

 

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

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