本帖最后由 林霄云 于 2013-12-31 23:08 编辑
防止捕捉丢失——一个案例体会反应器博大
通俗讲,反应器原理就是程序内部捕捉到的事件后,执行与其关联的事件处理函数(即回调函数被动执行)。上案例- (setq HH:Osmode (getvar "osmode"));定义初始化。在初始时和你需要的时候重置之。
- (defun ResetOsmode (v1 v2)
- (if (/= (getvar "osmode") HH:Osmode)
- (setvar "osmode" HH:Osmode)
- )
- (princ)
- );defun 定义回调函数
- (vlr-editor-reactor
- nil
- '((:vlr-lispEnded . ResetOsmode)
- (:vlr-lispCancelled . ResetOsmode)
- )
- );反应器构造函数关联事件与回调函数。事件名称及其说明请查开发人员文档
;;*************防止lisp程序改变捕捉 By free-Lancer
;;http://www.xdcad.net/forum/thread-670615-1-1.html
为了深刻理解:vlr-lispEnded和:vlr-lispCancelled 事件处理过程,做测试代码testos- (defun testos()
- (VL-CMDF "line" (getpoint "点位置?") '(0 0) "")
- (command "line" (getpoint "点位置?") '(0 0) "")
- (princ (getvar "osmode"))
-
- (setvar "osmode" 0);修改
-
- (VL-CMDF "line" (getpoint "点位置?") '(0 0) "")
- (command "line" (getpoint "点位置?") '(0 0) "")
- (princ (getvar "osmode"))
-
- (princ)
- )
- (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要灵活轻巧许多。
该贴已经同步到 林霄云的微博 |