СтатьиПлатформа nanoCAD → Использование LISP для ассоциации параметров объектов nanoCAD BIM Строительство (конфигурация «Конструкции») и Платформы nanoCAD

Использование LISP для ассоциации параметров объектов nanoCAD BIM Строительство (конфигурация «Конструкции») и Платформы nanoCAD

Использование LISP для ассоциации параметров объектов nanoCAD BIM Строительство (конфигурация «Конструкции») и Платформы nanoCAD

Завершаем обзор, начатый в предыдущем номере: как с помощью языка LISP можно синхронизировать параметры объектов nanoCAD BIM и Платформы nanoCAD, даже если эти объекты не зафиксированы жестко относительно друг друга.
Часть 1, 2

В зависимости от режима отображения в интерфейсе появляется ранее сформированный функцией ParamList список значений. Если в интерфейсе выводится список параметров примитива Платформы nanoCAD, кнопка переключения режима отображения неактивна (рис. 6), так как только у объектов nanoCAD BIM Строительство (конфигурация «Конструкции») в параметрах есть заголовок и имя.

Рис. 6. Неактивная кнопка переключения Заголовок/Имя у примитива Платформы nanoCAD Рис. 6. Неактивная кнопка переключения Заголовок/Имя у примитива Платформы nanoCAD

После обработки диалогового окна данные о синхронизируемых атрибутах передаются в соответствующие функции синхронизации sinhr и sinhr2. Возможны два варианта типов синхронизируемых объектов, поэтому функций синхронизации тоже две.

Функция sinhr синхронизирует параметры двух объектов nanoCAD BIM Строительство (конфигурация «Конструкции»).

;Функция, которая обеспечивает синхронизацию параметров, когда оба объекта являются объектами MS или BIM Конструкции
(defun sinhr (Name1 Name2 List_Par1 List_Par2 obj1 obj2 formula / VlObj handle 
       vla_elm vla_elm2 vla_prop vla_prop2 vla_par vla_par2 handle2 VlObj2
       ) 
 ;Создание в комментарии COM-выражения, которое копирует значения с объекта
 (setq handle (VLA-GET-HANDLE obj1))
 (setq vla_elm (vlax-get-property obj2 "Element"))
 (setq vla_prop (vlax-get-property vla_elm "Parameters"))
 (vlax-invoke-method vla_prop "SetParameter" "HANDLE_MAN" handle 
           "ID связываемого объекта" ""
 )
 (vlax-invoke-method vla_prop 
           "SetParameter"
           name2
           ""
           (nth 1 (car (cdr (assoc Name2 (nth 1 List_Par2)))))
           (strcat "=var perem := application.ActiveDocument.HandleToObject([HANDLE_MAN]).Element.Parameters.Item(" 
               (chr 34)
               name1
               (chr 34)
               ").Value; \n"
               (Strzam formula name1)
           )
 )

 ;Создание в комментарии COM-выражения, которое обновляет графику объекта, на который скопирован параметр
 (setq handle2 (VLA-GET-HANDLE obj2))
 (setq vla_elm2 (vlax-get-property obj1 "Element"))
 (setq vla_prop2 (vlax-get-property vla_elm2 "Parameters"))
 (vlax-invoke-method vla_prop2 "SetParameter" "HANDLE_MAN" handle2 
           "ID связываемого объекта" ""
 )
 (setq objname (vla-get-objectname obj2))
 (setq katob (or 
        (= objname "irnAxis")
        (= objname "msConcreteBeam")
        (= objname "msConcreteColumn")
       )
 )

 (if (= katob T) 
  (vlax-invoke-method vla_prop2 
            "SetParameter"
            "PARAM_UPDATE"
            ""
            "Параметр для обновления графики"
            (strcat "=application.ActiveDocument.HandleToObject([HANDLE_MAN]).ScaleEntity(" 
                (chr 34)
                "0,0,0"
                (chr 34)
                ", "
                (chr 34)
                "1"
                (chr 34)
                ")"
            )
  )
  (vlax-invoke-method vla_prop2 
            "SetParameter"
            "PARAM_UPDATE"
            ""
            "Параметр для обновления графики"
            (strcat "=application.ActiveDocument.HandleToObject([HANDLE_MAN]).UpdateGraphics")
  )
 )
 (princ)
)

