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

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 02-05-2017, 07:58:12

Название: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 02-05-2017, 07:58:12
Всем привет. Хотелось бы поднять эту тему.
В .Net достаточное количество возможностей, чтобы сделать "кастомные" объекты и не использовать при этом ObjectARX. Кто скажет "невозможно", отвечу - возможно! Если погулять по гуглу, то можно найти тему (https://habrahabr.ru/post/154591/) где это уже было реализовано почти 5 лет назад. И реализовано это на основе обычных анонимных блоках. Т.е. если плагин есть - эти объекты работают как "кастомные" - и есть ручки, и свои свойства, и стили, прочие атрибуты. Если открыть чертеж без плагина - эти объекты превращаются в обычные анонимные блоки. И это круто!
Я пробовал тот плагин, что можно найти по ссылке. За исключением некоторых "глюков" работает он отлично. Правда там версия только для 2012 автокада.
Я конечно пробовал декомпилировать (все разработчики на .Net об этом знают), но там такой объем информации, что нужно разбираться неделями (а то и месяцами), если ты не занимаешься кодингом профессионально. Как в моем случае)) Т.е. да - скрывать не буду - мне не хватает ума такое повторить. Хотя частично получалось:

К сожалению, автор той разработки так и не ответил нигде.

Вот у меня и вопрос - кто-нибудь еще подобным занимался? Есть где-нибудь (открытая) информация на эту тему?
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 02-05-2017, 11:59:56
Кастомизация объектов в .NET - это переопределение их поведения с помощью различных Overrule. Для этого есть несколько типов Overrule. Я плотно имел дело с тремя четырьмя из них:
Мне их достаточно во всех случаях.
Примеров и материалов по ним в интернете более чем достаточно. И даже тут на форуме мы не раз их обсуждали.
P.S. Статья, на которую дана ссылка, какая-то сумбурная, несвязная. Я бы поспорил с некоторыми утверждениями автора. Но это не имеет смысла, учитывая, что это 2012 год и что автор, скорее всего, с автокадом имел очень непродолжительное знакомство.
Если уж изучать статьи, то лучше у авторитетных авторов, типа Кина Волмсли: http://through-the-interface.typepad.com/through_the_interface/overrules/
Еще хорошие примеры есть на этом ресурсе: http://spiderinnet1.typepad.com/.services/blog/6a0153928ee38e970b0153928f11cc970b/search?filter.q=overrule
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 02-05-2017, 12:34:44
В .Net достаточное количество возможностей, чтобы сделать "кастомные" объекты и не использовать при этом ObjectARX. Кто скажет "невозможно", отвечу - возможно! Если погулять по гуглу, то можно найти тему где это уже было реализовано почти 5 лет назад. И реализовано это на основе обычных анонимных блоках. Т.е. если плагин есть - эти объекты работают как "кастомные" - и есть ручки, и свои свойства, и стили, прочие атрибуты. Если открыть чертеж без плагина - эти объекты превращаются в обычные анонимные блоки. И это круто!
Бред. Ты путаешь мягкое с теплым. Далеко не всё, что можно сделать в Custom Entity можно сделать в .NET
Хотя частично получалось:
Насколько я помню это можно сделать при помощи обычного динамического блока.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Владимир Шу от 02-05-2017, 14:57:24
ну есть и у меня такие модули, ничего особо сложного в этом нет, код обсуждали тут (http://adn-cis.org/forum/index.php?topic=7251.0),  тут (http://adn-cis.org/forum/index.php?topic=7545.msg24101#msg24101) и тут (http://forum.dwg.ru/showthread.php?p=1607823#post1607823)
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 02-05-2017, 15:03:14
Бред. Ты путаешь мягкое с теплым. Далеко не всё, что можно сделать в Custom Entity можно сделать в .NET
Ну я не спорю, что не все. Но при первом приближении, на мой взгляд, средств .Net достаточно. Возьмем для примера СПДС-модуль и самые распространенные элементы - отметка, сечение, выноска, обозначение узла и т.п. Мне думается, что возможности этих примитивов вполне можно реализовать средствами
Насколько я помню это можно сделать при помощи обычного динамического блока
Можно конечно, не спорю. Смысл был не в реализации конкретного элемента, а в осознании темы "свои примитивы"
ну есть и у меня такие модули, ничего особо сложного в этом нет, код обсуждали тут (http://adn-cis.org/forum/index.php?topic=7251.0),  тут (http://adn-cis.org/forum/index.php?topic=7545.msg24101#msg24101) и тут (http://forum.dwg.ru/showthread.php?p=1607823#post1607823)
Судя по ссылкам - у вас модули, обрабатывающие динамические блоки. Тот пример, что в топике в ссылке (да и в видео) не использует динамических блоков - там все программно создается
Дмитрий Загорулькин, а можете показать видео реализации?
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 02-05-2017, 15:27:23
Дмитрий Загорулькин, а можете показать видео реализации?
В основном, я это делаю с объектами Civil 3D. Показать могу, но вряд ли поймете в чем суть.
Но есть проект, который изменяет стандартные таблицы AutoCAD, добавляя к ним связанные контуры:

И где это используется (интересное начинается с 4:20 и примерно до 6:00):

А это мое "баловство" с окружностями (проверял производительность и возможности):

Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 04-05-2017, 19:37:42
К вопросу, в частности, о DrawableOverrule - я правильно понимаю, что если я сделал переопределение видимости, например, отрезка, то при открытии файла без плагина (создающего переопределение) я буду видеть именно отрезок?
Просто я пытаюсь подойти к изучению вопроса сразу с этого момента - что будет в файле без плагина? Вариант переопределения на основе блока как-раз таки и решает эту проблему. Хочу начать свои попытки освоения сразу с варианта, подходящего под мои нужды
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 04-05-2017, 19:46:08
К вопросу, в частности, о DrawableOverrule - я правильно понимаю, что если я сделал переопределение видимости, например, отрезка, то при открытии файла без плагина (создающего переопределение) я буду видеть именно отрезок?
Правильно.
Кстати, если переопределить отображение отрезков (не каких-то отдельных, а весь класс Autodesk.AutoCAD.DatabaseServices.Line), очень забавную картину можно наблюдать. Дело в том, что они используются очень широко при отрисовке различных более сложных элементов.
Просто я пытаюсь подойти к изучению вопроса сразу с этого момента - что будет в файле без плагина? Вариант переопределения на основе блока как-раз таки и решает эту проблему.
Какую проблему?
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 04-05-2017, 20:10:20
Какую проблему?
Ну может слово "проблема" не совсем подходящее)) Я хочу начать освоение Overrules сразу учитывая, чтобы графика осталась в чертеже без наличия плагина, создающего переопределения
Если взять тот-же СПДС-модуль, который практически сделан на Overrules - там переопределенные объекты остаются как Proxy
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 04-05-2017, 20:26:04
чтобы графика осталась в чертеже без наличия плагина, создающего переопределения
DrawableOverrule изменяет отображение объекта, но если объект будет выглядеть одинаково с перерисовкой (с плагином) и без перерисовки (без плагина), то в чем тогда будет заключаться перерисовка?
Если взять тот-же СПДС-модуль, который практически сделан на Overrules - там переопределенные объекты остаются как Proxy
Там не Overrules, а как раз таки Custom Entities
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 04-05-2017, 20:42:02
Там не Overrules, а как раз таки Custom Entities
Там как-раз таки Overrules:
(https://s4.postimg.org/p5vl1q6gp/Screenshot_2.png) (https://postimg.org/image/p5vl1q6gp/)

(https://s1.postimg.org/eymyf4y1n/Screenshot_3.png) (https://postimg.org/image/eymyf4y1n/)

(https://s9.postimg.org/l8b0kw7ij/Screenshot_4.png) (https://postimg.org/image/l8b0kw7ij/)
DrawableOverrule изменяет отображение объекта, но если объект будет выглядеть одинаково с перерисовкой (с плагином) и без перерисовки (без плагина), то в чем тогда будет заключаться перерисовка?
В том-же, в чем и смысл СПДС-модуля или Custom-Entity - создание "своих примитивов" с определенными свойствами. Да, многое можно решить динамическими блоками, но далеко не все.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 04-05-2017, 20:46:45
Там как-раз таки Overrules:
Поспорим? :)
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 04-05-2017, 20:50:09
Там как-раз таки Overrules:
Поспорим? :)
Не вижу смысла, если это не будет решать вопросы темы =)
Код СПДС-модуля я проглядывал, но мог и неверно понять, т.к. не являюсь по сути программистом. Скорее просто любителем
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 04-05-2017, 20:57:18
Вот и я особо не вижу смысла доказывать какие-то очевидные вещи. Если приложение оставляет после себя Proxy, то это однозначно Custom Entity. Тут без вариантов. Но это и не отменяет того факта, что в приложении могут параллельно с этим использоваться инструменты Overrule.
Почитай, кстати, лицензионное соглашение на использование СПДС-модуля. Можно ли его декомпилировать и выкладывать куски кода на общедоступных ресурсах?

