Клонирование

Автор Тема: Клонирование  (Прочитано 9811 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 393
  • Карма: 21
Клонирование
« : 12-06-2022, 12:03:15 »
Всех приветствую.
А кто-то может объяснить разницу между Clone, DeepClone, WblockClone? Я экспериментировал и не понял в чём отличие, кроме того, что у Clone на одну строчку кода больше. Экспериментировал с копированием объектов из одного блока в другой.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование
« Ответ #1 : 12-06-2022, 12:20:55 »
Clone - клонирует простые объекты. Клон образуется в памяти. Нельзя клонировать сложные типа 2D/3D-полилинии, блоки с атрибутами  и т.д.
DeepClone - клонирует сложные объекты. Результат сразу помещается в ту же базу, из которой источник.
WblockClone - тоже, что и DeepClone, но позволяет клонировать в другую базу.
Вообще же это всё описано в документации.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 393
  • Карма: 21
Re: Клонирование
« Ответ #2 : 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);

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование
« Ответ #3 : 12-06-2022, 13:19:24 »
Я сейчас проверил, Clone копирует описания блоков из блока в другой блок.
В твоём коде копируется примитив из блока в блок, а не описание блока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Lemieux 12-06-2022, 13:38:15

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование
« Ответ #4 : 12-06-2022, 13:23:51 »
Вообще же правильнее для копирования использовать методы:
Database.DeepCloneObjects (внутри одной базы)
Database.WblockCloneObjects (из базы в базу)
Они обеспечивают наиболее полное копирование.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 393
  • Карма: 21
Re: Клонирование
« Ответ #5 : 12-06-2022, 13:39:06 »
Я сменил отметку решения, жаль нельзя поставить на два поста, есть над чем подумать.

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 393
  • Карма: 21
Re: Клонирование
« Ответ #6 : 14-06-2022, 14:27:21 »
Была задача скопировать динамические блоки из одного описания блока в другой. Для этого подошло только database.DeepCloneObjects.
Если использовать Clone, то копируется только вставка блока и он перестаёт быть динамическим. Если использовать DeepClone, то динамические атрибуты остаются, но при этом, если в блоке изменять простой атрибут, то значение атрибута изменяется и в родительском блоке.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование
« Ответ #7 : 14-06-2022, 19:29:55 »
Lemieux,
Именно поэтому я и написал, что рекомендуемые методы - DeepCloneObjects и WblockCloneObjects
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LemieuxАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 393
  • Карма: 21
Re: Клонирование
« Ответ #8 : 15-06-2022, 07:46:30 »
Именно поэтому я и написал, что рекомендуемые методы - DeepCloneObjects и WblockCloneObjects
Сначала ничего не предвещало беды :)