Получение копий сложных объектов без помещения их в базу
Используя ObjectARX вы можете создать копию одиночного простого объекта без помещения в базу при помощи методов clone() или copyFrom(). Но эти два метода не работают со сложными объектами, такими как AcDbBlockReference (вставка блока) с AcDbAttribute (атрибут). Как описано в документации, метод clone() вызывает метод copyFrom(), который делает поверхностную копию объекта. Другими словами, эти методы не копируют объекты атрибутов (AcDbAttribute). И не существует прямого метода в ObjectARX чтобы получить полную копию сложного объекта.
Решением будет копировать каждый объект индивидуально, а затем прикрепить каждый новый атрибут к объекту вставки блока. Будьте внимательны с специальным случаем, когда блок содержит константные определения атрибутов. Эти атрибуты не порождают атрибутов вставки блока и соответственно их не нужно копировать.
Если же вам нужна копия в базе такого сложного объекта, не используйте метод deepClone() непосредственно: вы должны использовать метод AcDbDatabase::deepCloneObjects(), передав AcDbObjectId вставки блока в аргументе-массиве. Так как метод deepCloneObjects() учитывает связи AcDbHardOwnerShipId и AcDbHardPointerId, то атрибуты блока будут скопированы автоматически.
Обсуждение: http://adn-cis.org/forum/index.php?topic=368
Опубликовано 02.12.2013