P.S. А тебе, я смотрю, не я первый об этом говорю: http://www.cyberforum.ru/csharp-beginners/thread1903303.html
Цитировать
В статье есть ссылка на скачивание, что само собой подразумевает открытый доступ (т.к. C# декомпилируется и все авторы это знают)
Шедевральная фраза! Вообще, при наличии определенных навыков, можно любую библиотеку декомпилировать. Но это не значит, что можно это делать! Есть такое понятие, как авторское право. И если автор сам не выложил исходный код, то, очевидно, что он не собирается им делиться. То, что .NET библиотеки легче вскрываются, чем другие, абсолютно ничего не меняет! Мало ли что авторы знают! Не у всех есть деньги на обфускаторы и шифраторы, да и не работают сборки для автокада после большинства из них.

P.P.S. Если следовать твоей логике, то я могу скачать отсюда (https://modplus.org/downloads) приложение, декомпилировать его, снять защиту, снова собрать и пользоваться? А что, ссылка есть, значит, "подразумевает открытый доступ". Написано на .NET, значит "автор сам все знает". Так?  ;)
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 04-05-2017, 21:44:04
К тому, что написал Дмитрий Загорулькин, даже нечего добавить. Браво!
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-05-2017, 00:02:01
Вот интересно мне знать - ну и что и где я нарушил? Какие авторские права? Я использую чужой декомпилированный код? Нет! Тем более, цитирую - "да и не работают сборки для автокада после большинства из них". Вы где-то видели, чтобы я выкладывал в открытый доступ? Нет! Или вы считаете картинку с 10 строчками, ничего не раскрывающими, выкладыванием чужого декомпилированного кода???  :o
Или Вы где-то видели приложения от меня, которые используют чужой код, полученный через декомпиляцию???
Ввиду двух фактов: а) приложения на .Net легко декомпилируются и б) В интернете масса бесплатных декомпиляторов - я использую эту возможность в образовательных целях! Или это тоже нельзя? Где написано?
Вот и я особо не вижу смысла доказывать какие-то очевидные вещи
Кто-то просил что-то доказывать? Я выдвинул лишь предположение, после которого сразу сказал - цитирую - Не вижу смысла, если это не будет решать вопросы темы. Мне этот вопрос совершенно был не интересен, ибо, повторюсь - я выдвинул всего-лишь предположение на единственном имеющемся примере, подходящим под тему вопроса!
P.P.S. Если следовать твоей логике, то я могу скачать отсюда приложение, декомпилировать его, снять защиту, снова собрать и пользоваться? А что, ссылка есть, значит, "подразумевает открытый доступ". Написано на .NET, значит "автор сам все знает". Так?
Да, именно так! Более того - я вам могу открыто этот код показать! Только вот вы не пользовались моим продуктом и не знаете, что есть несколько причин, по которым этого никто делать не будет!

