明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1209|回复: 22

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

[复制链接]
发表于 2022-9-12 16:22 | 显示全部楼层 |阅读模式
最近研究了一段时间反应器,主要想实现的效果:移动文本之后,自动将文本内容更新为当前插入点的x坐标。

折腾了很久,总算初步实现了目标,与大家共享,顺便看看代码是否有可改进之处。




  1. ;程序能实现的效果:当移动文本对象时,会弹出一次123,并将文本内容更新为文本对象当前的x坐标。
  2. (defun c:tt1()
  3.   (vl-load-com)
  4.   
  5.   (defun call_bk_cmdend(reactor_obj parameter-list)
  6.     ;首先删除本命令反应器,确保修改一次文本,仅激活一次命令反应器。
  7.     (vlr-remove reactor_obj)
  8.     ;临时删除对象反应器,以对文本对象进行修改。后面还需要添加回来。
  9.     (vlr-remove *TextReactor*)
  10.    
  11.     ;【开始】激活文本对象反应器之后,需要执行的操作,也可以对文本本身进行操作,而不会引发循环的激活。
  12.     (alert "123")
  13.     ;vlr-data函数用来获取命令反应器的data信息,也就是文本对象,在这里将文本对象的内容设置为插入点的x坐标。
  14.    
  15.     ;目前不太理解的是,当重新编辑文本的时候,会弹出两次alert 123,也就是执行了两次命令反应器,尚不清楚机理是什么。
  16.     (vla-put-TextString (vlr-data reactor_obj) (car(vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint (vlr-data reactor_obj))))))
  17.     ;【结束】
  18.    
  19.     ;将对象反应器再添加回来。
  20.     (vlr-add *TextReactor*)
  21.    
  22.   )
  23.   
  24.   ;文本反应器的回调函数
  25.   (defun textedit(owner reactor_object parameter-list )
  26.     ;激活命令反应器,注意此时将文本对象作为data,以供命令反应器的回调函数进行处理。
  27.     (vlr-command-reactor owner '((:vlr-commandended . call_bk_cmdend)))   
  28.   )
  29.   
  30.   (setq text_obj (vlax-ename->vla-object(car(entsel))))
  31.   ;初次建立文本的对象反应器
  32.   (setq  *TextReactor*
  33.     (vlr-object-reactor
  34.       (list text_obj )
  35.       nil
  36.       '((:vlr-modified . textEdit))
  37.     )
  38.   )
  39. )


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 3明经币 +3 收起 理由
Bao_lai + 1 很给力!
Yruz + 1 很给力!
xj6019 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2022-9-12 17:08 | 显示全部楼层
本帖最后由 20060510412 于 2022-9-12 17:09 编辑
guosheyang 发表于 2022-9-12 17:06
哦  试了下  单行文字  有问题     mt的就可以

示意图里面就是单行文本,我演示的都正常啊。

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

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

如果直接在对象反应器里面修改文本内容,是会导致cad崩溃的。
发表于 2022-11-9 13:49 | 显示全部楼层
http://bbs.mjtd.com/thread-186442-1-1.html?_dsign=52ed86ac
交流一下,我写了个类似的反应器,可以实现功能。我不确定这算不算在反应器里修改图元本身。
一般的图里面可以使用,但是比较大的图里就会有卡顿。
似乎在图纸刷新和保存的时候都会触发反应器。
有没有什么办法可以优化触发反应器的条件。
CAD本身的填充据说也是反应器,不知道是怎么实现的。
 楼主| 发表于 2022-11-9 21:50 | 显示全部楼层
freedom_ice 发表于 2022-11-9 13:49
http://bbs.mjtd.com/thread-186442-1-1.html?_dsign=52ed86ac
交流一下,我写了个类似的反应器,可以实现 ...

我对反应器也仅仅支持了解了一些皮毛,而且没怎么在实际中应用。
根据我的粗浅了解,lisp的反应器貌似并不是非常实用。
反应器多了的话影响速度,而且编辑的逻辑也特别绕,用起来性价比不高。
发表于 2022-9-12 17:03 | 显示全部楼层
朋友,我加载运行tt1   移动文字后   那个弹出的123   按确定后 不消失   要一直按着esc键  最后才消失掉   请问是我哪里没操作对头吗    谢谢!
发表于 2022-9-12 17:06 | 显示全部楼层
哦  试了下  单行文字  有问题     mt的就可以
发表于 2022-9-12 17:07 | 显示全部楼层
还有请问能否x y z 坐标都显示?
发表于 2022-9-12 17:09 | 显示全部楼层
主要是不懂反应器 莫法自己修改
 楼主| 发表于 2022-9-12 17:13 | 显示全部楼层
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坐标。
发表于 2022-9-12 17:22 | 显示全部楼层
20060510412 发表于 2022-9-12 17:13
(vlax-safearray->list(vlax-variant-value(vla-get-InsertionPoint (vlr-data reactor_obj))))

这个 ...

好的   可能是我的CAD有点问题   有时候去不掉弹出文字
 楼主| 发表于 2022-9-12 17:32 | 显示全部楼层
guosheyang 发表于 2022-9-12 17:22
好的   可能是我的CAD有点问题   有时候去不掉弹出文字

弹窗主要用来探测回调函数执行的次数,你可以直接把那句注释掉。
我在源代码里面也注明了,当直接修改文本内容的时候,会弹出2次,我也有点弄不明白。
如果仅仅是移动文字,只会弹出1次。
发表于 2022-9-12 19:01 | 显示全部楼层
建议你研究下动态块,这个可能更适合你。你去百度一下,看看如何实现用动态块实现自动标高。不需要复杂的程序  就可以实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 08:02 , Processed in 0.253499 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表