林霄云 发表于 2013-12-31 22:55:26

反应器学习经典案例解析及测试

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


http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 林霄云的微博

s678z 发表于 2014-1-2 08:51:20

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

林霄云 发表于 2014-1-2 09:12:41

s678z 发表于 2014-1-2 08:51 static/image/common/back.gif
图纸序号和明细表内的序号能否用反应器关联?

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

hnfsf 发表于 2014-5-7 10:44:53

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

尘缘一生 发表于 2014-10-29 18:31:34

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

Gu_xl 发表于 2014-10-29 19:27:27

本帖最后由 Gu_xl 于 2014-10-29 19:32 编辑

尘缘一生 发表于 2014-10-29 18:31 static/image/common/back.gif
到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?
将这段代码保存为lsp文件,添加到启动组或加到acad.lsp中即可!
(or *osmodemonitor*   (setq *osmodemonitor*
           (vlr-lisp-reactor
             nil
             '((:VLR-lispWillStart . SaveOsmode)
             (:vlr-lispEnded . ResetOsmode)
             (:vlr-lispCancelled . ResetOsmode)
              )
           )
    )
)                                ;反应器构造
;;回调函数
(defun SaveOsmode (v1 v2)
(setq *LastOsmode* (getvar 'osmode))
   (princ)
)
(defun ResetOsmode (v1 v2)
(if (and *LastOsmode*
           (/= (getvar "osmode") *LastOsmode*)
           )
    (setvar "osmode" *LastOsmode*)
)
   (princ)
)

dbqtju 发表于 2015-3-25 17:36:04

正在看反应器,收藏了。
页: [1]
查看完整版本: 反应器学习经典案例解析及测试