Александр Ривилис, вот от вас не ожидал. Бравируете сообщениям на форуме, не касающимся темы вопроса....

И все-же, в попытке уйти от оффтопа, я попробую вернуться к своему вопросу! Используя различные виды Overrules (причем, не используя среди них DrawOverrule), расширенные данные и OPMNetExt (вроде ничего не упустил) можно создать - давайте введем новое условное название - некое упрощенное подобие ProxyEntity. Если за основу этого условного объекта взять блок, то при открытии чертежа без плагина, мы будем иметь обычные анонимные блоки.
Еще раз о главном - я говорю в теории! Допустим, если в этот список включить DrawOverrule и за основу брать любой другой примитив, то при открытии файла без плагина мы будем получать простой примитив!
Теоретически - есть еще варианты?
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 05-05-2017, 00:37:29
Александр Ривилис, вот от вас не ожидал. Бравируете сообщениям на форуме, не касающимся темы вопроса....
В первую очередь я "бравировал" вот этому:
Если приложение оставляет после себя Proxy, то это однозначно Custom Entity. Тут без вариантов. Но это и не отменяет того факта, что в приложении могут параллельно с этим использоваться инструменты Overrule.
По поводу лицензионной чистоты декомпиляции чужих кодов я молчу - считаю, что в образовательных целях это допустимо. Если бы в своё время я этого не делал, то приличное количество функций из ObjectARX и AutoCAD .NET API, которые остаются не документированными, так и остались бы неизвестными.
OPMNetExt
Это библиотека, написанная на mixed C++, т.е. она содержит в себе элементы и ObjectARX и AutoCAD .NET API
Думаю, что и SPDS Extension сделана аналогично (лезть в неё мне не интересно).

P.S.: По теме здесь уже всё сказано. Или нормальный Custom Entity (т.е. ObjectARX), что в отсутствии dbx приводит к proxy-объектам или куча разных Overrule, Jig, событий и т.д. - и это всё только для того, чтобы при наличии приложения было некое упрощенное подобие Custom Entity.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Владимир Шу от 05-05-2017, 08:03:45
Александр Пекшев aka Modis, Цель то какая?
Теоретически - есть еще варианты?
Варианты чего? Сделать собственный примитив не залезая в objectARX?
Если у Вас задача сделать действительно кастомный объект, который и при не загруженном плагине отображался нормально и остаться в рамках С#, то наверное стоит посмотреть на MultiCAD.NET API ( https://habrahabr.ru/company/nanosoft/blog/184482/ )

