最近研究了一段时间反应器,主要想实现的效果:移动文本之后,自动将文本内容更新为当前插入点的x坐标。
折腾了很久,总算初步实现了目标,与大家共享,顺便看看代码是否有可改进之处。
- ;程序能实现的效果:当移动文本对象时,会弹出一次123,并将文本内容更新为文本对象当前的x坐标。
- (defun c:tt1()
- (vl-load-com)
-
- (defun call_bk_cmdend(reactor_obj parameter-list)
- ;首先删除本命令反应器,确保修改一次文本,仅激活一次命令反应器。
- (vlr-remove reactor_obj)
- ;临时删除对象反应器,以对文本对象进行修改。后面还需要添加回来。
- (vlr-remove *TextReactor*)
-
- ;【开始】激活文本对象反应器之后,需要执行的操作,也可以对文本本身进行操作,而不会引发循环的激活。
- (alert "123")
- ;vlr-data函数用来获取命令反应器的data信息,也就是文本对象,在这里将文本对象的内容设置为插入点的x坐标。
-
- ;目前不太理解的是,当重新编辑文本的时候,会弹出两次alert 123,也就是执行了两次命令反应器,尚不清楚机理是什么。
- (vla-put-TextString (vlr-data reactor_obj) (car(vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint (vlr-data reactor_obj))))))
- ;【结束】
-
- ;将对象反应器再添加回来。
- (vlr-add *TextReactor*)
-
- )
-
- ;文本反应器的回调函数
- (defun textedit(owner reactor_object parameter-list )
- ;激活命令反应器,注意此时将文本对象作为data,以供命令反应器的回调函数进行处理。
- (vlr-command-reactor owner '((:vlr-commandended . call_bk_cmdend)))
- )
-
- (setq text_obj (vlax-ename->vla-object(car(entsel))))
- ;初次建立文本的对象反应器
- (setq *TextReactor*
- (vlr-object-reactor
- (list text_obj )
- nil
- '((:vlr-modified . textEdit))
- )
- )
- )
|