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

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

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

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

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

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

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

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

Оффлайн RevitTormentor

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

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

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

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

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

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

Оффлайн Александр Пекшев 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
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Хм... решил попробовать... очень интересно, причем примеры практически всего кода, который нужен для создания такого блока, есть на форумах, а вот собирать все вместе все равно очень увлекательно.
Видяшка:


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

« Последнее редактирование: 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. Забыл еще описать одно важное место - как только будут созданы класс примитива и класс функции (даже пусть пустые) их нужно еще добавить в фабрику типов, чтобы "все закрутилось и подцепилось")) выглядит фабрика так:
Извините, вам запрещён просмотр содержимого спойлеров.