Ввиду двух фактов: а) приложения на .Net легко декомпилируются и б) В интернете масса бесплатных декомпиляторов - я использую эту возможность в образовательных целях! Или это тоже нельзя? Где написано?
Если разговор идет про Autodesk SPDS Extension, то смотрите пункт 3.2 лицензионного договора, с которым Вы согласились устанавливая это ПО.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 05-05-2017, 11:26:48
Вот интересно мне знать - ну и что и где я нарушил? Какие авторские права? Я использую чужой декомпилированный код? Нет!
Вскрытие произведено с целью изучения механизмов работы для возможного последующего применения их в своих разработках. Что запрещено по ст. 14 п.3 закона РФ "О правовой охране программ для электронных вычислительных машин и баз данных" ст. 1280 п.3 ГК РФ
Вы где-то видели, чтобы я выкладывал в открытый доступ? Нет! Или вы считаете картинку с 10 строчками, ничего не раскрывающими, выкладыванием чужого декомпилированного кода???
Это часть чужого кода, полученная незаконным путем. Размер этой части и ее состав сути дела не меняют.
Тем более, цитирую - "да и не работают сборки для автокада после большинства из них".
Речь шла об обфускаторах и шифраторах.
Да, именно так! Более того - я вам могу открыто этот код показать!
Покажите, будет интересно посмотреть.
Ввиду двух фактов: а) приложения на .Net легко декомпилируются и б) В интернете масса бесплатных декомпиляторов - я использую эту возможность в образовательных целях! Или это тоже нельзя? Где написано?
В тексте закона и лицензионного соглашения. Помимо этого, есть еще такое понятие, как "профессиональная этика".
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 05-05-2017, 11:44:49
По поводу лицензионной чистоты декомпиляции чужих кодов я молчу - считаю, что в образовательных целях это допустимо. Если бы в своё время я этого не делал, то приличное количество функций из ObjectARX и AutoCAD .NET API, которые остаются не документированными, так и остались бы неизвестными.
А вот у Вас вскрытие произведено для изучения с целью обеспечения взаимодействия с программным продуктом, если иным способом это никак не изучить. Все в соответствии с законом, по крайней мере в РФ.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-05-2017, 11:55:36
Что запрещено по ст. 14 п.3 закона РФ "О правовой охране программ для электронных вычислительных машин и баз данных"
Документ утратил силу в 2008 году. Старательней ищите информацию ))
Покажите, будет интересно посмотреть.
Прям тут? Оффтопить будем?
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 05-05-2017, 12:14:47
Документ утратил силу в 2008 году. Старательней ищите информацию ))
Принимается, исправил.
Прям тут?
Да в любом удобном для Вас доступном для свободного скачивания месте.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-05-2017, 13:06:06
Да в любом удобном для Вас доступном для свободного скачивания месте.
Пожалуйста. Все до безобразия просто:
Код - C# [Выбрать]
  1. // Проверка того, что функция купленна
  2. public static bool IsFunctionBought(string name, string availCad)
  3. {
  4.     try
  5.     {
  6.         // Расположение файла конфигурации
  7.         var confF = MpSettings.FullFileName;
  8.         // Грузим
  9.         var configFile = XElement.Load(confF);
  10.         // Проверяем есть ли группа Config
  11.         // Если нет, то false
  12.         if (configFile.Element("Config") == null)
  13.             return false;
  14.         var element = configFile.Element("Config");
  15.         // Проверяем есть ли подгруппа Functions
  16.         // Если нет, то false
  17.         if (element != null && element.Element("Functions") == null)
  18.             return false;
  19.         var confFuncsXel = element?.Element("Functions");
  20.         // Проходим по функциям в файле
  21.         if (confFuncsXel != null)
  22.             foreach (var func in confFuncsXel.Elements("function"))
  23.             {
  24.                 var nameAttr = func.Attribute("Name");
  25.                 if (nameAttr != null && nameAttr.Value.Equals(name))
  26.                 {
  27.                     var availVersion = string.Empty;
  28.                     var availCadAttr = func.Attribute("AvailCad");
  29.                     if (availCadAttr != null)
  30.                         availVersion = availCadAttr.Value;
  31.                     var availProdAttr = func.Attribute("AvailProductExternalVersion");
  32.                     if (availProdAttr != null)
  33.                         availVersion = availProdAttr.Value;
  34.                     if (!string.IsNullOrEmpty(availVersion) & availVersion.Equals(availCad))
  35.                     {
  36.                         var activeKey = func.Attribute("ActiveKey")?.Value;
  37.                         if (string.IsNullOrEmpty(activeKey)) return false;
  38.                         if (activeKey == EncDec.MDString(availCad + MpVars.RegistryKey + name)) return true;
  39.                         return false;
  40.                     }
  41.                 }
  42.             }
  43.         return false;
  44.     }
  45.     catch (System.Exception exception)
  46.     {
  47.         MpExWin.Show(exception);
  48.         return false;
  49.     }
  50. }
  51.  
  52. public static string MDString(string s)
  53. {
  54.     var md = MD5.Create();
  55.  
  56.     //Create a new instance of ASCIIEncoding to
  57.     //convert the string into an array of Unicode bytes.
  58.     var enc = new ASCIIEncoding();
  59.  
  60.     //Convert the string into an array of bytes.
  61.     var buffer = enc.GetBytes(s);
  62.  
  63.     //Create the hash value from the array of bytes.
  64.     var hash = md.ComputeHash(buffer);
  65.  
  66.     return hash.Aggregate(string.Empty, (current, b) => current + b.ToString("x2"));
  67. }

