CustomEntity на .Net без использования ObjectARX

Автор Тема: CustomEntity на .Net без использования ObjectARX  (Прочитано 24522 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Хотелось бы поднять эту тему.
В .Net достаточное количество возможностей, чтобы сделать "кастомные" объекты и не использовать при этом ObjectARX. Кто скажет "невозможно", отвечу - возможно! Если погулять по гуглу, то можно найти тему где это уже было реализовано почти 5 лет назад. И реализовано это на основе обычных анонимных блоках. Т.е. если плагин есть - эти объекты работают как "кастомные" - и есть ручки, и свои свойства, и стили, прочие атрибуты. Если открыть чертеж без плагина - эти объекты превращаются в обычные анонимные блоки. И это круто!
Я пробовал тот плагин, что можно найти по ссылке. За исключением некоторых "глюков" работает он отлично. Правда там версия только для 2012 автокада.
Я конечно пробовал декомпилировать (все разработчики на .Net об этом знают), но там такой объем информации, что нужно разбираться неделями (а то и месяцами), если ты не занимаешься кодингом профессионально. Как в моем случае)) Т.е. да - скрывать не буду - мне не хватает ума такое повторить. Хотя частично получалось:

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

Вот у меня и вопрос - кто-нибудь еще подобным занимался? Есть где-нибудь (открытая) информация на эту тему?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Кастомизация объектов в .NET - это переопределение их поведения с помощью различных Overrule. Для этого есть несколько типов Overrule. Я плотно имел дело с тремя четырьмя из них:
  • DrawableOverrule - изменение отображения объекта
  • TransformOverrule - изменение поведения объекта при редактировании
  • GripOverrule - изменение поведения и отображения ручек объектов
  • OsnapOverrule - изменение поведения привязки к объектам
Мне их достаточно во всех случаях.
Примеров и материалов по ним в интернете более чем достаточно. И даже тут на форуме мы не раз их обсуждали.
P.S. Статья, на которую дана ссылка, какая-то сумбурная, несвязная. Я бы поспорил с некоторыми утверждениями автора. Но это не имеет смысла, учитывая, что это 2012 год и что автор, скорее всего, с автокадом имел очень непродолжительное знакомство.
Если уж изучать статьи, то лучше у авторитетных авторов, типа Кина Волмсли: http://through-the-interface.typepad.com/through_the_interface/overrules/
Еще хорошие примеры есть на этом ресурсе: http://spiderinnet1.typepad.com/.services/blog/6a0153928ee38e970b0153928f11cc970b/search?filter.q=overrule
« Последнее редактирование: 02-05-2017, 13:52:20 от Дмитрий Загорулькин »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В .Net достаточное количество возможностей, чтобы сделать "кастомные" объекты и не использовать при этом ObjectARX. Кто скажет "невозможно", отвечу - возможно! Если погулять по гуглу, то можно найти тему где это уже было реализовано почти 5 лет назад. И реализовано это на основе обычных анонимных блоках. Т.е. если плагин есть - эти объекты работают как "кастомные" - и есть ручки, и свои свойства, и стили, прочие атрибуты. Если открыть чертеж без плагина - эти объекты превращаются в обычные анонимные блоки. И это круто!
Бред. Ты путаешь мягкое с теплым. Далеко не всё, что можно сделать в Custom Entity можно сделать в .NET
Хотя частично получалось:
Насколько я помню это можно сделать при помощи обычного динамического блока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
ну есть и у меня такие модули, ничего особо сложного в этом нет, код обсуждали туттут и тут

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Бред. Ты путаешь мягкое с теплым. Далеко не всё, что можно сделать в Custom Entity можно сделать в .NET
Ну я не спорю, что не все. Но при первом приближении, на мой взгляд, средств .Net достаточно. Возьмем для примера СПДС-модуль и самые распространенные элементы - отметка, сечение, выноска, обозначение узла и т.п. Мне думается, что возможности этих примитивов вполне можно реализовать средствами
Насколько я помню это можно сделать при помощи обычного динамического блока
Можно конечно, не спорю. Смысл был не в реализации конкретного элемента, а в осознании темы "свои примитивы"
ну есть и у меня такие модули, ничего особо сложного в этом нет, код обсуждали туттут и тут
Судя по ссылкам - у вас модули, обрабатывающие динамические блоки. Тот пример, что в топике в ссылке (да и в видео) не использует динамических блоков - там все программно создается
Дмитрий Загорулькин, а можете показать видео реализации?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Дмитрий Загорулькин, а можете показать видео реализации?
В основном, я это делаю с объектами Civil 3D. Показать могу, но вряд ли поймете в чем суть.
Но есть проект, который изменяет стандартные таблицы AutoCAD, добавляя к ним связанные контуры:

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

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


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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
К вопросу, в частности, о DrawableOverrule - я правильно понимаю, что если я сделал переопределение видимости, например, отрезка, то при открытии файла без плагина (создающего переопределение) я буду видеть именно отрезок?
Просто я пытаюсь подойти к изучению вопроса сразу с этого момента - что будет в файле без плагина? Вариант переопределения на основе блока как-раз таки и решает эту проблему. Хочу начать свои попытки освоения сразу с варианта, подходящего под мои нужды

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
К вопросу, в частности, о DrawableOverrule - я правильно понимаю, что если я сделал переопределение видимости, например, отрезка, то при открытии файла без плагина (создающего переопределение) я буду видеть именно отрезок?
Правильно.
Кстати, если переопределить отображение отрезков (не каких-то отдельных, а весь класс Autodesk.AutoCAD.DatabaseServices.Line), очень забавную картину можно наблюдать. Дело в том, что они используются очень широко при отрисовке различных более сложных элементов.
Просто я пытаюсь подойти к изучению вопроса сразу с этого момента - что будет в файле без плагина? Вариант переопределения на основе блока как-раз таки и решает эту проблему.
Какую проблему?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Какую проблему?
Ну может слово "проблема" не совсем подходящее)) Я хочу начать освоение Overrules сразу учитывая, чтобы графика осталась в чертеже без наличия плагина, создающего переопределения
Если взять тот-же СПДС-модуль, который практически сделан на Overrules - там переопределенные объекты остаются как Proxy

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
чтобы графика осталась в чертеже без наличия плагина, создающего переопределения
DrawableOverrule изменяет отображение объекта, но если объект будет выглядеть одинаково с перерисовкой (с плагином) и без перерисовки (без плагина), то в чем тогда будет заключаться перерисовка?
Если взять тот-же СПДС-модуль, который практически сделан на Overrules - там переопределенные объекты остаются как Proxy
Там не Overrules, а как раз таки Custom Entities

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Там не Overrules, а как раз таки Custom Entities
Там как-раз таки Overrules:





