本帖最后由 林霄云 于 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要灵活轻巧许多。


该贴已经同步到 林霄云的微博

网友答: 图纸序号和明细表内的序号能否用反应器关联?

网友答:
s678z 发表于 2014-1-2 08:51
图纸序号和明细表内的序号能否用反应器关联?

这是一个不错的想法。
反应器的主要任务就是找出与需要对应的事件,定义事件处理函数。
最近画图忙,有时间再想这个逻辑。

网友答: 图纸目录用这个不是很科学,还是考虑重新生成比较好

网友答: 到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?

网友答: 本帖最后由 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. )


网友答: 正在看反应器,收藏了。

网友答:
Gu_xl 发表于 2014-10-29 19:27
将这段代码保存为lsp文件,添加到启动组或加到acad.lsp中即可!

楼主的editor反应器中可以正常触发事件,但是你的无法lisp反应器中的:vlr-lispEnded 事件,无法正常触发,我的CAD版本是AUTOCAD2021机械版,非机械版也不行。请版主测试。

网友答: 试一试,这个问题扔给AI。看它怎么聊的。
  • 上一篇:关于物理硬盘序列号
  • 下一篇:没有了