В зависимости от режима отображения в интерфейсе появляется ранее сформированный функцией ParamList список значений. Если в интерфейсе выводится список параметров примитива Платформы nanoCAD, кнопка переключения режима отображения неактивна (рис. 6), так как только у объектов nanoCAD BIM Строительство (конфигурация «Конструкции») в параметрах есть заголовок и имя.
После обработки диалогового окна данные о синхронизируемых атрибутах передаются в соответствующие функции синхронизации 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). Под ведущим подразумевается объект, с которого копируется значение синхронизируемого параметра.
В ID связываемого объекта присваивается значение handle ведомого объекта. Handle — это уникальный для этого чертежа ID объекта. С его помощью через
Дополнительный ID связываемого объекта создается и в ведомом объекте. Также создается формула, которая была указана в списке параметров ведомого объекта (рис. 9). В него копируется значение соответствующего параметра из ведущего объекта.
ID связываемого объекта содержит значение handle ведущего объекта, с его помощью ведомый объект обращается к ведущему и получает значение синхронизируемого атрибута.
Формула, создаваемая в ведомом объекте, содержит
Также в формуле учитывается пересчет значения: формула пересчета задается в окне пользовательского интерфейса (рис. 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). Формула, создаваемая в ведомом объекте, содержит
ID связываемого объекта содержит handle примитива Платформы. Значение handle используется в формуле, которая считывает значение с примитива Платформы (рис. 13).
Однако в отличие от 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 Строительство (конфигурация «Конструкции»).
Описанная утилита навряд ли имеет практическое применение в повседневном использовании, однако отдельные продемонстрированные приемы могут быть использованы в других автоматизациях. Например, можно улучшить механизм создания металлопроката по полилинии/отрезкам, чтобы создаваемый металлопрокат ассоциировался с полилинией/отрезком; в этом случае изменение исходных примитивов изменяло бы элементы металлопроката.
Использование дополнительных средств автоматизации позволяет ускорить и упростить работу