DrawableOverrule изменяет отображение объекта, но если объект будет выглядеть одинаково с перерисовкой (с плагином) и без перерисовки (без плагина), то в чем тогда будет заключаться перерисовка?
В том-же, в чем и смысл СПДС-модуля или Custom-Entity - создание "своих примитивов" с определенными свойствами. Да, многое можно решить динамическими блоками, но далеко не все.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Там как-раз таки Overrules:
Поспорим? :)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Там как-раз таки Overrules:
Поспорим? :)
Не вижу смысла, если это не будет решать вопросы темы =)
Код СПДС-модуля я проглядывал, но мог и неверно понять, т.к. не являюсь по сути программистом. Скорее просто любителем

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вот и я особо не вижу смысла доказывать какие-то очевидные вещи. Если приложение оставляет после себя Proxy, то это однозначно Custom Entity. Тут без вариантов. Но это и не отменяет того факта, что в приложении могут параллельно с этим использоваться инструменты Overrule.
Почитай, кстати, лицензионное соглашение на использование СПДС-модуля. Можно ли его декомпилировать и выкладывать куски кода на общедоступных ресурсах?

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

P.P.S. Если следовать твоей логике, то я могу скачать отсюда приложение, декомпилировать его, снять защиту, снова собрать и пользоваться? А что, ссылка есть, значит, "подразумевает открытый доступ". Написано на .NET, значит "автор сам все знает". Так?  ;)
« Последнее редактирование: 04-05-2017, 21:32:41 от Дмитрий Загорулькин »

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот интересно мне знать - ну и что и где я нарушил? Какие авторские права? Я использую чужой декомпилированный код? Нет! Тем более, цитирую - "да и не работают сборки для автокада после большинства из них". Вы где-то видели, чтобы я выкладывал в открытый доступ? Нет! Или вы считаете картинку с 10 строчками, ничего не раскрывающими, выкладыванием чужого декомпилированного кода???  :o
Или Вы где-то видели приложения от меня, которые используют чужой код, полученный через декомпиляцию???
Ввиду двух фактов: а) приложения на .Net легко декомпилируются и б) В интернете масса бесплатных декомпиляторов - я использую эту возможность в образовательных целях! Или это тоже нельзя? Где написано?
Вот и я особо не вижу смысла доказывать какие-то очевидные вещи
Кто-то просил что-то доказывать? Я выдвинул лишь предположение, после которого сразу сказал - цитирую - Не вижу смысла, если это не будет решать вопросы темы. Мне этот вопрос совершенно был не интересен, ибо, повторюсь - я выдвинул всего-лишь предположение на единственном имеющемся примере, подходящим под тему вопроса!
P.P.S. Если следовать твоей логике, то я могу скачать отсюда приложение, декомпилировать его, снять защиту, снова собрать и пользоваться? А что, ссылка есть, значит, "подразумевает открытый доступ". Написано на .NET, значит "автор сам все знает". Так?
Да, именно так! Более того - я вам могу открыто этот код показать! Только вот вы не пользовались моим продуктом и не знаете, что есть несколько причин, по которым этого никто делать не будет!

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