Будете делать "кряк" или часть 4 ГК РФ Вас остановит? ))))

UPD: Более того - после ваших сообщений я даже планирую добавить к продукту лицензионное соглашение в котором дам свое согласие на декомпиляцию и использование кода
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 05-05-2017, 13:39:04
Я, честно говоря, ожидал увидеть проект Visual Studio.
UPD: Более того - после ваших сообщений я даже планирую добавить к продукту лицензионное соглашение в котором дам свое согласие на декомпиляцию и использование кода
Зачем такие сложности? Выложите исходники сразу. А вообще, дело хозяйское. Автор приложения - Вы, распоряжайтесь им как угодно.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 05-05-2017, 13:40:53
А вот у Вас вскрытие произведено для изучения с целью обеспечения взаимодействия с программным продуктом, если иным способом это никак не изучить. Все в соответствии с законом, по крайней мере в РФ.
Кстати, использование dumpbin.exe и Dependency Walker для получения сигнатур методов неоднократно рекламировали и применяли ребята из ADN DevHelp в своём блоге: http://adndevblog.typepad.com
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-05-2017, 13:47:25
Я, честно говоря, ожидал увидеть проект Visual Studio
Тут уже сложнее =))
(https://s15.postimg.org/h2o7n514n/Screenshot_5.png) (https://postimg.org/image/h2o7n514n/)
И при декомпиляции чужого кода я не получаю готовый проект, как впрочем и рабочий код))
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 05-05-2017, 13:55:19
Кстати, использование dumpbin.exe и Dependency Walker для получения сигнатур методов неоднократно рекламировали и применяли ребята из ADN DevHelp в своём блоге: http://adndevblog.typepad.com
Так ведь это вообще не декомпиляция. Так что, все в рамках этики и закона :) С Dependency Walker, кстати, не знаком. Надо будет попробовать как-нибудь.
И при декомпиляции чужого кода я не получаю готовый проект, как впрочем и рабочий код))
Это смотря что, чем и как декомпилировать ;)
Тут уже сложнее =))
Да ладно, на файлообменнике поместится! Выкладывайте :)
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 05-05-2017, 14:06:23
Так ведь это вообще не декомпиляция. Так что, все в рамках этики и закона :)
Не скажи. Кстати dumpbin.exe позволяет выполнить и полную декомпиляцию (опция /DISASM). В своё время использовал её для понимания как работать с меткой учебной версии...
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 05-05-2017, 20:56:28
Если у Вас задача сделать действительно кастомный объект, который и при не загруженном плагине отображался нормально и остаться в рамках С#
Судя по всему, использование этого инструмента тоже повлечет за собой наличие Proxy-объектов. Из описания:
Цитировать
для загрузки модуля в AutoCAD требуется модуль расширения (Object Enabler)
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 05-05-2017, 21:00:27
Судя по всему, использование этого инструмента тоже повлечет за собой наличие Proxy-объектов. Из описания:
Цитировать

    для загрузки модуля в AutoCAD требуется модуль расширения (Object Enabler)
