本帖最后由 林霄云 于 2013-12-31 23:08 编辑
防止捕捉丢失——一个案例体会反应器博大
通俗讲,反应器原理就是程序内部捕捉到的事件后,执行与其关联的事件处理函数(即回调函数被动执行)。上案例
;;*************防止lisp程序改变捕捉 By free-Lancer
;;http://www.xdcad.net/forum/thread-670615-1-1.html
为了深刻理解:vlr-lispEnded和:vlr-lispCancelled 事件处理过程,做测试代码testos
复制代码结果:
(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要灵活轻巧许多。
该贴已经同步到 林霄云的微博网友答:
图纸序号和明细表内的序号能否用反应器关联?网友答:
这是一个不错的想法。
反应器的主要任务就是找出与需要对应的事件,定义事件处理函数。
最近画图忙,有时间再想这个逻辑。网友答: 图纸目录用这个不是很科学,还是考虑重新生成比较好网友答: 到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?网友答: 本帖最后由 Gu_xl 于 2014-10-29 19:32 编辑
将这段代码保存为lsp文件,添加到启动组或加到acad.lsp中即可!
网友答:
正在看反应器,收藏了。网友答:
楼主的editor反应器中可以正常触发事件,但是你的无法lisp反应器中的:vlr-lispEnded 事件,无法正常触发,我的CAD版本是AUTOCAD2021机械版,非机械版也不行。请版主测试。网友答: 试一试,这个问题扔给AI。看它怎么聊的。
防止捕捉丢失——一个案例体会反应器博大
通俗讲,反应器原理就是程序内部捕捉到的事件后,执行与其关联的事件处理函数(即回调函数被动执行)。上案例

- (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)
- )
- );反应器构造函数关联事件与回调函数。事件名称及其说明请查开发人员文档
;;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要灵活轻巧许多。
s678z 发表于 2014-1-2 08:51
图纸序号和明细表内的序号能否用反应器关联?
这是一个不错的想法。
反应器的主要任务就是找出与需要对应的事件,定义事件处理函数。
最近画图忙,有时间再想这个逻辑。网友答: 图纸目录用这个不是很科学,还是考虑重新生成比较好网友答: 到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?网友答: 本帖最后由 Gu_xl 于 2014-10-29 19:32 编辑
尘缘一生 发表于 2014-10-29 18:31
到底怎么用的?这个问题一头雾水,还没有解决的好办法,说一些东西,不告诉别人用法,有什么用?
将这段代码保存为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)
- )
Gu_xl 发表于 2014-10-29 19:27
将这段代码保存为lsp文件,添加到启动组或加到acad.lsp中即可!
楼主的editor反应器中可以正常触发事件,但是你的无法lisp反应器中的:vlr-lispEnded 事件,无法正常触发,我的CAD版本是AUTOCAD2021机械版,非机械版也不行。请版主测试。网友答: 试一试,这个问题扔给AI。看它怎么聊的。