И все-же, в попытке уйти от оффтопа, я попробую вернуться к своему вопросу! Используя различные виды Overrules (причем, не используя среди них DrawOverrule), расширенные данные и OPMNetExt (вроде ничего не упустил) можно создать - давайте введем новое условное название - некое упрощенное подобие ProxyEntity. Если за основу этого условного объекта взять блок, то при открытии чертежа без плагина, мы будем иметь обычные анонимные блоки.
Еще раз о главном - я говорю в теории! Допустим, если в этот список включить DrawOverrule и за основу брать любой другой примитив, то при открытии файла без плагина мы будем получать простой примитив!
Теоретически - есть еще варианты?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис, вот от вас не ожидал. Бравируете сообщениям на форуме, не касающимся темы вопроса....
В первую очередь я "бравировал" вот этому:
Если приложение оставляет после себя 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.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Александр Пекшев aka Modis, Цель то какая?
Теоретически - есть еще варианты?
Варианты чего? Сделать собственный примитив не залезая в objectARX?
Если у Вас задача сделать действительно кастомный объект, который и при не загруженном плагине отображался нормально и остаться в рамках С#, то наверное стоит посмотреть на MultiCAD.NET API ( https://habrahabr.ru/company/nanosoft/blog/184482/ )

Ввиду двух фактов: а) приложения на .Net легко декомпилируются и б) В интернете масса бесплатных декомпиляторов - я использую эту возможность в образовательных целях! Или это тоже нельзя? Где написано?
Если разговор идет про Autodesk SPDS Extension, то смотрите пункт 3.2 лицензионного договора, с которым Вы согласились устанавливая это ПО.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вот интересно мне знать - ну и что и где я нарушил? Какие авторские права? Я использую чужой декомпилированный код? Нет!
Вскрытие произведено с целью изучения механизмов работы для возможного последующего применения их в своих разработках. Что запрещено по ст. 14 п.3 закона РФ "О правовой охране программ для электронных вычислительных машин и баз данных" ст. 1280 п.3 ГК РФ
Вы где-то видели, чтобы я выкладывал в открытый доступ? Нет! Или вы считаете картинку с 10 строчками, ничего не раскрывающими, выкладыванием чужого декомпилированного кода???
Это часть чужого кода, полученная незаконным путем. Размер этой части и ее состав сути дела не меняют.
Тем более, цитирую - "да и не работают сборки для автокада после большинства из них".
Речь шла об обфускаторах и шифраторах.
Да, именно так! Более того - я вам могу открыто этот код показать!
Покажите, будет интересно посмотреть.
Ввиду двух фактов: а) приложения на .Net легко декомпилируются и б) В интернете масса бесплатных декомпиляторов - я использую эту возможность в образовательных целях! Или это тоже нельзя? Где написано?
В тексте закона и лицензионного соглашения. Помимо этого, есть еще такое понятие, как "профессиональная этика".
« Последнее редактирование: 05-05-2017, 12:07:41 от Дмитрий Загорулькин »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
По поводу лицензионной чистоты декомпиляции чужих кодов я молчу - считаю, что в образовательных целях это допустимо. Если бы в своё время я этого не делал, то приличное количество функций из ObjectARX и AutoCAD .NET API, которые остаются не документированными, так и остались бы неизвестными.
А вот у Вас вскрытие произведено для изучения с целью обеспечения взаимодействия с программным продуктом, если иным способом это никак не изучить. Все в соответствии с законом, по крайней мере в РФ.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Что запрещено по ст. 14 п.3 закона РФ "О правовой охране программ для электронных вычислительных машин и баз данных"
Документ утратил силу в 2008 году. Старательней ищите информацию ))
Покажите, будет интересно посмотреть.
Прям тут? Оффтопить будем?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Документ утратил силу в 2008 году. Старательней ищите информацию ))
Принимается, исправил.
Прям тут?
Да в любом удобном для Вас доступном для свободного скачивания месте.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Да в любом удобном для Вас доступном для свободного скачивания месте.
Пожалуйста. Все до безобразия просто:
Код - 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: Более того - после ваших сообщений я даже планирую добавить к продукту лицензионное соглашение в котором дам свое согласие на декомпиляцию и использование кода

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Я, честно говоря, ожидал увидеть проект Visual Studio.
UPD: Более того - после ваших сообщений я даже планирую добавить к продукту лицензионное соглашение в котором дам свое согласие на декомпиляцию и использование кода
Зачем такие сложности? Выложите исходники сразу. А вообще, дело хозяйское. Автор приложения - Вы, распоряжайтесь им как угодно.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А вот у Вас вскрытие произведено для изучения с целью обеспечения взаимодействия с программным продуктом, если иным способом это никак не изучить. Все в соответствии с законом, по крайней мере в РФ.
Кстати, использование dumpbin.exe и Dependency Walker для получения сигнатур методов неоднократно рекламировали и применяли ребята из ADN DevHelp в своём блоге: http://adndevblog.typepad.com
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я, честно говоря, ожидал увидеть проект Visual Studio
Тут уже сложнее =))

