я начертил в чертеже заливку.
Это каким-то образом отслеживается и запускается лисп, в котором последний созданный объект (в данном случае штриховка) премещается на слой "HATCH"
Потом управление передается обратно командной строке.
То же самое с текстом: на слой "TEXT"
И размерами: на слой "DIM"
Может быть реакторами?
В идеале, если нажатие ПРОБЕЛа (ENTER или правый щелчок мыши), вызывало бы команду, которая запускалась ДО запуска "перехватчика". И UNDO отменяла тоже эту команду.
Но это в идеале и думаю трудно осуществимо.
; Если racsb-реактор изменения базы и rcom-реактор завершения команды
;уже существуют в рисунке , то мы их не создаем
; При наступлении события изменения базы запускается функция отклика dataobj
;При наступлении события завершения команды запускается функция отклика ismlay
(if
(not racdb)
(setq racdb (vlr-acdb-reactor
nil
(list
'(:vlr-objectappended . dataobj)
)
)
)
)
(if
(not rcom)
(setq rcom (vlr-command-reactor
nil
(list
'(:vlr-commandended . ismlay)
)
)
)
)
;*******************************************************
;Здесь должна быть проверка на наличие в рисунке реакторов подобного типа
;и проверка на включенность-выключенность реакторов этих и подобных через
;vlr-added-p , включение нужных , отключение ненужных через vlr-add и vlr-remove
;***********************************************************
)
; функция отклика получает аргументы а-указатель на реактор,(cadr b)-имя создаваемого
;объекта
(defun dataobj (a b)
(setq vl-obj (vlax-ename->vla-object
(cadr b)
); указатель на VLA объект
name-obj (vla-get-objectname vl-obj);тип(имя) VLA объекта
)
;Изменения в базе происходят до окончательного создания объекта
;т.е допустим запущена команда line (при указании 1 точки отрезка
;ACAD уже создает его имя и записывает информацию о нем в базу ,
;поэтому изменить свойства примитива из этой функции нельзя , нужно
;отслеживать событие завершение команды.
)
; Функция отклика получает аргументы x-указатель на реактор , Y-имя завершенной
;команды в виде '(LINE)
(defun ismlay (x y)
;если имя завершенной команды соответствует именам указанным в списке ниже , то
(if
(member (car y)
'("TEXT" "DTEXT" "MTEXT" "HATCH"
"BHATCH" "DIMALIGNED" "DIMLINEAR" "DIMANGULAR"
)
)
(progn
; выполняется проверка какого типа объект создан и в
;соответствии с типом объекту присваивается слой
;тип объекта функция берет из переменной name-obj указатель из vl-obj
;определенных в функции dataobj
(cond
(
(equal name-obj "AcDbHatch")
(vla-put-Layer vl-obj "HATCH")
)
(
(or
(equal name-obj "AcDbText")
(equal name-obj "AcDbMText")
)
(vla-put-Layer vl-obj "TEXT")
)
(
;если в имени объекта присутствует фраза "Dimens" , то объекту
;присваивается слой DIM
(vl-string-search "Dimens" name-obj)
(vla-put-Layer vl-obj "DIM")
)
)
)
)
(princ)
)
; код можно упростить , но писал быстро что в голову пришло , т.к. времени
; не очень много.