Функция sinhr создает в ведущем объекте два новых параметра: идентификатор (ID) связываемого объекта и параметр для обновления графики (рис. 7). Под ведущим подразумевается объект, с которого копируется значение синхронизируемого параметра.

Рис. 7. Параметры, создаваемые в ведущем объекте Рис. 7. Параметры, создаваемые в ведущем объекте

В ID связываемого объекта присваивается значение handle ведомого объекта. Handle — это уникальный для этого чертежа ID объекта. С его помощью через COM-интерфейс можно обращаться к конкретному объекту. В этом случае именно так и происходит, поскольку значение handle используется в формуле параметра для обновления графики (рис. 8). Формула содержит COM-запрос для обновления графики ведомого объекта. Таким образом, при изменении ведущего объекта активируется COM-запрос для обновления графики ведомого объекта, что позволяет избежать ручного обновления графики объектов при их синхронизации.

Рис. 8. Формула параметра для обновления графики Рис. 8. Формула параметра для обновления графики

Дополнительный ID связываемого объекта создается и в ведомом объекте. Также создается формула, которая была указана в списке параметров ведомого объекта (рис. 9). В него копируется значение соответствующего параметра из ведущего объекта.

Рис. 9. Параметры, создаваемые в ведомом объекте Рис. 9. Параметры, создаваемые в ведомом объекте

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

Формула, создаваемая в ведомом объекте, содержит COM-обращение к ведущему объекту с помощью handle (рис. 10).

Рис. 10. Формула ведомого объекта, копирующая значение с ведущего объекта Рис. 10. Формула ведомого объекта, копирующая значение с ведущего объекта

Также в формуле учитывается пересчет значения: формула пересчета задается в окне пользовательского интерфейса (рис. 11).

Рис. 11. Пересчет значения по формуле из пользовательского интерфейса Рис. 11. Пересчет значения по формуле из пользовательского интерфейса

Функция sinhr2 синхронизирует изменения атрибутов примитива Платформы nanoCAD и nanoCAD BIM Строительство (конфигурация «Конструкции»).

;Функция, которая присваивает параметры для обеспечения синхронизации параметров в случае, когда один из объектов не является объектом MS или BIM Конструкции
(defun sinhr2 (Name1 Name2 List_Par2 obj1 obj2 formula / VlObj vla_elm vla_prop 
        handle handle2 spisreakc txtspisreakc
       ) 
 ;Создание в комментарии COM-выражения, которое копирует значения с объекта
 (setq handle (VLA-GET-HANDLE obj1)) ;obj1 – объект не BIM Конструкции
 (setq vla_elm (vlax-get-property obj2 "Element"))
 (setq vla_prop (vlax-get-property vla_elm "Parameters"))
 (vlax-invoke-method vla_prop "SetParameter" "HANDLE_MAN" handle 
           "ID связываемого объекта" ""
 )
 (vlax-invoke-method vla_prop 
           "SetParameter"
           name2
           ""
           (nth 1 (car (cdr (assoc Name2 (nth 1 List_Par2)))))
           (strcat "=var perem := application.ActiveDocument.HandleToObject([HANDLE_MAN])." 
               name1
               "; \n"
               (Strzam formula name1)
           )
 )

 ;создание реактора, который будет обновлять графику объекта MS или BIM Конструкции при изменении примитива.
 (setq handle2 (VLA-GET-HANDLE obj2))
 (setq spisreakc (mapcar (lambda (x) (vlr-reactions x)) 
             (vlr-get-reactors-for-object obj1)
         )
 ) ;получение списка реакций объекта
 (foreach x spisreakc 
  (setq txtspisreakc (cons (vl-princ-to-string x) txtspisreakc))
 ) ;преобразование списка реакций в список строк
 (setq reakc "((:VLR-MODIFIED . OBNOVOBJ) (:VLR-ERASED . STIROBJ) (:VLR-UNERASED . VOSTOBJ))") ;Список реакций в виде строки
 (if (= nil (member reakc txtspisreakc)) ;проверка, есть ли в назначенных объекту реакторах какой-либо, у которого в списке реакций имеется ранее назначенный список реакций этого LISP. Если есть, то реактор не назначаем. Если нет, назначаем.
  (setq MyReac (vlr-object-reactor (list obj1) 
                   handle2
                   (list '(:vlr-modified . Obnovobj) 
                      '(:vlr-erased . StirObj)
                      '(:vlr-unerased . VostObj)
                   )
         )
  )
  (vlr-pers MyReac)
 )
 (princ)
)