И при декомпиляции чужого кода я не получаю готовый проект, как впрочем и рабочий код))

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Кстати, использование dumpbin.exe и Dependency Walker для получения сигнатур методов неоднократно рекламировали и применяли ребята из ADN DevHelp в своём блоге: http://adndevblog.typepad.com
Так ведь это вообще не декомпиляция. Так что, все в рамках этики и закона :) С Dependency Walker, кстати, не знаком. Надо будет попробовать как-нибудь.
И при декомпиляции чужого кода я не получаю готовый проект, как впрочем и рабочий код))
Это смотря что, чем и как декомпилировать ;)
Тут уже сложнее =))
Да ладно, на файлообменнике поместится! Выкладывайте :)

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Если у Вас задача сделать действительно кастомный объект, который и при не загруженном плагине отображался нормально и остаться в рамках С#
Судя по всему, использование этого инструмента тоже повлечет за собой наличие Proxy-объектов. Из описания:
Цитировать
для загрузки модуля в AutoCAD требуется модуль расширения (Object Enabler)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Судя по всему, использование этого инструмента тоже повлечет за собой наличие Proxy-объектов. Из описания:
Цитировать

    для загрузки модуля в AutoCAD требуется модуль расширения (Object Enabler)
Да и внешний вид примитива без этого модуля будет вряд ли такой, как с ним.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Пекшев aka Modis 05-10-2017, 18:28:37

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вот я и закончил работу над первой версией. Теперь у меня есть кастомный примитив без всяких ObjectARX. В основе лежит анонимный блок, что позволяет не переживать об отображении примитива там где нет плагина. Проработана палитра свойств. Проработана работа со стилями. Конечно будут ошибки (одну я даже заметил пока видео снимал), но это уже мелочь. Основу более-менее проработал - буду дальше начинать работу над более сложными примитивами (со списками точек, с текстом и т.п.). Часть из этого проекта обсуждалась на этом форуме.
Вопрос - чем не CustomEntity? ))

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

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

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Дак всё-таки эти штуки как будут отображаться без модуля? Или например. Без модуля подвигали, а потом снова с модулем.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Дак всё-таки эти штуки как будут отображаться без модуля?
Это обычный анонимный блок

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Хотя бы тем, что в Панели свойств "это" - вхождение блока
Ну вот единственная проблема. И та существует лишь потому, что разработчики autocad net api решили не делать обертку для палитры свойств. Может и есть на то причины.
Кстати, разработчики autodesk spds extension в 2018 версии пошли по тому же пути и отказались использовать "родную" палитру - сделали также свою палитру
Дак всё-таки эти штуки как будут отображаться без модуля? Или например. Без модуля подвигали, а потом снова с модулем.
Это обычный анонимный блок
Да, все верно - будет просто анонимный блок. Лично я считаю, что это наилучший вариант в этом случае

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

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

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И та существует лишь потому, что разработчики autocad net api решили не делать обертку для палитры свойств. Может и есть на то причины.
Причина в том, что для динамических свойств эту обертку сделать достаточно непросто (OPMNetExt), а для статических практически нереально. Имя примитива в Палитре свойств - это статическое свойство.
« Последнее редактирование: 11-11-2018, 13:27:00 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Александр, при всём уважении к этому немалому труду, меня всё же не покидает уже второй день мысль, что если использовать грамотно настроенный динамический блок, то будет, как минимум, тот же самый функционал. Получается как "из пушки по воробьям". А так - да, очень впечатляюще!

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр, при всём уважении к этому немалому труду, меня всё же не покидает уже второй день мысль, что если использовать грамотно настроенный динамический блок, то будет, как минимум, тот же самый функционал. Получается как "из пушки по воробьям". А так - да, очень впечатляюще!
Дмитрий, так весь смысл-то совсем в другом! Да, конкретно этот примитив (Линия обрыва) можно решить динамическим блоком. Да и много ещё каких. Но как только вы дойдете, скажем, до линии обозначения сварного шва - вот тут динамический блок уже не поможет. И таких примеров (примитивов) много.
Сейчас я только прорабатывал основу и Линию обрыва взял потому что это самый простой примитив, имеющий в основе только одну полилинию. В данный момент происходит "тестирование боем" - т.е. плагин "пошёл в люди". Как только я отловлю баги, которые я не мог предусмотреть во время разработки, и исправлю их, я смогу уже продолжить дальше. А дальше - уже усложняя. С наличием текста, с полилинейными примитивами (т.е. с добавлением и удалением точек), с различными видами ручек и прочими плюшками

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Если вдруг кому интересно состояние работы на моими "интеллектуальными объектами" без ObjectARX, то хочу поделится новостями - уже на завершающем этапе (процентов на 80% готово) мой второй объект - прямая ось. Я сделал две гифки, показывающие некоторые особенности, да и пример работы в целом:

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

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

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



