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

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 29-10-2014, 17:59:07

Название: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 29-10-2014, 17:59:07
Здравствуйте!
Есть потребность сохранять некоторую дополнительную информацию об объекте чертежа. Эту информацию я использую для отрисовки дополнительной геометрии объекта. Раньше использовал для этого 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 же переносится в обоих случаях.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Ривилис от 29-10-2014, 22:54:42
Пока мне это не сильно критично, но на всякий случай хочу поинтересоваться - нет ли какой-то заложенной в 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. Должна быть.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 30-10-2014, 10:22:38
Читал уже: 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'овским "мусором".
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Ривилис от 30-10-2014, 11:09:24
Ха! В таком варианте действительно работает! А знаете, в чем проблема? У меня есть вложенные словари, а внутри них - моя Xrecord. А при копировании через буфер переносятся только данные "корневой" вложенности.
Внимательно изучай: DBDictionary.TreatElementsAsHard - должно помочь.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 30-10-2014, 11:21:37
Да! Вот она кнопочка волшебная!  ;D
Большущее Вам спасибо и за ссылку на пример из блога и за подсказку нужной настройки!
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 30-10-2014, 14:36:20
Я вот не понимаю совершенно глубокого смысла вот этой конструкции (это из 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. }
По идее, вместо "одиночки" здесь больше уместен статический класс. Или я чего-то не учитываю?
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Ривилис от 30-10-2014, 14:44:35
Поэкспериментируй. Принципиальной разницы здесь я не вижу. Возможно это переделанный код, в котором такой код имел какой-то смысл.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 30-10-2014, 15:26:53
Потестировал: что статический, что одиночка - разницы нет. Зато, всплыл другой момент.
Вся идея, заложенная в коде из блога основывается на том, что после вызова TransformOverrule вызывается DrawableOverrule того же самого объекта. Как показывают опыты - это так и есть во всех случаях, кроме "моего любимого": копирование-вставка из буфера обмена :) Проверял так:
https://screencast.autodesk.com/main/details/5ec69fc8-05e5-40b3-b3e3-0bafc2e8dfd3
Чтобы это побороть, нужно как-то фиксировать коллекцию данных объектов, для которых вызывался CloneMeForDragging. Но как в этой коллекции найти данные того объекта, который отрисовывается в текущий момент? Ведь в методе WorldDraw используется копия объекта, которая не имеет ни Handle, ни ObjectId. Как вариант, конечно, можно Handle дублировать в XData... В общем, надо допиливать как-то.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 30-10-2014, 16:48:23
Все в порядке, идея оказалась верна!
Просто при вставке из буфера не происходит копирования объекта для временного отображения при перетаскивании, то есть, метод 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;
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Ривилис от 30-10-2014, 17:59:21
Напиши автору в комментариях. Думаю что это будет полезно не только ему.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 31-10-2014, 11:17:27
Написал... Вроде. Там как-то не по-человечески система комментариев работает, я так и не понял - прошел мой комментарий или нет, хотя пробовал отправить дважды. Там комментарии появляются после одобрения автором, что ли?
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Ривилис от 31-10-2014, 14:47:23
Там комментарии появляются после одобрения автором, что ли?
Вообще-то сразу. И поэтому у тебя их сразу два. Для убедительности. :)
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 31-10-2014, 16:30:02
Странно... Я из 3-х разных браузеров никаких комментариев не вижу :(
Видать, это из-за "порезанного" интернета на рабочем месте.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Ривилис от 31-10-2014, 17:48:08
Странно... Я из 3-х разных браузеров никаких комментариев не вижу :(
Видать, это из-за "порезанного" интернета на рабочем месте.
На всякий случай:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F3312%2F7842324.2%2F0_eb6bc_aca36dfa_orig.png&hash=9c491d3059f43de9b7ea7df7db883a81) (http://img-fotki.yandex.ru/get/5800/7842324.2/0_eb6bb_bda0dc7c_orig.png) 
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Пекшев aka Modis от 22-05-2017, 14:34:54
т.е. Extension Dictionary вместе со всеми XRecord переносилось в новый чертеж
К XData это тоже относится?
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Дмитрий Загорулькин от 22-05-2017, 15:35:39
XData является частью объекта, поэтому, XData объекта присутствует в любой его копии, даже если копируется в другой чертеж.
Название: Re: Есть ли возможность переноса Extension Dictionary при создании копии объекта?
Отправлено: Александр Пекшев aka Modis от 22-05-2017, 15:40:48
XData является частью объекта, поэтому, XData объекта присутствует в любой его копии, даже если копируется в другой чертеж.
Отлично. Буду пробовать