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

ADN Club => AutoCAD .NET API => Тема начата: Lemieux от 12-06-2022, 12:03:15

Название: Клонирование
Отправлено: Lemieux от 12-06-2022, 12:03:15
Всех приветствую.
А кто-то может объяснить разницу между Clone, DeepClone, WblockClone? Я экспериментировал и не понял в чём отличие, кроме того, что у Clone на одну строчку кода больше. Экспериментировал с копированием объектов из одного блока в другой.
Название: Re: Клонирование
Отправлено: Александр Ривилис от 12-06-2022, 12:20:55
Clone - клонирует простые объекты. Клон образуется в памяти. Нельзя клонировать сложные типа 2D/3D-полилинии, блоки с атрибутами  и т.д.
DeepClone - клонирует сложные объекты. Результат сразу помещается в ту же базу, из которой источник.
WblockClone - тоже, что и DeepClone, но позволяет клонировать в другую базу.
Вообще же это всё описано в документации.
Название: Re: Клонирование
Отправлено: Lemieux от 12-06-2022, 13:00:32
Clone - клонирует простые объекты. Клон образуется в памяти. Нельзя клонировать сложные типа 2D/3D-полилинии, блоки с атрибутами  и т.д.
Я сейчас проверил, Clone копирует описания блоков из блока в другой блок. Только код отличается (xtBlock это BlockTableRecord).

Код - C# [Выбрать]
  1. Entity entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity;
  2. Entity cloneEntity = entity.Clone() as Entity;
  3. xtBlock.AppendEntity(cloneEntity);
  4. transaction.AddNewlyCreatedDBObject(cloneEntity, true);

Код - C# [Выбрать]
  1. Entity entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity;
  2. DBObject cloneEntity = entity.WblockClone(xtBlock, new IdMapping(), true);
  3. transaction.AddNewlyCreatedDBObject(cloneEntity, true);
Название: Re: Клонирование
Отправлено: Александр Ривилис от 12-06-2022, 13:19:24
Я сейчас проверил, Clone копирует описания блоков из блока в другой блок.
В твоём коде копируется примитив из блока в блок, а не описание блока.
Название: Re: Клонирование
Отправлено: Александр Ривилис от 12-06-2022, 13:23:51
Вообще же правильнее для копирования использовать методы:
Database.DeepCloneObjects (внутри одной базы)
Database.WblockCloneObjects (из базы в базу)
Они обеспечивают наиболее полное копирование.
Название: Re: Клонирование
Отправлено: Lemieux от 12-06-2022, 13:39:06
Я сменил отметку решения, жаль нельзя поставить на два поста, есть над чем подумать.
Название: Re: Клонирование
Отправлено: Lemieux от 14-06-2022, 14:27:21
Была задача скопировать динамические блоки из одного описания блока в другой. Для этого подошло только database.DeepCloneObjects.
Если использовать Clone, то копируется только вставка блока и он перестаёт быть динамическим. Если использовать DeepClone, то динамические атрибуты остаются, но при этом, если в блоке изменять простой атрибут, то значение атрибута изменяется и в родительском блоке.
Название: Re: Клонирование
Отправлено: Александр Ривилис от 14-06-2022, 19:29:55
Lemieux,
Именно поэтому я и написал, что рекомендуемые методы - DeepCloneObjects и WblockCloneObjects
Название: Re: Клонирование
Отправлено: Lemieux от 15-06-2022, 07:46:30
Именно поэтому я и написал, что рекомендуемые методы - DeepCloneObjects и WblockCloneObjects
Сначала ничего не предвещало беды :)