Оффлайн Debalance

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Я сделал две гифки, показывающие некоторые особенности, да и пример работы в целом:
Ну что же, по-моему отлично. Так держать!
Гифки упорно не хотели нормально отображаться
Не всякий хостинг картинок корректно поддерживает анимированные гифки... Они там очень хитрые ребята - не хотят гонять трафик на халяву.

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Хм... решил попробовать... очень интересно, причем примеры практически всего кода, который нужен для создания такого блока, есть на форумах, а вот собирать все вместе все равно очень увлекательно.
Видяшка:


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

« Последнее редактирование: 08-06-2018, 06:32:37 от Владимир Шу »

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Долгое время занимался Ревитом и мои интеллектуальные объекты остались без развития. Недавно вот прям загорелось и я занялся новым объектом. Увлекательный процесс ))
Итак, первым была линия обрыва - там я разработал основу всего проекта
Вторым была ось - с ней я научился работать с текстом внутри моего объекта
Третий объект, который вот только что доделал - линия грунта. В этом объекте я тренировался работе с множеством точек в моем объекте. Были некоторые трудности - создал вчера аж две темы - но и на них нашел решение
Таким образом все основные "неизвестные места" я уже изучил и могу делать остальные объекты - обозначение сечения (разреза), высотная отметка с базой, обозначение сварного шва и т.д. и т.п.

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

Ну и демонстрация конечно-же:

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Как и обещал в этой теме опишу немного то, чего я достиг за последние 10 дней.
А последние 10 дней я занимался полным переписыванием всей основы плагина, пытаясь инкапсулировать всю работу, не связанную конкретно с работой кастомного объекта. И походу меня скоро уволят, так как я занимаюсь этим в рабочее время :D
Итак, до этого для создания кастомного объекта требовалось создать порядка 12 файлов: класс самого примитива, класс описания (об этом отдельно позже), класс функции (или командный класс), класс со свойствами примитива (их названия, типы, описания и ограничения для числовых типов), специальный класс для работы с палитрой, специальный класс для работы со свойствами нескольких примитивов, UserControl для палитры со свойствами, три класса с overrule, класс стиля и UserControl для стиля.
При этом в разработке каждого примитива было жутко много копипаста и очень похожего кода. И очень много рутины.
Когда было выполнено три примитива и были изучены многие подводные камни, пришло время рефакторинга. Причем, пока я этим занимался, то я отчетливо осознавал, что с нуля не смог бы так сделать. Так что тонна говнокода, которая стала превращаться в конфекту, был просто необходима.

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

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

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

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

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


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

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

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