В функции sinhr2 ведомому объекту (объекту nanoCAD BIM Строительство (конфигурация «Конструкции»)) присваивается ID связываемого объекта, который содержит handle ведущего объекта (примитива Платформы nanoCAD). Формула, создаваемая в ведомом объекте, содержит COM-запрос к ведущему объекту с помощью handle (рис. 12).

Рис. 12. Параметры, создаваемые в ведомом объекте nanoCAD BIM Строительство (конфигурация «Конструкции») Рис. 12. Параметры, создаваемые в ведомом объекте nanoCAD BIM Строительство (конфигурация «Конструкции»)

ID связываемого объекта содержит handle примитива Платформы. Значение handle используется в формуле, которая считывает значение с примитива Платформы (рис. 13).

Рис. 13. Формула COM-запроса, которая возвращает значение параметра примитива Рис. 13. Формула COM-запроса, которая возвращает значение параметра примитива

Однако в отличие от sinhr в этом случае ведущему объекту нельзя задать формулу обновления геометрии ведомого объекта, так как ведущий объект всегда является примитивом Платформы nanoCAD и, соответственно, в нем нет функционала nanoCAD BIM Строительство (конфигурация «Конструкции») по созданию вычисляемых параметров. Решением в этом случае являются реакторы, которые позволяют расширить варианты поведения объектов. Спецификация языка LISP содержит конечный перечень реакторов, которые срабатывают при определенных событиях. Например, есть реактор событий изменения рисунка (vlr-acdb-reactor), который активирует события, связанные с добавлением, изменением, удалением примитива. Если происходит какое-либо событие для реактора, он запускает пользовательскую функцию. Таким образом, можно описывать дополнительное поведение объектов и САПР в зависимости от событий, происходящих во время работы над чертежом.

В функции sinhr2 создается реактор примитива (ведущего объекта) с реакциями на три события: изменение (Obnovobj), удаление (StirObj), восстановление (VostObj).

Для каждого из этих событий описана пользовательская функция, которая выполняется в случае наступления такого события.

(defun VostObj (vlao reac args /) 
 (print "Меня восстановили! Я возвращаю свои реакторы")
 (foreach x (vlr-get-reactors-for-object vlao) (vlr-add x) (vlr-pers x))
)

(defun Obnovobj (vlao reac args /) 
 (setq obj (vla-HandleToObject (vla-get-activedocument (vlax-get-acad-object)) 
                (vlr-data reac)
      )
 )
 (vlax-invoke-method obj "updategraphics")
)

Функция StirObj активируется в случае удаления примитива и удаляет его реакторы, а также выводит соответствующее уведомление в командную строку.

Функция VostObj активируется в случае восстановления примитива и восстанавливает реакторы примитива, а также выводит соответствующее уведомление в командную строку.

Функция Obnovobj активируется в случае изменения примитива и через COM вызывает обновление объекта nanoCAD BIM Строительство (конфигурация «Конструкции»).

Описанная утилита навряд ли имеет практическое применение в повседневном использовании, однако отдельные продемонстрированные приемы могут быть использованы в других автоматизациях. Например, можно улучшить механизм создания металлопроката по полилинии/отрезкам, чтобы создаваемый металлопрокат ассоциировался с полилинией/отрезком; в этом случае изменение исходных примитивов изменяло бы элементы металлопроката.

Использование дополнительных средств автоматизации позволяет ускорить и упростить работу инженера-проектировщика, особенно когда это касается сложных и комплексных ТИМ-систем. Программные продукты линейки nanoCAD к таким системам относятся. В этой статье была описана лишь небольшая часть возможностей автоматизации с использованием API. Если приложить немного усердия, то с помощью nanoCAD любую рутину можно превратить в решение увлекательных задач.

Узнайте подробнее о nanoCAD BIM Строительство


Олег Ачкасов,
инженер САПР ООО «Макссофт-24»
E-mail: oleg@maxsoft.ru