Есть ли возможность переноса Extension Dictionary при создании копии объекта?

Автор Тема: Есть ли возможность переноса Extension Dictionary при создании копии объекта?  (Прочитано 9196 раз)

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

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

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Здравствуйте!
Есть потребность сохранять некоторую дополнительную информацию об объекте чертежа. Эту информацию я использую для отрисовки дополнительной геометрии объекта. Раньше использовал для этого XData и все было хорошо. Но недавно понадобилось добавить информации и есть риск, что размеров XData может не хватить. Переделал механизм сохранения-извлечения информации на использование Xrecord и ExtensionDictionary.
О том, что есть такая проблема с копированием объекта знал и был готов к ней - рассчитывал, при необходимости, побороть ее с помощью реакторов копирования объектов (благо, с ними недавно очень плотно имел дело). Но, как выяснилось, копии объекта создаются не только для копирования его в пределах базы данных чертежа или между ними. В частности, копия объекта создается для Jig. Эта копия перенимает XData объекта, но не перенимает Extension Dictionary оригинала, что неудивительно. Но при этом, она не добавляется ни к какой базе чертежа, то есть, его свойства: Database = null, Id = ObjectId.Null. Это сильно усложняет задачу сохранения переопределенной отрисовки объекта!
Пока мне это не сильно критично, но на всякий случай хочу поинтересоваться - нет ли какой-то заложенной в API возможности смены режима создания копии объекта с Extension Dictionary?  (эдакий волшебный тумблер :) ) Есть же, например, метод DBObject.SwapIdWith, в котором значениями аргументов можно управлять перенесутся или нет XData и Extension Dictionary.
P.S. Опыты в AutoCAD2014 и 2015 показали, что при использовании команды _COPY, Extension Dictionary переносится в копию. Если же выполнять копирование через буфер - не переносится. XData же переносится в обоих случаях.
« Последнее редактирование: 29-10-2014, 18:27:40 от Загорулькин Дмитрий »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Пока мне это не сильно критично, но на всякий случай хочу поинтересоваться - нет ли какой-то заложенной в API возможности смены режима создания копии объекта с Extension Dictionary?
Нет. И это очевидно. XData хранится вместе с самим объектом, а Extension Dictionary отдельно в другом объекте, на который ссылается только его ObjectId.

Это сильно усложняет задачу сохранения переопределенной отрисовки объекта!
Читал уже: http://adndevblog.typepad.com/autocad/2013/10/accessing-extension-dictionary-of-an-overruled-entity-while-dragging.html ?
P.S. Опыты в AutoCAD2014 и 2015 показали, что при использовании команды _COPY, Extension Dictionary переносится в копию. Если же выполнять копирование через буфер - не переносится. XData же переносится в обоих случаях.
Странно. На днях пробовал копирование через буфер обмена - у меня работало, т.е. Extension Dictionary вместе со всеми XRecord переносилось в новый чертеж). Нужно перепроверить.

P.S.: Перепроверил - работает. Проще всего (чтобы не писать никаких программ) можно воспользоваться ARXDBG. В нём есть команда TESTEXTDICTADD для тестового добавления ExtDict и команда SNOOPENTS для просмотра свойств примитивов:
1) Рисуешь отрезок
2) запускаешь TESTEXTDICTADD
3) Запускаешь SNOOPENTS и убеждаешься что ExtDict есть.
4) Команда  _COPYCLIP
5) Создаешь новый чертеж и в нём _PASTECLIP
6) Запускаешь SNOOPENTS и смотришь есть ли  ExtDict. Должна быть.
« Последнее редактирование: 29-10-2014, 23:20:51 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Читал уже: http://adndevblog.typepad.com/autocad/2013/10/accessing-extension-dictionary-of-an-overruled-entity-while-dragging.html ?
Нет, спасибо, буду изучать!
P.S.: Перепроверил - работает. Проще всего (чтобы не писать никаких программ) можно воспользоваться ARXDBG. В нём есть команда TESTEXTDICTADD для тестового добавления ExtDict и команда SNOOPENTS для просмотра свойств примитивов:
1) Рисуешь отрезок
2) запускаешь TESTEXTDICTADD
3) Запускаешь SNOOPENTS и убеждаешься что ExtDict есть.
4) Команда  _COPYCLIP
5) Создаешь новый чертеж и в нём _PASTECLIP
6) Запускаешь SNOOPENTS и смотришь есть ли  ExtDict. Должна быть.
Ха! В таком варианте действительно работает! А знаете, в чем проблема? У меня есть вложенные словари, а внутри них - моя Xrecord. А при копировании через буфер переносятся только данные "корневой" вложенности.
https://screencast.autodesk.com/main/details/9c182f1f-6bea-44bb-8ddd-63115e3ca279
P.S. То же самое происходит со словарем, если выполнить экспорт чертежа из Civil в обычный AutoCAD. Поэтому, придется приложить файл с Civil'овским "мусором".
« Последнее редактирование: 30-10-2014, 10:41:59 от Загорулькин Дмитрий »