Да и внешний вид примитива без этого модуля будет вряд ли такой, как с ним.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-10-2017, 18:24:38
Вот я и закончил работу над первой версией. Теперь у меня есть кастомный примитив без всяких ObjectARX. В основе лежит анонимный блок, что позволяет не переживать об отображении примитива там где нет плагина. Проработана палитра свойств. Проработана работа со стилями. Конечно будут ошибки (одну я даже заметил пока видео снимал), но это уже мелочь. Основу более-менее проработал - буду дальше начинать работу над более сложными примитивами (со списками точек, с текстом и т.п.). Часть из этого проекта обсуждалась на этом форуме.
Вопрос - чем не CustomEntity? ))
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 05-10-2017, 19:52:41
Вопрос - чем не CustomEntity? ))
Хотя бы тем, что в Панели свойств "это" - вхождение блока. А так вообще симпатично.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: RevitTormentor от 05-10-2017, 20:28:16
Дак всё-таки эти штуки как будут отображаться без модуля? Или например. Без модуля подвигали, а потом снова с модулем.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Владимир Шу от 05-10-2017, 20:49:46
Дак всё-таки эти штуки как будут отображаться без модуля?
Это обычный анонимный блок
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-10-2017, 22:10:09
Хотя бы тем, что в Панели свойств "это" - вхождение блока
Ну вот единственная проблема. И та существует лишь потому, что разработчики autocad net api решили не делать обертку для палитры свойств. Может и есть на то причины.
Кстати, разработчики autodesk spds extension в 2018 версии пошли по тому же пути и отказались использовать "родную" палитру - сделали также свою палитру
Дак всё-таки эти штуки как будут отображаться без модуля? Или например. Без модуля подвигали, а потом снова с модулем.
Это обычный анонимный блок
Да, все верно - будет просто анонимный блок. Лично я считаю, что это наилучший вариант в этом случае
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 05-10-2017, 22:11:20
Или например. Без модуля подвигали, а потом снова с модулем.
И снова с модулем он будет работать как "прокси" примитив
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 05-10-2017, 22:34:27
И та существует лишь потому, что разработчики autocad net api решили не делать обертку для палитры свойств. Может и есть на то причины.
Причина в том, что для динамических свойств эту обертку сделать достаточно непросто (OPMNetExt), а для статических практически нереально. Имя примитива в Палитре свойств - это статическое свойство.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Дмитрий Загорулькин от 06-10-2017, 19:13:39
Александр, при всём уважении к этому немалому труду, меня всё же не покидает уже второй день мысль, что если использовать грамотно настроенный динамический блок, то будет, как минимум, тот же самый функционал. Получается как "из пушки по воробьям". А так - да, очень впечатляюще!
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 07-10-2017, 09:59:48
Александр, при всём уважении к этому немалому труду, меня всё же не покидает уже второй день мысль, что если использовать грамотно настроенный динамический блок, то будет, как минимум, тот же самый функционал. Получается как "из пушки по воробьям". А так - да, очень впечатляюще!
Дмитрий, так весь смысл-то совсем в другом! Да, конкретно этот примитив (Линия обрыва) можно решить динамическим блоком. Да и много ещё каких. Но как только вы дойдете, скажем, до линии обозначения сварного шва - вот тут динамический блок уже не поможет. И таких примеров (примитивов) много.
Сейчас я только прорабатывал основу и Линию обрыва взял потому что это самый простой примитив, имеющий в основе только одну полилинию. В данный момент происходит "тестирование боем" - т.е. плагин "пошёл в люди". Как только я отловлю баги, которые я не мог предусмотреть во время разработки, и исправлю их, я смогу уже продолжить дальше. А дальше - уже усложняя. С наличием текста, с полилинейными примитивами (т.е. с добавлением и удалением точек), с различными видами ручек и прочими плюшками
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 30-11-2017, 17:48:33
Если вдруг кому интересно состояние работы на моими "интеллектуальными объектами" без ObjectARX, то хочу поделится новостями - уже на завершающем этапе (процентов на 80% готово) мой второй объект - прямая ось. Я сделал две гифки, показывающие некоторые особенности, да и пример работы в целом:

UPD: Гифки упорно не хотели нормально отображаться, поэтому приложил их как вложение к сообщению

Осталось еще прикрутить два редактора текста и работу со стилями и, в принципе, будет готово. Затем перейду к следующему объекту ))

Думаю, в этот раз большинство со мной согласится - динамическими блоками такое уже практически нереально сделать.


Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Debalance от 01-12-2017, 20:08:46
Я сделал две гифки, показывающие некоторые особенности, да и пример работы в целом:
Ну что же, по-моему отлично. Так держать!
Гифки упорно не хотели нормально отображаться
Не всякий хостинг картинок корректно поддерживает анимированные гифки... Они там очень хитрые ребята - не хотят гонять трафик на халяву.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Владимир Шу от 05-06-2018, 15:59:29
Хм... решил попробовать... очень интересно, причем примеры практически всего кода, который нужен для создания такого блока, есть на форумах, а вот собирать все вместе все равно очень увлекательно.
Видяшка:


ЗЫ.
Видео заменил на другое.

Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 11-11-2018, 12:09:37
Долгое время занимался Ревитом и мои интеллектуальные объекты остались без развития. Недавно вот прям загорелось и я занялся новым объектом. Увлекательный процесс ))
Итак, первым была линия обрыва - там я разработал основу всего проекта
Вторым была ось - с ней я научился работать с текстом внутри моего объекта
Третий объект, который вот только что доделал - линия грунта. В этом объекте я тренировался работе с множеством точек в моем объекте. Были некоторые трудности - создал вчера аж две темы - но и на них нашел решение
Таким образом все основные "неизвестные места" я уже изучил и могу делать остальные объекты - обозначение сечения (разреза), высотная отметка с базой, обозначение сварного шва и т.д. и т.п.

Кстати, вот уже с этим объектом я, думаю, на этот раз точно отвечу на вопрос "а почему не хороший динамический блок" :)

