В процессе изучения реакторов появилась задача отследить удаление определённых объектов (с расширенными данными) с чертежа.
Для тестирования был написан такой код:
(defun object-reactors ( / )
(vl-load-com)
(vlr-remove-all)
(setq object-reactor (vlr-acdb-reactor nil '((:VLR-objectErased . object-erased)
(:VLR-objectUnerased . object-unerased))))
)
(defun object-erased (reactorcallback cname / )
;Если у удалённого примитива есть нужные расширенные данные, появляется сообщение:
(if (AND (assoc -3 (entget (cadr cname) '("myapp"))) (= (cdr (assoc 1000 (cdadr (assoc -3 (entget (cadr cname) '("myapp")))))) "myXdata"))
(alert "erased!")
)
(princ)
)
Вскоре выяснилось, что хоть (cadr cname) и возвращает имя удалённого примитива, но (entget (cadr cname)) возвращает nil, потому что у удалённого примитива невозможно посмотреть свойства.
Какие тут есть хитрости, чтобы всё же сделать проверку свойств удалённого примитива без его восстановления и повторного удаления, на что потребуются ресурсы оперативной памяти и времени?