明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5265|回复: 6

[讨论] 反应器学习经典案例解析及测试

[复制链接]
发表于 2013-12-31 22:55 | 显示全部楼层 |阅读模式
本帖最后由 林霄云 于 2013-12-31 23:08 编辑

防止捕捉丢失——一个案例体会反应器博大
通俗讲,反应器原理就是程序内部捕捉到的事件后,执行与其关联的事件处理函数(即回调函数被动执行)。上案例
  1. (setq HH:Osmode (getvar "osmode"));定义初始化。在初始时和你需要的时候重置之。

  2. (defun ResetOsmode (v1 v2)
  3.   (if (/= (getvar "osmode") HH:Osmode)
  4.     (setvar "osmode" HH:Osmode)
  5.   )
  6.    (princ)
  7. );defun 定义回调函数
  8. (vlr-editor-reactor
  9.   nil
  10.   '((:vlr-lispEnded . ResetOsmode)
  11.     (:vlr-lispCancelled . ResetOsmode)
  12.    )
  13. );反应器构造函数关联事件与回调函数。事件名称及其说明请查开发人员文档
;;*************防止lisp程序改变捕捉 By free-Lancer
;;http://www.xdcad.net/forum/thread-670615-1-1.html

为了深刻理解:vlr-lispEnded和:vlr-lispCancelled 事件处理过程,做测试代码testos
  1. (defun testos()
  2.   (VL-CMDF "line" (getpoint "点位置?") '(0 0) "")
  3.   (command "line" (getpoint "点位置?") '(0 0) "")
  4.   (princ (getvar "osmode"))
  5.   
  6.   (setvar "osmode" 0);修改
  7.   
  8.   (VL-CMDF "line" (getpoint "点位置?") '(0 0) "")
  9.   (command "line" (getpoint "点位置?") '(0 0) "")
  10.   (princ (getvar "osmode"))
  11.   
  12.   (princ)
  13.   )
  1. (princ "run once \n");此句代码替换回调函数ResetOsmode最末的(princ)以记录事件调用次数。
复制代码
结果:
(testos) 点位置?点位置?15359点位置?点位置?0
run once
run once

(testos) 点位置?点位置?15359点位置?点位置?0
run once
run once

在cad命令窗口,当用(setvar "osmode" 2303)失败。当在cad中用ds命令能设置成功。

在testos执行中修改osmode可以顺利进行。当退出函数时,在cad命令窗口中检查(getvar "osmode"),osmode值为成功重置。
初步结论:用反应器事件解决osmode丢失的gifted牛人比粗暴的做函数调用setvar要灵活轻巧许多。


该贴已经同步到 林霄云的微博
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2014-1-2 08:51 | 显示全部楼层
图纸序号和明细表内的序号能否用反应器关联?
 楼主| 发表于 2014-1-2 09:12 | 显示全部楼层
s678z 发表于 2014-1-2 08:51
图纸序号和明细表内的序号能否用反应器关联?

这是一个不错的想法。
反应器的主要任务就是找出与需要对应的事件,定义事件处理函数。
最近画图忙,有时间再想这个逻辑。
发表于 2014-5-7 10:44 | 显示全部楼层
图纸目录用这个不是很科学,还是考虑重新生成比较好
发表于 2014-10-29 18:31 | 显示全部楼层
到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?
发表于 2014-10-29 19:27 | 显示全部楼层
本帖最后由 Gu_xl 于 2014-10-29 19:32 编辑
尘缘一生 发表于 2014-10-29 18:31
到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?

将这段代码保存为lsp文件,添加到启动组或加到acad.lsp中即可!
  1. (or *osmodemonitor*     (setq *osmodemonitor*
  2.            (vlr-lisp-reactor
  3.              nil
  4.              '((:VLR-lispWillStart . SaveOsmode)
  5.                (:vlr-lispEnded . ResetOsmode)
  6.                (:vlr-lispCancelled . ResetOsmode)
  7.               )
  8.            )
  9.     )
  10. )                                ;反应器构造
  11. ;;回调函数
  12. (defun SaveOsmode (v1 v2)
  13.   (setq *LastOsmode* (getvar 'osmode))
  14.    (princ)
  15. )
  16. (defun ResetOsmode (v1 v2)
  17.   (if (and *LastOsmode*
  18.            (/= (getvar "osmode") *LastOsmode*)
  19.            )
  20.     (setvar "osmode" *LastOsmode*)
  21.   )
  22.    (princ)
  23. )
发表于 2015-3-25 17:36 | 显示全部楼层
正在看反应器,收藏了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 09:42 , Processed in 0.468304 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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