Ну и демонстрация конечно-же:
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 21-11-2018, 16:29:54
Как и обещал в этой теме (http://adn-cis.org/forum/index.php?topic=8910.0) опишу немного то, чего я достиг за последние 10 дней.
А последние 10 дней я занимался полным переписыванием всей основы плагина, пытаясь инкапсулировать всю работу, не связанную конкретно с работой кастомного объекта. И походу меня скоро уволят, так как я занимаюсь этим в рабочее время :D
Итак, до этого для создания кастомного объекта требовалось создать порядка 12 файлов: класс самого примитива, класс описания (об этом отдельно позже), класс функции (или командный класс), класс со свойствами примитива (их названия, типы, описания и ограничения для числовых типов), специальный класс для работы с палитрой, специальный класс для работы со свойствами нескольких примитивов, UserControl для палитры со свойствами, три класса с overrule, класс стиля и UserControl для стиля.
При этом в разработке каждого примитива было жутко много копипаста и очень похожего кода. И очень много рутины.
Когда было выполнено три примитива и были изучены многие подводные камни, пришло время рефакторинга. Причем, пока я этим занимался, то я отчетливо осознавал, что с нуля не смог бы так сделать. Так что тонна говнокода, которая стала превращаться в конфекту, был просто необходима.

Что имеем теперь - для создания нового примтива в плагине требуется реализовать всего 6 классов, 3 из которых - overrule, а один - просто описалово. Шееесть, Карл!
Немного расскажу и покажу:

Класс описания - это класс, в котором просто заполняются значения, которые в основном нужны для построения ленты. Вот пример класса для Линии обрыва (все примеры на этом примитиве покажу):
Извините, вам запрещён просмотр содержимого спойлеров.

В этом классе и в других есть метод Language.GetItem, который часто везде повторяется. С его помощью получаются локализованные значения по ключу, согласно текущим настройкам языка у пользователя. В комментариях стараюсь подписывать на русском что там выводится

OsnapOverrule и ObjectOverrule - покажу их следующими, так как они самые маленькие и однотипные. На самом деле даже не однотипные, а практически одинаковые во всех примитивах, но сделать универсально у меня пока не получилось
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.


Класс функции (команд) - в этом классе происходит инициализация для каждого примитива (например, подключение overrule и каких-то еще специфичных данных) и содержатся команды:
Извините, вам запрещён просмотр содержимого спойлеров.

Обратите внимание на команду - все действия, которые там происходят, аналогичны во всех примитивах: регистрация имени примитива в таблице зарегистрированных приложений (RegAppTable), получение стиля для примитива, создание экземпляра класса кастомного примитива, создание блока, применение стиля и вставка с использование Jig. При этом создана универсальная Jig, которая подойдет скорее всего для всех примитивов. Если джига отработала нормально, то в блок записываются данные в XData, по которым можно обработать/описать кастомный примитив.
И что самое главное - все это работает само и реализовано в базовых классах, фабриках и пр.

Ну и самое главное - класс самого примитива:
Извините, вам запрещён просмотр содержимого спойлеров.

Если посмотреть внимательно, то станет ясно - тут по сути нужно разработать один метод - UpdateEntities - в этом методе происходит построение простых примитивов внутри блока. Чтобы это было возможно и после создания примитива (т.е. для последующего его редактирования). При этом значения свойств, которые нужны для работы, нужно сохранять в XData. А для этого этим свойствам достаточно указать атрибут [SaveToXData]. Чтобы свойства отображались в палитре свойств или в редакторе стилей, то им указывается атрибут EntityProperty с нужными параметрами. Отображаемое имя и описание указываются ключами локализации - такая уж специфика конкретно в моем плагине.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 21-11-2018, 16:40:39
Предыдущее сообщение не полностью опубликовалось, но я заранее сохранил текст)) Я молодец)) Продолжение сообщения:


GripOverrule просто покажу без лишних описаний:
Извините, вам запрещён просмотр содержимого спойлеров.

Таким образом для создания нового примитива достаточно поработать над одним классом и не забыть указать нужные атрибуты. По атрибутам требуемые данные сериализуются в json (причем, без сторонних библиотек) и записываются в XData. При работе с ручками или палитрой свойств данные десериализуются и заполняются в экземпляр класса. Все это работает максимально само и не требует лишних вмешательств. По крайней мере до того, как не появится новый примитив с какими-то особенностями, что маловероятно (хотя уже витает мысль использовать блоки внутри моих примитивов...).

Еще раз посмотрите на класс BrekLine и на атрибуты. Вот так это выглядит в палитре свойств:

(https://i.postimg.cc/QVDZNmHy/1.png) (https://postimg.cc/QVDZNmHy)

А вот так в редакторе стилей:

(https://i.postimg.cc/LnycTMvc/2.png) (https://postimg.cc/LnycTMvc)

Сейчас понемногу занимаюсь следующим примитивом - обозначением разреза - и просто получаю удовольствие, так как мне не приходится реализовывать тонну говнокода и я просто сосредоточен на построении геометрии примитива. Плюс, отлаживаю все то, что было сделано - ошибочки мелкие пока еще находятся. В релиз пока проект не пушил, так как для конечного пользователя не будет как-то явных изменений. Единственное, что плохо - сломал обратную совместимость. Пришлось. Но это необходимое зло и надеюсь, меня простят мои пользователи ))

Если есть вопросы о том как и что реализовано в "back end" спрашивайте - постараюсь ответить. Всего не опишешь - там очень много всего.

