ADN Club > AutoLisp / VisualLISP и DCL

Параметры удалённого примитива.

(1/3) > >>

Macondo:
В процессе изучения реакторов появилась задача отследить удаление определённых объектов (с расширенными данными) с чертежа.
Для тестирования был написан такой код:

--- Код - Auto/Visual Lisp [Выбрать] ---(defun object-reactors ( / ) (vl-load-com) (vlr-remove-all) (setq object-reactor (vlr-acdb-reactor nil '((:VLR-objectErased . object-erased)                                                                         (:VLR-objectUnerased . object-unerased)))))

--- Код - Auto/Visual Lisp [Выбрать] ---(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, потому что у удалённого примитива невозможно посмотреть свойства.

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

Александр Ривилис:
Средствами lisp нельзя получить информацию о расширенных данных удалённого примитива. Поэтому я вижу два альтернативных способа:
1) восстанавливать примитив: (entdel en), получать информацию и удалять повторно.
ресурсы оперативной памяти не потребуются, т.к. при удалении примитива память не освобождается. Но нужно будет контролировать повторное попадание в реактор.
2) Написать функцию с использованием ObjectARX (C++) или AutoCAD .NET API (C#, VB.NET, ...) - в них можно работать с удалёнными примитивами.

Macondo:

--- Цитата: Александр Ривилис от 18-10-2015, 12:06:46 ---1) восстанавливать примитив: (entdel en), получать информацию и удалять повторно.
--- Конец цитаты ---
Бился-бился, пытаясь воплотить в жизнь это решение, а потом прочитал у Николая Полещука в книге:

--- Цитировать ---"Объект, который стал источником события, не может быть модифицирован из функции действия, реагирующей на это событие".
--- Конец цитаты ---

Алексей Кулик:
Я бы выполнял эти проверки перед удалением, если это возможно. Объектные реакторы стараюсь вообще не использовать - от них (судя по моему опыту) проблем больше, чем решений.

Macondo:
Алексей Кулик, AcDb — это ведь не объектные реакторы, а ректоры базы чертежа, или ты не в этом смысле?

--- Цитата: Алексей Кулик от 18-10-2015, 15:14:36 ---Я бы выполнял эти проверки перед удалением, если это возможно
--- Конец цитаты ---
Перед удалением тоже должно что-то сработать для запуска проверки. Что, если не реактор?

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии