找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3321|回复: 9

[推荐]:关于反应器使用的很好例子

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-8-5 06:48:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
http://www.xdcad.net/forum/showthread.php?s=&threadid=218672

搜索到一个例子

  1. (if (not myreactor1)
  2.   (setq        MyReactor1
  3.          (vlr-dwg-reactor
  4.            nil
  5.            '((:vlr-BeginSave . DoThisBeforeSave)
  6.              (:vlr-SaveComplete . DoThisAfterSave)
  7.             )
  8.          )
  9.   )
  10. )
  11. (defun DoThisAfterSave (Caller CmdSet)
  12.   (alert "You just saved the drawing!")
  13.   (princ)
  14. )
  15. (defun DoThisBeforeSave        (Caller CmdSet)
  16.   (alert "You are about to save the drawing!")
  17.   (princ)
  18. )
  19. (defun Clear_My_Reactors ()
  20.   (if (and MyReactor1
  21.            (vlr-added-p MyReactor1)
  22.       )
  23.     (vlr-remove MyReactor1)
  24.   )
  25. )
  26. (defun Clear_All_Reactors (/ TMP)
  27.   (vlr-remove-all :vlr-dwg-reactor)
  28. )


[iframe h=600]http://cadence.advanstar.com/newsletter/cad_manager/0602_2.html[/iframe]

CAD的反应器类型:

1  Vlr-acdb-reactor
  AutoCAD 数据库反应器在从图形数据库中加入、修改或删除对象时通知应用程序。

2   vlr-command-reactor
    AutoCAD 命令反应器,对命令事件给出通知。

3   vlr-docmanager-reactor
   文档反应器,通知与图形文档相关的事件

4    vlr-dwg-reactor
图形反应器,通知图形事件(如打开或关闭图形文件)

5   vlr-dxf-reactor
   DXF编辑器反应器,通知与读写 DXF 文件相关的事件

6    vlr-editor-reactor
  编辑器反应器

7    vlr-linker-reactor
ARX链接应器,在每次应用程序加载或卸载 ObjectARX 应用程序时通知应用程序

8   vlr-lisp-reactor
LISP事件反应器,通知 LISP 事件

9   vlr-xref-reactor
Xref 事件反应器,在发生贴附或修改外部参照事件时通知应用程序。

10  vlr-window-reactor
窗口反应器,在发生与移动或缩放 AutoCAD 窗口相关的事件时通知应用程序。

11 vlr-wblock-reactor
Wblock反应器,在发生与写块相关的事件时通知应用程序。

12  vlr-undo-reactor
Undo反应器,构造通知放弃操作的编辑器反应器。

13   vlr-toolbar-reactor
Toolbar反应器,在工具栏中的位图改变时通知应用程序。

14  vlr-sysvar-reactor
系统变量反应器,在修改系统变量时通知应用程序

15   Vlr-object-reactor
Object反应器,对象操作时通知应用程序

16   vlr-mouse-reactor
Mouse反应器,通知鼠标事件(如双击)

17   vlr-miscellaneous-reactor
miscellaneous反应器,不属于任何其他编辑器反应器类型。

18 vlr-insert-reactor
  通知与块插入相关的事件。





 
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-8-5 07:21:59 | 显示全部楼层
Lockdwg 的原理是利用反应器禁止对图形操作,并没有采用禁止命令的方式,只不过在执行非授权操作前先 erase 所有实体。

比如将上面的 DoThisAfterSave 函数换成下面的形式


  1. (defun DoThisAfterSave (Caller CmdSet)
  2.   (vlax-map-collection
  3.     (vlax-get-property
  4.       (vlax-get-property (vlax-get-acad-object) 'activedocumment)
  5.       'modelspace
  6.     )
  7.     '(lambda (x) (vla-delete x))
  8.   )
  9.   (princ)
  10. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2004-8-5 10:56:42 | 显示全部楼层
反应器是Vlisp中一个强大的功能,有了它你可以编辑出很多方便的编辑功能!
比如我们常用的坐标标注,要是用了反应器,每一个坐标标注后,可以在移动坐标标注线的标注点处的顶点时,即时更新标注坐标值,而在移动坐标标注线的文字端的顶点时,可以同时移动文字,及标注线。总之,可以做得和系统的标注一样的即时性,方便性了。这个思路,大家共同来看看!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-8-5 11:56:01 | 显示全部楼层
上午花了很长时间看反应器部分,一点成果。
先研究反应器部分,加密与还原部分有兴趣请各抒己见。

[B]注意:Lisp 不熟悉者切勿在绘图时加载本程序,切记!![/B]


  1. ;;设定自动保存时间,10个小时最大值了
  2. (setvar "savetime" 600)
  3. (setvar "pickfirst" 0)
  4. ;(command ".undo" "a" "off")
  5. ;(command ".undo" "c" "n")
  6. ;;对2000以上,先关闭后设置
  7. (if (not *myDoc*)
  8.   (setq
  9.     *myDoc* (vlax-get-property (vlax-get-acad-object) 'activedocument)
  10.   )
  11. )
  12. ;;禁止保存
  13. (if (not myDWGReactor)
  14.   (setq        myDWGReactor
  15.          (vlr-dwg-reactor
  16.            nil
  17.            '((:vlr-beginsave . DelAllObject))
  18.          )
  19.   )
  20. )
  21. ;;Lisp反应器
  22. (if (not myLispReactor)
  23.   (setq        myLispReactor
  24.          (vlr-lisp-reactor
  25.            nil
  26.            '((:vlr-lispWillStart . DelAllObject))
  27.          )
  28.   )
  29. )
  30. ;;系统变量反应器
  31. (if (not mySysvarReactor)
  32.   (setq        mySysVarReactor
  33.          (vlr-sysvar-reactor
  34.            nil
  35.            '((:vlr-sysvarchanged . myResetSysvar))
  36.          )
  37.   )
  38. )
  39. ;;这里可以禁止使用的命令
  40. (if (not myCommandReactor)
  41.   (setq        myCommandReactor
  42.          (vlr-command-reactor
  43.            nil
  44.            '((:vlr-commandwillstart . myTestCommand))
  45.          )
  46.   )
  47. )
  48. (if (not myWblockReactor)
  49.   (setq        myWblockReactor
  50.          (vlr-wblock-reactor
  51.            nil
  52.            '((:VLR-wblockNotice . DelAllObject))
  53.          )
  54.   )
  55. )
  56. ;;设置自动保存时间
  57. (defun myResetSysvar (var1 var2)
  58.   ;;(princ var2)
  59.   (cond
  60.     ((/= (getvar "savetime") 600)
  61.      (setvar "savetime" 600)
  62.     )
  63.     ((/= (getvar "pickfirst") 0)
  64.      (setvar "pickfirst" 0)
  65.     )
  66.     (t)
  67.   )
  68. )
  69. ;;提示可以自己定制了
  70. (defun myAlert ()
  71.   (alert "\n★★ 版  权  所  有 ★★")
  72.   (princ)
  73. )
  74. ;;删除当前所有实体
  75. (defun e:DelALL        ()
  76.   (vlax-map-collection
  77.     (vlax-get-property *myDoc* 'modelspace)
  78.     '(lambda (x)
  79.        (vla-delete x)
  80.      )
  81.   )
  82. )
  83. ;;反应器回调函数
  84. (defun DelAllObject (var1 var2)
  85.   (e:delall)
  86.   (myAlert)
  87.   (princ)
  88. )
  89. ;;禁止运行的命令
  90. (defun myTestCommand (var1 var2)
  91.   ;(princ var2)
  92.   ;(princ var1)
  93.   (if (Wcmatch (strcase (vl-princ-to-string (car date))) "*NEW")
  94.     (progn
  95.       (e:delall)
  96.       (myalert)
  97.   )
  98.   (princ)
  99. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-5 13:00:18 | 显示全部楼层
重點是如何騙他加載程序!
加密与还原才是重頭戲!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-8-5 13:12:23 | 显示全部楼层
CAD有几个文件是一定加载的,2000+以上是 acad200xdoc.lsp ,acad.lsp 是可以用变量控制的。如果将 acad200xdoc.lsp 编译为 vlx 和DWG一个目录下是肯定加载的。
在vlx文件中就保存了还原部分。

当然这种Vlr反应器目前已发现的就有几个不理想的地方,测试中。作为一种技术还是值得探讨的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-5 13:29:32 | 显示全部楼层
不理想的地方
1.想方法禁用vlr-remove-all
2.myAlert觸發了兩次(避免觸發成回圈)
3.每個回調函數要有(vl-load-com)
4.回調函數只能用activeX (SETVAR最好不要用)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-8-5 13:47:09 | 显示全部楼层
最初由 LUCAS 发布
[B]不理想的地方
1.想方法禁用vlr-remove-all
2.myAlert觸發了兩次(避免觸發成回圈)
3.每個回調函數要有(vl-load-com)
4.回調函數只能用activeX (SETVAR最好不要用) [/B]

1 行不通的,vlx 编译后在自己的 namespace  ,是无法 list 和 remove 的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-8-6 06:55:10 | 显示全部楼层
最初由 eachy 发布
[B]上午花了很长时间看反应器部分,一点成果。
先研究反应器部分,加密与还原部分有兴趣请各抒己见。

[B]注意:Lisp 不熟悉者切勿在绘图时加载本程序,切记!![/B]

[code]
;;设定自动保存?... [/B]

反应器写的太多,其实一个就够了 EditorReactor,斑竹可以查看联机帮助除了Wblock其他的都包括在内。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-5-21 21:06:39 | 显示全部楼层
努力学习,提高能力,多谢版主!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-9 23:13 , Processed in 0.266997 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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