Если посмотреть внимательно, то станет ясно - тут по сути нужно разработать один метод - UpdateEntities - в этом методе происходит построение простых примитивов внутри блока. Чтобы это было возможно и после создания примитива (т.е. для последующего его редактирования). При этом значения свойств, которые нужны для работы, нужно сохранять в XData. А для этого этим свойствам достаточно указать атрибут [SaveToXData]. Чтобы свойства отображались в палитре свойств или в редакторе стилей, то им указывается атрибут EntityProperty с нужными параметрами. Отображаемое имя и описание указываются ключами локализации - такая уж специфика конкретно в моем плагине.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Предыдущее сообщение не полностью опубликовалось, но я заранее сохранил текст)) Я молодец)) Продолжение сообщения:


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

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

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



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



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

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

P.S. Забыл еще описать одно важное место - как только будут созданы класс примитива и класс функции (даже пусть пустые) их нужно еще добавить в фабрику типов, чтобы "все закрутилось и подцепилось")) выглядит фабрика так:
Извините, вам запрещён просмотр содержимого спойлеров.

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Видимо форум имеет ограничения на длину сообщения, поэтому разбил на два

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Видимо форум имеет ограничения на длину сообщения, поэтому разбил на два
Был максимум 60000 символов - ты их видимо превысил. Я поменял на 120000 - надеюсь будешь влезать. Пришлось вернуть установки обратно - падают браузеры.
« Последнее редактирование: 22-11-2018, 09:30:30 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Сегодня доделал новый примитив - обозначение Разреза. В отличии от подобного примитива в СПДС-Модуле автодеска мой имеет свои плюшки:
- Больше возможностей настройки внешнего вида
- Более стабильное и правильное положение текста в случае изменения Разреза. Т.е. текст всегда находится в одном положении относительно полки, независимо от того, как вы его подвинули
- Возможность восстановить положение текста через редактор значений, вызываемый по двойному клику
- И главная фишка – отображение линии сечения, когда Разрез выбран

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



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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Один из пользователей спросил "А как-же аннотативность?". И вот я задумался - а надо ли? И если да - то все-ли возможности учитывать?
Немного мыслей в слух:
Одна из главных фишек аннотативности, на мой взгляд, это то, что автокад скрывает аннотативные примитивы на видовых экранах при правильной настройке. Это действительно круто и удобно
А вот фишка что для каждого аннотативного масштаба в примитиве можно задать своё состояние (расположение в основном) - вот это уже лишнее. Да и никто этим не пользуется. Да и не удобно это.

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

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

Кто что думает по этому поводу? Вы бы стали реализовывать аннотативность?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
По хорошему, похоже, нужно добавить свойства Аннотативность - Да/Нет
И в зависимости от него управлять масштабом.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Кто что думает по этому поводу? Вы бы стали реализовывать аннотативность?
Да аннотативность, стоит реализовать.

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

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вариант без хранения состояния расположения и списка масштабов для объектов более быстрый, удобный и безглючный.
Ну хранить состояния я и не собираюсь, а вот список масштабов хранить наверное желательно. Можно конечно брать его с самого блока. Да вот только этот список пользователь может легко очистить.
В любом случае - пока экспериментирую. Хотя, реализация аннотативности и возможные проблемы вроде начинают вырисовываться в моем воображении

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
По хорошему, похоже, нужно добавить свойства Аннотативность - Да/Нет
И в зависимости от него управлять масштабом.

Можно реализовать реакцию объекта на переменные cannoscale, psltscale, msltscale, не добавляя дополнительного свойства, может оно не понадобится в дальнейшем.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Да вот только этот список пользователь может легко очистить.
Для одного объекта да, а если чертеж насыщенный?
1. По опыту пользователь просто не станет вычищать вручную списки масштабов для каждого объекта. Нужно программное средство.
2. При отключении свойства аннотативности блока, список масштабов должен почиститься для блока и каждого вложенного объекта. Я встречал ситуации когда этого не происходило и список масштабов хранился в объекте с отключенным свойством аннотативности. Т.е. возможны некоторые дополнительные проблемы с механизмом очистки.