Вставка объекта с ручками из библиотеки по команде (кнопке) на палитре.

psh
psh
отредактировано November 2024 Раздел: API и разработка под nanoCAD BIM

Существующий способ вставки библиотечного элемента универсален, а потому долог.
Не приходилось ли кому-нибудь разработать команду для вставки объектов из библиотеки по Имени объекта и указанию последовательности запросов к редактированию ручек (в самой команде)?
Например:
ВставкаОбъектаС_РучкамиПоИмени_И_РедактРучек( ИмяБиблиотечногоОбъекта, изменение ручки Имя1,..., Изменение ручки ИмяN)

Пример смонтированного видео

https://t.me/cadcpi/721

https://disk.yandex.ru/i/fjy_udAkQogrNA

Дублирую вопрос на форуме разработчиков
https://developer.nanocad.ru/redmine/boards/13/topics/3376?r=4225#message-4225

Комментарии

  • psh
    psh
    отредактировано November 2024

    сама палитра для запуска команд, содержащих запросы была мной разработана ранее, что позволит более удобно обращаться к часто используемым библиотечным элементам (без этого бесконечного скроллинга)

    https://youtu.be/AFDqzINt44U

    https://www.youtube.com/watch?v=5hegR2O0cds

  • Oleg
    отредактировано November 2024

    На developer.nanocad.ru уже есть примеры со вставкой элемента. Если говорить про COM интерфейс, есть возможность использовать XML для указания параметров вставки, тогда не потребуется использовать командные методы. Ручки объекта как правило завязаны на какие-то параметры внутри объекта, поэтому можно редактировать не сами ручки, а те параметры, которыми управляют ручки.
    Пример в видео по ссылке
    https://disk.yandex.ru/i/UR3dnEwV-ae9Ww

    Ниже код из видео. Часть кода позаимствована отсюда
    https://t.me/ModelStudioCS/37606.

    (Vl-load-com)
    (setq obj (vlax-get-acad-object))
    (setq ICADLibrary (vla-GetInterfaceObject obj "LibManager.CADLibrary.1"))
    (setq xml (strcat
    "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    "<Constraints>"
    "<Constraint type="position3d">"
    "<Parameter name="x" value="0.0" />"
    "<Parameter name="y" value="0.0" />"
    "<Parameter name="z" value="0.0" />"
    "</Constraint>""<Constraint type="rotation">"
    "<Parameter name="angle" value="90.0" />"
    "</Constraint>"
    "</Constraints>"))
    (vlax-invoke ICADLibrary "Insert" "{1D0DE154-8841-448B-A9CD-9C06AFB033DF}" xml)

    (setq obj (entlast))
    (setq vlaobj (vlax-ename->vla-object obj))
    (setq Elm (vlax-get-property vlaobj "Element"))
    (setq Param_List (vlax-get-property Elm "Parameters"))
    (vlax-invoke Param_List "SetParameter" "DIM_LENGTH" "100" "Длина")
    (vlax-invoke vlaobj "UpdateGraphics")

    Но всё это работает для типа объекта Параметрическое оборудование (linCSParametricSolid), описание структуры xml для других типов объектов я не видел.
    И вероятно, что-то должно быть в SDK касательно .net, пока не смотрел SDK по этому поводу.

  • psh
    psh
    отредактировано November 2024

    Благодарю.
    Буду пробовать.
    На сколько я понимаю, как вариант, сам объект можно будет заменить габаритным параллелепипедом, чтобы придать процессу интерактивность: указание точки вставки, задание угла поворота, изменение параметров.

    Или можно вставить объект и динамически изменять его свойства?, что конечно предпочтительнее.

  • psh
    psh
    отредактировано November 2024

    Олег. Почему именно нужно редактировать ручки:
    Дело в том, что параметрический объект в ручках имеет алгоритмы управляющие параметром, а если просто задать свойство, то эти алгоритмы не будут учтены.
    Например, в ручке заданы максимальное значение, шаг и т.п., которые можно принимать параметру.
    Если применить параметру длины значение из GetDistance или Jig, то можно задать некорректное значение длины именно для конкретного объекта.

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

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

  • С другой стороны, кто мешает определить длину через параметр!!!, А положение ручки тоже сделать функцией.

  • psh
    psh
    отредактировано November 2024

    видео: параметр назначается ручкой, и положение ручки определяет параметр https://disk.yandex.ru/i/8uLY4vDLjP0FlA

  • Oleg
    отредактировано November 2024

  • psh
    psh
    отредактировано November 2024

    Коллеги, не подскажете, на какие библиотеки ссылаются подчеркнутые функции из примера Руководства по API?
    в наличии:

    ps (программирую время от времени).

  • не понос, так золотуха.

    получение объекта библиотеки
    dynamic library = Marshal.GetActiveObject("LibManager.CADLibrary.1");

    на NET4,8 не ругается, но не компилируется под 23
    на 6,0 ругается и не компилируется



  • Чтобы работало на .net 6 объявил новый класс Marshal2

    И в нем новый метод со вставкой из библиотек на C++. Метод перебирает зарегистрированные COM интерфейсы и ищет среди них LibManager.CADLibrary.1

  • Олег, премного благодарен.
    Вставка отлично работает.

    https://disk.yandex.ru/i/mv1Vs6MDUZutmg

    Надеюсь мне удастся осуществить задуманное.

  • psh
    psh
    отредактировано December 2024

    На текущий момент удалось сделать вставку объекта из палитры по коду Олега.

    Сделать панель инструментов с командами для вставки параметрических объектов из базы средствами наноКАДа не удалось, но я и не старался, ибо есть собственная.
    Получить доступ к ручкам во время выполнения команды //пока// не удается.
    https://disk.yandex.ru/i/FfDbdS24kLnJTQ

  • Есть более лаконичный вариант получения COM. Без перебора. Но у меня он на некоторых компьютерах вызывает ошибку. С чем связана ошибка не знаю.