20060510412 发表于 2022-9-12 16:22:58

在反应器的回调函数中,实现修改对象本身

最近研究了一段时间反应器,主要想实现的效果:移动文本之后,自动将文本内容更新为当前插入点的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))
    )
)
)

20060510412 发表于 2022-9-12 17:08:19

本帖最后由 20060510412 于 2022-9-12 17:09 编辑

guosheyang 发表于 2022-9-12 17:06
哦试了下单行文字有问题   mt的就可以
示意图里面就是单行文本,我演示的都正常啊。

我也是刚刚摸索出了这么个方法,可能会有漏洞,大家一起研究。

大致的思路就是在对象反应器里面,再创建一个命令反应器,然后在命令反应器里面实现对文本内容的更改。

如果直接在对象反应器里面修改文本内容,是会导致cad崩溃的。

freedom_ice 发表于 2022-11-9 13:49:01

http://bbs.mjtd.com/thread-186442-1-1.html?_dsign=52ed86ac
交流一下,我写了个类似的反应器,可以实现功能。我不确定这算不算在反应器里修改图元本身。
一般的图里面可以使用,但是比较大的图里就会有卡顿。
似乎在图纸刷新和保存的时候都会触发反应器。
有没有什么办法可以优化触发反应器的条件。
CAD本身的填充据说也是反应器,不知道是怎么实现的。

20060510412 发表于 2022-11-9 21:50:20

freedom_ice 发表于 2022-11-9 13:49
http://bbs.mjtd.com/thread-186442-1-1.html?_dsign=52ed86ac
交流一下,我写了个类似的反应器,可以实现 ...

我对反应器也仅仅支持了解了一些皮毛,而且没怎么在实际中应用。
根据我的粗浅了解,lisp的反应器貌似并不是非常实用。
反应器多了的话影响速度,而且编辑的逻辑也特别绕,用起来性价比不高。

guosheyang 发表于 2022-9-12 17:03:39

朋友,我加载运行tt1   移动文字后   那个弹出的123   按确定后 不消失   要一直按着esc键最后才消失掉   请问是我哪里没操作对头吗    谢谢!

guosheyang 发表于 2022-9-12 17:06:17

哦试了下单行文字有问题   mt的就可以

guosheyang 发表于 2022-9-12 17:07:57

还有请问能否x y z 坐标都显示?

guosheyang 发表于 2022-9-12 17:09:04

主要是不懂反应器 莫法自己修改

20060510412 发表于 2022-9-12 17:13:03

guosheyang 发表于 2022-9-12 17:07
还有请问能否x y z 坐标都显示?

(vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint (vlr-data reactor_obj))))

这个是返回的文本对象的3d坐标,我用car函数取的x坐标,你可以用list->string函数,直接获取x、y、z坐标。

guosheyang 发表于 2022-9-12 17:22:40

20060510412 发表于 2022-9-12 17:13
(vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint (vlr-data reactor_obj))))

这个 ...

好的   可能是我的CAD有点问题   有时候去不掉弹出文字

20060510412 发表于 2022-9-12 17:32:38

guosheyang 发表于 2022-9-12 17:22
好的   可能是我的CAD有点问题   有时候去不掉弹出文字

弹窗主要用来探测回调函数执行的次数,你可以直接把那句注释掉。
我在源代码里面也注明了,当直接修改文本内容的时候,会弹出2次,我也有点弄不明白。
如果仅仅是移动文字,只会弹出1次。

liuhe 发表于 2022-9-12 19:01:23

建议你研究下动态块,这个可能更适合你。你去百度一下,看看如何实现用动态块实现自动标高。不需要复杂的程序就可以实现
页: [1] 2 3
查看完整版本: 在反应器的回调函数中,实现修改对象本身