Отмечено как Решение Александр Ривилис 30-10-2014, 11:23:19

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ха! В таком варианте действительно работает! А знаете, в чем проблема? У меня есть вложенные словари, а внутри них - моя Xrecord. А при копировании через буфер переносятся только данные "корневой" вложенности.
Внимательно изучай: DBDictionary.TreatElementsAsHard - должно помочь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да! Вот она кнопочка волшебная!  ;D
Большущее Вам спасибо и за ссылку на пример из блога и за подсказку нужной настройки!

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я вот не понимаю совершенно глубокого смысла вот этой конструкции (это из adndevblog кода):
Код - C# [Выбрать]
  1. public class HelperClass
  2. {
  3.     private static HelperClass _instance;
  4.    
  5.     protected HelperClass()
  6.     {
  7.     }
  8.  
  9.     public static HelperClass GetSingleton
  10.     {
  11.         get
  12.         {
  13.             if (_instance == null)
  14.             {
  15.                 _instance = new HelperClass();
  16.             }
  17.             return _instance;
  18.         }
  19.     }
  20. }
По идее, вместо "одиночки" здесь больше уместен статический класс. Или я чего-то не учитываю?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Поэкспериментируй. Принципиальной разницы здесь я не вижу. Возможно это переделанный код, в котором такой код имел какой-то смысл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Потестировал: что статический, что одиночка - разницы нет. Зато, всплыл другой момент.
Вся идея, заложенная в коде из блога основывается на том, что после вызова TransformOverrule вызывается DrawableOverrule того же самого объекта. Как показывают опыты - это так и есть во всех случаях, кроме "моего любимого": копирование-вставка из буфера обмена :) Проверял так:
https://screencast.autodesk.com/main/details/5ec69fc8-05e5-40b3-b3e3-0bafc2e8dfd3
Чтобы это побороть, нужно как-то фиксировать коллекцию данных объектов, для которых вызывался CloneMeForDragging. Но как в этой коллекции найти данные того объекта, который отрисовывается в текущий момент? Ведь в методе WorldDraw используется копия объекта, которая не имеет ни Handle, ни ObjectId. Как вариант, конечно, можно Handle дублировать в XData... В общем, надо допиливать как-то.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Все в порядке, идея оказалась верна!
Просто при вставке из буфера не происходит копирования объекта для временного отображения при перетаскивании, то есть, метод CloneMeForDragging не отрабатывает. При этом, в DrawableOverrule передаются нормальные объекты (которые имеют Extension Dictionary), а не их копии. Поэтому, достаточно добавить в метод WorldDraw класса CMyDrawableOverrule вот это:
Код - C# [Выбрать]
  1. if (line.ExtensionDictionary != ObjectId.Null)
  2.             HelperClass.GetSingleton.CaptureXRecordData(line);
Добавить нужно после
Код - C# [Выбрать]
  1. if (line == null)
  2.             return true;

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Напиши автору в комментариях. Думаю что это будет полезно не только ему.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Написал... Вроде. Там как-то не по-человечески система комментариев работает, я так и не понял - прошел мой комментарий или нет, хотя пробовал отправить дважды. Там комментарии появляются после одобрения автором, что ли?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Там комментарии появляются после одобрения автором, что ли?
Вообще-то сразу. И поэтому у тебя их сразу два. Для убедительности. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Странно... Я из 3-х разных браузеров никаких комментариев не вижу :(
Видать, это из-за "порезанного" интернета на рабочем месте.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Странно... Я из 3-х разных браузеров никаких комментариев не вижу :(
Видать, это из-за "порезанного" интернета на рабочем месте.
На всякий случай:
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
т.е. Extension Dictionary вместе со всеми XRecord переносилось в новый чертеж
К XData это тоже относится?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
XData является частью объекта, поэтому, XData объекта присутствует в любой его копии, даже если копируется в другой чертеж.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
XData является частью объекта, поэтому, XData объекта присутствует в любой его копии, даже если копируется в другой чертеж.
Отлично. Буду пробовать