P.S. Забыл еще описать одно важное место - как только будут созданы класс примитива и класс функции (даже пусть пустые) их нужно еще добавить в фабрику типов, чтобы "все закрутилось и подцепилось")) выглядит фабрика так:
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 21-11-2018, 16:46:44
Видимо форум имеет ограничения на длину сообщения, поэтому разбил на два
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Ривилис от 21-11-2018, 18:49:22
Видимо форум имеет ограничения на длину сообщения, поэтому разбил на два
Был максимум 60000 символов - ты их видимо превысил. Я поменял на 120000 - надеюсь будешь влезать. Пришлось вернуть установки обратно - падают браузеры.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 27-11-2018, 00:49:23
Сегодня доделал новый примитив - обозначение Разреза. В отличии от подобного примитива в СПДС-Модуле автодеска мой имеет свои плюшки:
- Больше возможностей настройки внешнего вида
- Более стабильное и правильное положение текста в случае изменения Разреза. Т.е. текст всегда находится в одном положении относительно полки, независимо от того, как вы его подвинули
- Возможность восстановить положение текста через редактор значений, вызываемый по двойному клику
- И главная фишка – отображение линии сечения, когда Разрез выбран

К сожалению, на видео уже нет ни сил ни времени, поэтому просто приложу скриншотик:

(https://i.postimg.cc/94DmyvvK/1.png) (https://postimg.cc/94DmyvvK)
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 27-11-2018, 17:10:08
Один из пользователей спросил "А как-же аннотативность?". И вот я задумался - а надо ли? И если да - то все-ли возможности учитывать?
Немного мыслей в слух:
Одна из главных фишек аннотативности, на мой взгляд, это то, что автокад скрывает аннотативные примитивы на видовых экранах при правильной настройке. Это действительно круто и удобно
А вот фишка что для каждого аннотативного масштаба в примитиве можно задать своё состояние (расположение в основном) - вот это уже лишнее. Да и никто этим не пользуется. Да и не удобно это.

Проведя эксперимент я выяснил, что использование блока в основе "кастомного" объекта имеет еще один плюс - блоку можно сказать "аннотавный" и автокад уже сам будет обрабатывать его видимость на видовых экранах. Т.е. реализовать аннотативность вполне реально! Но возникают некоторые моменты:
- У меня у "кастомных" примитивов есть свойство "Масштаб". Стоит ли при его изменении "прокидывать" аннотативный масштаб в список аннотавтиных масштабов блока?
- Что делать, если аннотативный масштаб будет изменен пользователем у самого блока?
- Стоит ли реагировать на изменение переменной ANNOAUTOSCALE?

Эти вопросы у меня возникли только на стадии обдумывания. Если начну делать, то проблем точно появится еще больше.

Кто что думает по этому поводу? Вы бы стали реализовывать аннотативность?
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Вильдар от 27-11-2018, 19:24:53
По хорошему, похоже, нужно добавить свойства Аннотативность - Да/Нет
И в зависимости от него управлять масштабом.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Привалов Дмитрий от 27-11-2018, 23:47:25
Кто что думает по этому поводу? Вы бы стали реализовывать аннотативность?
Да аннотативность, стоит реализовать.

Мне тоже не доводилось встречать необходимость использования различных положений объектов, для разных масштабов в одном чертеже. Больше было вопросов, почему блоки сместилися при изменении масштаба.

Стандартный механизм аннотативности в AutoCAD универсальный, но уж больно затратный, как ты заметил это порождение кучи блоков, хранящих состояние аннотативного объекта, и собственно список масштабов для каждого объекта, каждый масштаб на объекте - тоже дополнительный DbObject в чертеже.

Вариант без хранения состояния расположения и списка масштабов для объектов более быстрый, удобный и безглючный.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Александр Пекшев aka Modis от 27-11-2018, 23:54:21
Вариант без хранения состояния расположения и списка масштабов для объектов более быстрый, удобный и безглючный.
Ну хранить состояния я и не собираюсь, а вот список масштабов хранить наверное желательно. Можно конечно брать его с самого блока. Да вот только этот список пользователь может легко очистить.
В любом случае - пока экспериментирую. Хотя, реализация аннотативности и возможные проблемы вроде начинают вырисовываться в моем воображении
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Привалов Дмитрий от 27-11-2018, 23:57:03
По хорошему, похоже, нужно добавить свойства Аннотативность - Да/Нет
И в зависимости от него управлять масштабом.

Можно реализовать реакцию объекта на переменные cannoscale, psltscale, msltscale, не добавляя дополнительного свойства, может оно не понадобится в дальнейшем.
Название: Re: CustomEntity на .Net без использования ObjectARX
Отправлено: Привалов Дмитрий от 28-11-2018, 00:06:52
Да вот только этот список пользователь может легко очистить.
Для одного объекта да, а если чертеж насыщенный?
1. По опыту пользователь просто не станет вычищать вручную списки масштабов для каждого объекта. Нужно программное средство.
2. При отключении свойства аннотативности блока, список масштабов должен почиститься для блока и каждого вложенного объекта. Я встречал ситуации когда этого не происходило и список масштабов хранился в объекте с отключенным свойством аннотативности. Т.е. возможны некоторые дополнительные проблемы с механизмом очистки.