我想在插入某个对象时,获得这个对象,并判定是否是一个特定的对象如块名是“aaa”,想用反应器来实现,但是vlr-insert-reactor 并不启作用,我检索了这个问题,网络上关于这个应用的案例非常少,并找到了一个英文网站,一个网友有我一样的疑问,我希望能采用这个反应器来获得插入的对象。这个反应器怎么不起作用了,还是我哪里理解错了,它的正确用法是怎样的呢,希望各位版主和高手都能给个回复,万分感谢。代码如下:
;;;=======创建insert反应器*at_inst_reactor*及回调函数==============================
(defun at_inst_reactor ()
(if (not *instReactor*)
(setq *instReactor*
(vlr-insert-reactor
nil
'((:vlr-beginInsert . inst-begin)
(:vlr-endInsert . inst-ended)
)
)
)
)
);_定义insert反应器*instReactor*
(defun inst-begin (reactor-object parameterlist)
(princ "inst-begin<")
(vl-princ-to-string parameterlist)
(princ ">\n")
)
(defun inst-ended (reactor-object parameterlist)
(princ "inst-ended<")
(vl-princ-to-string parameterlist)
(princ ">\n")
)
=========================================
英文网站的问题如下:why does vlr-insert-reactor doesn't work? (augi.com)
why does vlr-insert-reactor doesn't work?
网友答: 这个是我用错了,还是CAD版本的问题了,我的版本是autocad 机械版 2021.各位高手,看看哪里错了,折腾好几天,搜罗了好几天,没招到答案。网友答:
试一试用命令反应器看看能不能操作
网友答:
这个只是知道了用了INSERT命令,这个不知道是否插入了特定的块对象。还需要检测到这个命令后,去检测文档数据是否插入了新的指定对象,这个比较麻烦。网友答: 我使用CTRL+V,时,好像触发了:vlr-endInsert事件,难道这个inset-reactor,在插入对象时不启用?可能是真没有理解这个反应器的应用。网友答: 只要用到了反应器,所有代码尽可能多用vl-catch-all-apply,否则,各种奇葩问题网友答: “块即将插入到图形数据库中”。终于有点理解了,写一下便于后续人员刷到答案。这个反应器就是用来监测是否有块插入到图形数据库中,不管是复制粘贴过来的,还是用insert插入的外部块或者图形,只要图形数据库中无此块,就会触发。若图形数据库中有此块,用insert命令插入内部块到模型空间中,是不会触发此反应器,也就自然不会调用回调函数。网友答: 不是很明白贴主的意思 是想在插入块儿前想知道即将插入的是啥块儿 还是插入后想知道究竟插入了啥块儿名?按理说 插入命令运行时 就是让用户选择块儿名的啊 。如果想插入块儿后,确认下究竟插入的块儿是啥 插错了没? 也可以用entlast获取其块儿名啊? 为何用反应器呢?就是是要实现啥目的呢?
;;;=======创建insert反应器*at_inst_reactor*及回调函数==============================
(defun at_inst_reactor ()
(if (not *instReactor*)
(setq *instReactor*
(vlr-insert-reactor
nil
'((:vlr-beginInsert . inst-begin)
(:vlr-endInsert . inst-ended)
)
)
)
)
);_定义insert反应器*instReactor*
(defun inst-begin (reactor-object parameterlist)
(princ "inst-begin<")
(vl-princ-to-string parameterlist)
(princ ">\n")
)
(defun inst-ended (reactor-object parameterlist)
(princ "inst-ended<")
(vl-princ-to-string parameterlist)
(princ ">\n")
)
=========================================
英文网站的问题如下:why does vlr-insert-reactor doesn't work? (augi.com)
why does vlr-insert-reactor doesn't work?
I want do some thing when a block was been inserted into AutoCAD,so I make a reactor like this:
(vlr-insert-reactor nil '((:vlr-endinsert . vlr-trace-reaction)))
but it doesn't work when I have inserted any block. It seems like this reactor was never exsited.
Hope you can help me. Thanks.
============================================
Re: why does vlr-insert-reactor doesn't work?Welcome to AUGI and congrats on your first post.
I have always used a command reactor for causing commands to fire when inserting a block.
Code:
(if (not Command_Ending_Reactor) (setq Command_Ending_Reactor (vlr-command-reactor nil '((:vlr-commandended . Command_Ended_Command ) ) ) ;_ end of vlr-command-reactor ) ;_ end of setq () ;_ the reactor is already loaded ) ;_ end of if
then I define my command ended command with the in reactor name and the in command, and compare the in command to the command I am looking for, in your case "insert" or "-insert" If it matches, it will run the program.
网友答: 这个是我用错了,还是CAD版本的问题了,我的版本是autocad 机械版 2021.各位高手,看看哪里错了,折腾好几天,搜罗了好几天,没招到答案。网友答:

- (defun blkstarted (reac data)
-
- (if (wcmatch (car data) "INSERT")
- (progn
- (alert "INSERT"))
- )
- (princ)
- )
- (defun blkended (reac data)
-
- (if (wcmatch (car data) "INSERT")
- (progn
- (alert "hh INSERT"))
- )
- (princ)
- )
- (vlr-command-reactor
- "My Reactor"
- '((:VLR-commandWillStart . blkstarted)
- (:VLR-commandEnded . blkended)
- )
- )
网友答:
jun353835273 发表于 2023-10-3 21:23
试一试用命令反应器看看能不能操作
这个只是知道了用了INSERT命令,这个不知道是否插入了特定的块对象。还需要检测到这个命令后,去检测文档数据是否插入了新的指定对象,这个比较麻烦。网友答: 我使用CTRL+V,时,好像触发了:vlr-endInsert事件,难道这个inset-reactor,在插入对象时不启用?可能是真没有理解这个反应器的应用。网友答: 只要用到了反应器,所有代码尽可能多用vl-catch-all-apply,否则,各种奇葩问题网友答: “块即将插入到图形数据库中”。终于有点理解了,写一下便于后续人员刷到答案。这个反应器就是用来监测是否有块插入到图形数据库中,不管是复制粘贴过来的,还是用insert插入的外部块或者图形,只要图形数据库中无此块,就会触发。若图形数据库中有此块,用insert命令插入内部块到模型空间中,是不会触发此反应器,也就自然不会调用回调函数。网友答: 不是很明白贴主的意思 是想在插入块儿前想知道即将插入的是啥块儿 还是插入后想知道究竟插入了啥块儿名?按理说 插入命令运行时 就是让用户选择块儿名的啊 。如果想插入块儿后,确认下究竟插入的块儿是啥 插错了没? 也可以用entlast获取其块儿名啊? 为何用反应器呢?就是是要实现啥目的呢?