必强反应器动作感知示例
本帖最后由 1291500406 于 2022-9-2 23:50 编辑必强反应器动作感知示例
(defun c:bb()
(defun bb:vlr-test-run ;反应器测试函数
( / bb:vlr-test)
(defun bb-chuans-vlr (vlr);反应器的翻译事件
(cond
((= vlr :vlr-objectAppended)"对象已经附加到图形数据库中。")
((= vlr :vlr-objectUnAppended)"对象已经从图形数据库中拆离,如使用 UNDO。")
((= vlr :vlr-objectReAppended)"被拆离对象在图形数据库中已经被恢复,如使用 REDO。")
((= vlr :vlr-objectOpenedForModify)"对象将被修改。")
((= vlr :vlr-objectModified)"对象已被修改。")
((= vlr :vlr-objectErased)"对象已被标记为正在删除。")
((= vlr :vlr-objectUnErased)"对象的删除标记已被清除。")
((= vlr :vlr-unknownCommand)"发出了AutoCAD未知的命令。")
((= vlr :vlr-commandWillStart)"已调用某 AutoCAD 命令。")
((= vlr :vlr-commandEnded)"已完成某 AutoCAD 命令。")
((= vlr :vlr-commandCancelled)"已取消某 AutoCAD 命令。")
((= vlr :vlr-commandFailed)"无法完成某 AutoCAD 命令。")
((= vlr :vlr-beginDeepClone)"开始 deepclone 操作。")
((= vlr :vlr-beginDeepCloneXlation)"deepclone 操作分为两个阶段。首先,复制每个对象和它拥有的任意对象。然后,将对象 ID 参照转换为副本 ID。该回调函数发生在两个阶段之间。")
((= vlr :vlr-abortDeepClone)"中断 deepclone 操作。")
((= vlr :vlr-endDeepClone)"结束 deepclone 操作。")
((= vlr :vlr-documentCreated)"创建新的图形文档(新建或打开)。在更新文档结构时有用。")
((= vlr :vlr-documentToBeDestroyed)"文档将被破坏。")
((= vlr :vlr-documentLockModeWillChange)"命令即将开始或结束对文档中元素的修改,正在获取或释放文档锁定。")
((= vlr :vlr-documentLockModeChangeVetoed)"反应器禁止从 :vlr-documentLockModeChanged 回调函数调用自己。")
((= vlr :vlr-documentLockModeChanged)"文档锁定已被获取或释放。")
((= vlr :vlr-documentBecameCurrent)"当前文档已被修改。这并不意味着文档是活动的,因为对某些操作而言,修改当前文档是必要的。要获取用户输入,必须激活文档。")
((= vlr :vlr-documentToBeActivated)"当前的非活动文档刚刚取得了活动信号,即将成为当前文档。")
((= vlr :vlr-documentToBeDeactivated)"另一个窗口(在 AutoCAD 内部或外部)已被激活。")
((= vlr :vlr-beginClose)"图形数据库将被关闭。")
((= vlr :vlr-databaseConstructed)"已经构建图形数据库。")
((= vlr :vlr-databaseToBeDestroyed)"将从内存中删除图形数据库的内容。")
((= vlr vlr-beginDwgOpen)"AutoCAD 将打开图形文件。")
((= vlr :vlr-endDwgOpen)"AutoCAD 已结束打开操作。")
((= vlr :vlr-dwgFileOpened)"新图形已被加载到 AutoCAD 图形窗口。")
((= vlr vlr-beginSave)"AutoCAD 将保存图形文件。")
((= vlr vlr-saveComplete)"AutoCAD 已将当前图形保存到磁盘。")
((= vlr :vlr-beginDxfIn)"DXF 文件的内容将被附加到图形数据库。")
((= vlr :vlr-abortDxfIn)"DXF 输入未成功。")
((= vlr :vlr-dxfInComplete)"DXF 输入成功。")
((= vlr :vlr-beginDxfOut)"AutoCAD 将要把图形数据库输出到 DXF 文件。")
((= vlr :vlr-abortDxfOut)"DXF 输出操作失败。")
((= vlr :vlr-dxfOutComplete)"DXF 输出操作成功。")
((= vlr :vlr-beginClose)"图形数据库即将关闭。")
((= vlr :vlr-beginDxfIn)"DXF 文件的内容将被附加到图形数据库。")
((= vlr :vlr-abortDxfIn)"DXF 输入未成功。")
((= vlr :vlr-dxfInComplete)"DXF 输入成功。")
((= vlr :vlr-beginDxfOut)"AutoCAD 将要把图形数据库输出到 DXF 文件。")
((= vlr :vlr-abortDxfOut)"DXF 输出操作失败。")
((= vlr :vlr-dxfOutComplete)"DXF 输出操作成功。")
((= vlr :vlr-databaseToBeDestroyed)"将从内存中删除图形数据库的内容。")
((= vlr :vlr-unknownCommand)"发出 AutoCAD 未知命令。")
((= vlr :vlr-commandWillStart)"已调用 AutoCAD 命令。")
((= vlr vlr-commandEnded)"已完成 AutoCAD 命令。")
((= vlr :vlr-commandCancelled)"已取消 AutoCAD 命令。")
((= vlr :vlr-commandFailed)"无法完成 AutoCAD 命令。")
((= vlr :vlr-lispWillStart)"将要对 AutoLISP 表达式进行求值。")
((= vlr :vlr-lispEnded)"已完成对 AutoLISP 表达式的求值。")
((= vlr :vlr-lispCancelled)"已取消对 AutoLISP 表达式的求值。")
((= vlr :vlr-beginDwgOpen)"AutoCAD 即将打开图形文件。")
((= vlr :vlr-endDwgOpen)"AutoCAD 已结束打开操作。")
((= vlr :vlr-dwgFileOpened)"新图形已被加载到 AutoCAD 图形窗口。")
((= vlr :vlr-beginSave)"AutoCAD 即将保存图形文件。")
((= vlr :vlr-saveComplete)"AutoCAD 已将当前图形保存到磁盘。")
((= vlr :vlr-sysVarWillChange)"AutoCAD 即将修改系统变量的值。")
((= vlr :vlr-sysVarChanged)"已修改系统变量的值。")
((= vlr :vlr-beginInsert)"块即将被插入图形数据库。")
((= vlr :vlr-beginInsertM)"三维转换矩阵即将被插入图形数据库。")
((= vlr :vlr-otherInsert)"块或矩阵已被添加到图形数据库。在插入过程中将对象复制到数据库之后,ID 转换或图元转换发生之前,发送该通知。")
((= vlr :vlr-endInsert)"一般表示在图形数据库上的插入操作已经完成。但是,在某些情况下,转换尚未发生,或创建的块尚未附加。这意味着复制的对象还不属于图形,在收到 :vlr-commandEnded 通知之前,不能在选择集中使用它们。")
((= vlr :vlr-abortInsert)"插入操作被中断,数据库处于不稳定状态。")
((= vlr :vlr-rxAppLoaded)"动态链接器已经加载了新的 ObjectARX 程序。该程序已完成初始化。")
((= vlr :vlr-rxAppUnLoaded)"动态链接器已经卸载了 ObjectARX 程序。该程序已清空。")
((= vlr :vlr-lispWillStart)"即将对 AutoLISP 表达式进行求值。")
((= vlr :vlr-lispEnded)"已完成对 AutoLISP 表达式的求值。")
((= vlr :vlr-lispCancelled)"已取消对 AutoLISP 表达式的求值。")
((= vlr :vlr-pickfirstModified)"当前文档的优先选择集已被修改。")
((= vlr :vlr-layoutSwitched)"布局已被切换。")
((= vlr :vlr-beginDoubleClick)"Mouse 反应器事件")
((= vlr :vlr-beginRightClick)"用户单击右键。")
((= vlr :vlr-cancelled)"对对象的修改已经取消。")
((= vlr :vlr-copied)"对象已被复制。")
((= vlr :vlr-erased)"对象的删除标志已被设置。")
((= vlr :vlr-unerased)"对象的删除标志已被重置。")
((= vlr :vlr-goodbye)"即将从内存中删除对象。")
((= vlr :vlr-openedForModify)"即将修改对象。")
((= vlr :vlr-modified)"对象已被修改。如果取消修改,还将激发 :vlr-cancelled and :vlr-modifyUndone。")
((= vlr :vlr-subObjModified)"对象的子图元已被修改。在修改多段线或网格顶点时触发该事件,块参照拥有的属性也会触发该事件。")
((= vlr :vlr-modifyUndone)"对对象的修改已被放弃。")
((= vlr :vlr-modifiedXData)"对象的扩展图元数据已被修改。")
((= vlr :vlr-unappended)"已从图形数据库中拆离对象。")
((= vlr :vlr-reappended)"对象已被重新附着到图形数据库。")
((= vlr :vlr-objectClosed)"对对象的修改已经完成。")
((= vlr :vlr-sysVarWillChange)"AutoCAD 即将修改某系统变量的值。")
((= vlr :vlr-sysVarChanged)"系统变量的值已被修改。")
((= vlr :vlr-toolbarBitmapSizeWillChange)"AutoCAD 工具栏图标的大小即将变化。")
((= vlr :vlr-toolbarBitmapSizeChanged)"AutoCAD 工具栏图标的大小已经变化。")
((= vlr :vlr-undoSubcommandAuto)"UNDO 命令的“自动”选项已被执行。")
((= vlr :vlr-undoSubcommandControl)"UNDO 命令的“控制”选项已被执行。")
((= vlr :vlr-undoSubcommandBegin)"UNDO 命令的“开始”选项已被执行。“开始”将标记可一次放弃的一系列命令的开始位置。")
((= vlr :vlr-undoSubcommandEnd)"UNDO 命令的“结束”选项已被执行。“结束”将标记可一次放弃的一系列命令的结束位置。")
((= vlr :vlr-undoSubcommandMark)"UNDO 命令的“标记”选项已被执行。“标记”在放弃文件中做一个标记,以便“后退”选项可放弃到该标记位置处(即放弃设置标记后的所有操作)。")
((= vlr :vlr-undoSubcommandBack)"UNDO 命令的“后退”选项已被执行。“后退”向前放弃所有操作,直到遇到最近一个由“标记”选项做出的标记为止。如果没有标记,就放弃所有操作。")
((= vlr :vlr-undoSubcommandNumber)"即将执行指定放弃数目的 UNDO 命令(UNDO 命令的缺省操作)。")
((= vlr :VLR-wblockNotice)"写块操作即将开始。")
((= vlr :VLR-beginWblockPt)"已经在图元集上执行了写块操作。")
((= vlr :VLR-beginWblockId)"正在指定块上执行写块操作。")
((= vlr :VLR-beginWblock)"正在图源数据库上执行写块操作。在源数据库模型空间中的所有图元复制到目标数据库之前,不会发出通知。")
((= vlr :VLR-endWblock)"写块操作成功完成。")
((= vlr :VLR-beginWblockObjects)"写块刚刚完成对象 ID 转换映射表的初始化。")
((= vlr :vlr-docFrameMovedOrResized)"移动或缩放 MDI 子窗口(文档窗口)。")
((= vlr :vlr-mainFrameMovedOrResized)"移动或缩放 AutoCAD 主窗口。")
((= vlr :VLR-beginAttach)"即将附着外部参照。")
((= vlr :VLR-otherAttach)"正在将外部参照添加到图形数据库。在复制对象完成后,转换发生前产生该事件。该回调函数在刚刚发出 beginDeepCloneXlation 通知后发出,但只在外部参照附着过程中发生。")
((= vlr :VLR-abortAttach)"外部参照附着操作尚未完成即被中断。")
((= vlr :VLR-endAttach)"外部参照附着操作顺利完成。")
((= vlr :VLR-redirected)"正在修改外部参照图形中的对象 ID,使之指向被参照图形中的相关对象。")
((= vlr :VLR-comandeered)"正在将对象的 ID 附加到被参照图形的符号表中。")
((= vlr :VLR-beginRestore)"即将融入现有的外部参照(一般在加载包含外部参照的图形时发生)")
((= vlr :VLR-abortRestore)"外部参照的卸载或重载尚未完成便被中断。")
((= vlr :VLR-endRestore)"已经融入现有的外部参照(一般在包含外部参照的图形完成加载时发生)。")
((= vlr :VLR-xrefSubcommandBindItem)"XREF 的子命令 ATTACH 已被调用,或正在融入已经存在的外部参照。")
((= vlr :VLR-xrefSubcommandAttachItem)"XREF 的子命令 ATTACH 已被调用,或正在融入已经存在的外部参照。请注意 ATTACH 是交互式命令,将触发多个事件。")
((= vlr :VLR-xrefSubcommandOverlayItem)"XREF 的子命令 OVERLAY 已被调用,或正在融入已经存在的外部参照。请注意 OVERLAY 是交互式命令,将触发多个事件。")
((= vlr :VLR-xrefSubcommandDetachItem)"XREF 的子命令 DETACH 已被调用。请注意 DETACH 是交互式命令,将触发多个事件。")
((= vlr :VLR-xrefSubcommandPathItem)"XREF 的子命令 PATH 已被调用。请注意 PATH 是交互式命令,将触发多个事件。")
((= vlr :VLR-xrefSubcommandReloadItem)"XREF 的子命令 RELOAD 已被调用,或正在重载已经存在的外部参照。请注意 RELOAD 是交互式命令,将触发多个事件。?")
((= vlr :VLR-xrefSubcommandUnloadItem)"XREF 的子命令 UNLOAD 已被调用,或正在卸载已经存在的外部参照。")
((= vlr :vlr-acdb-reactor )";构造 AutoCAD 数据库反应器对象,在从图形数据库中加入、修改或删除对象时通知应用程序")
((= vlr :vlr-command-reactor )";构造 AutoCAD 命令反应器,对命令事件给出通知")
((= vlr :vlr-deepclone-reactor)";构造编辑器反应器对象,在发生 deepclone 事件时给出通知")
((= vlr :vlr-docmanager-reactor)";构造反应器对象,通知与图形文档相关的事件")
((= vlr :vlr-dwg-reactor)";构造反应器对象,通知图形事件")
((= vlr :vlr-dxf-reactor )";构造编辑器反应器对象,通知与读写 DXF 文件相关的事件")
((= vlr :vlr-editor-reactor)";构造编辑器反应器对象")
((= vlr :vlr-insert-reactor)";构造反应器对象,通知与块插入相关的事件")
((= vlr :vlr-linker-reactor)";构造反应器对象,在每次应用程序加载或卸载 ObjectARX 应用程序时通知应用程序")
((= vlr :vlr-lisp-reactor )";构造编辑器反应器对象,通知 LISP 事件")
((= vlr :vlr-miscellaneous-reactor)";构造编辑器反应器对象,它不属于任何其他编辑器反应器类型")
((= vlr :vlr-mouse-reactor )";构造编辑器反应器对象,通知鼠标事件")
((= vlr :vlr-object-reactor)";构造对象反应器对象")
((= vlr :vlr-sysvar-reactor )";构造编辑器反应器对象,在修改系统变量时通知应用程序")
((= vlr :vlr-toolbar-reactor)";构造编辑器反应器对象,在工具栏中的位图改变时通知应用程序")
((= vlr :vlr-undo-reactor )";构造通知放弃操作的编辑器反应器")
((= vlr :vlr-wblock-reactor)";构造编辑器反应器对象,在发生与写块相关的事件时通知应用程序")
((= vlr :vlr-window-reactor)";构造编辑器反应器对象,在发生与移动或缩放 AutoCAD 窗口相关的事件时通知应用程序")
((= vlr :vlr-xref-reactor)";构造编辑器反应器对象,在发生附着或修改外部参照事件时通知应用程序")
(T "无描述")
)
)
(defun bb:vlr-test;构造编辑器反应器对象,在修改系统变量时通知应用程序
(vlr/ reactorvlr-names aaa)
(if (null **vlr-test**) (setq **vlr-test** 0))
(if
(and
(vl-symbolp vlr)
(setq vlr-names(vlr-reaction-names vlr))
)
(progn
(foreach yvlr-names
(eval
(read
(strcat
"(defun bb-back"
(vl-symbol-name y)
"(vlr key)"
"(princ \"\n;当前回调次数-> \")"
"(princ (itoa (setq **vlr-test**(1+ **vlr-test**))))"
"(princ \"\n;-------------------------------------------------------------\n;主反应器-> \")(princ vlr)(princ (bb-chuans-vlr (vlr-type vlr)))(princ "
"\"\n;回调反应器-> "(vl-symbol-name y)"\t" (bb-chuans-vlr y)
"\n;回调返回值-> \""
")(princ key)(princ \"\n;-------------------------------------------------------------\n\")(princ))"
)
)
)
)
(if
(setq reactor
(vl-some
(function
(lambda ( _reactor )
(if (eq(strcat "bb"(vl-symbol-name vlr ))(vlr-data _reactor)) _reactor)
)
)
(cdar (vlr-reactors vlr))
)
)
(if
(not
(vlr-added-p ;测试以确定是否已启用反应器对象
reactor
)
)
(vlr-add reactor) ;启动当前禁用的反应器对象
)
(vl-catch-all-apply
(read
(vl-string-left-trim
":"
(vl-symbol-name vlr )
)
);构造 AutoCAD 命令反应器,对命令事件给出通知
(list
(strcat "bb"(vl-symbol-name vlr ));任何要与反应器对象相关联的 AutoLISP 数据。如果没有数据则为 nil。
(mapcar
(function
(lambda
(a)
(cons a
(read
(strcat
"bb-back"
(vl-symbol-name a)
)
)
)
)
)
vlr-names
)
)
)
)
)
)
(princ)
)
(mapcar ' bb:vlr-test
'(
:vlr-acdb-reactor ;构造 AutoCAD 数据库反应器对象,在从图形数据库中加入、修改或删除对象时通知应用程序
:vlr-command-reactor ;构造 AutoCAD 命令反应器,对命令事件给出通知
:vlr-deepclone-reactor ;构造编辑器反应器对象,在发生 deepclone 事件时给出通知
:vlr-docmanager-reactor ;构造反应器对象,通知与图形文档相关的事件
:vlr-dwg-reactor ;构造反应器对象,通知图形事件(如打开或关闭图形文件)
:vlr-dxf-reactor ;构造编辑器反应器对象,通知与读写 DXF 文件相关的事件
:vlr-editor-reactor ;构造编辑器反应器对象
:vlr-insert-reactor ;构造反应器对象,通知与块插入相关的事件
:vlr-linker-reactor ;构造反应器对象,在每次应用程序加载或卸载 ObjectARX 应用程序时通知应用程序
:vlr-lisp-reactor;构造编辑器反应器对象,通知 LISP 事件
:vlr-miscellaneous-reactor ;构造编辑器反应器对象,它不属于任何其他编辑器反应器类型
:vlr-mouse-reactor ;构造编辑器反应器对象,通知鼠标事件(如双击)
:vlr-object-reactor ;构造对象反应器对象
:vlr-sysvar-reactor ;构造编辑器反应器对象,在修改系统变量时通知应用程序
:vlr-toolbar-reactor ;构造编辑器反应器对象,在工具栏中的位图改变时通知应用程序
:vlr-undo-reactor;构造通知放弃操作的编辑器反应器
:vlr-wblock-reactor ;构造编辑器反应器对象,在发生与写块相关的事件时通知应用程序
:vlr-window-reactor ;构造编辑器反应器对象,在发生与移动或缩放 AutoCAD 窗口相关的事件时通知应用程序
:vlr-xref-reactor ;构造编辑器反应器对象,在发生附着或修改外部参照事件时通知应用程序
)
)
(princ)
)
(defun bb::vlr-CleanReactors ;清除反应器
()
;;;--------------------------------------------------------------;
;;; 函数:CleanReactors ;
;;;--------------------------------------------------------------;
;;; 说明:用于清除反应器 ;
;;; 通用的实用程序函数。 它可以在调试时使用, ;
;;; 也能在关闭图形以前清除任何 ;
;;; 打开的反应器。 ;
;;;--------------------------------------------------------------;
(mapcar 'vlr-remove-all
'(
:vlr-acdb-reactor ;构造 AutoCAD 数据库反应器对象,在从图形数据库中加入、修改或删除对象时通知应用程序
:vlr-command-reactor ;构造 AutoCAD 命令反应器,对命令事件给出通知
:vlr-deepclone-reactor ;构造编辑器反应器对象,在发生 deepclone 事件时给出通知
:vlr-docmanager-reactor ;构造反应器对象,通知与图形文档相关的事件
:vlr-dwg-reactor ;构造反应器对象,通知图形事件(如打开或关闭图形文件)
:vlr-dxf-reactor ;构造编辑器反应器对象,通知与读写 DXF 文件相关的事件
:vlr-editor-reactor ;构造编辑器反应器对象
:vlr-insert-reactor ;构造反应器对象,通知与块插入相关的事件
:vlr-linker-reactor ;构造反应器对象,在每次应用程序加载或卸载 ObjectARX 应用程序时通知应用程序
:vlr-lisp-reactor;构造编辑器反应器对象,通知 LISP 事件
:vlr-miscellaneous-reactor ;构造编辑器反应器对象,它不属于任何其他编辑器反应器类型
:vlr-mouse-reactor ;构造编辑器反应器对象,通知鼠标事件(如双击)
:vlr-object-reactor ;构造对象反应器对象
:vlr-sysvar-reactor ;构造编辑器反应器对象,在修改系统变量时通知应用程序
:vlr-toolbar-reactor ;构造编辑器反应器对象,在工具栏中的位图改变时通知应用程序
:vlr-undo-reactor;构造通知放弃操作的编辑器反应器
:vlr-wblock-reactor ;构造编辑器反应器对象,在发生与写块相关的事件时通知应用程序
:vlr-window-reactor ;构造编辑器反应器对象,在发生与移动或缩放 AutoCAD 窗口相关的事件时通知应用程序
:vlr-xref-reactor ;构造编辑器反应器对象,在发生附着或修改外部参照事件时通知应用程序
)
)
)
(initget "1 2 3")
(if (not bb) (setq bb "1"))
(setq
bb
(cond
(
(getkword
(strcat
"必强工具\n反应器任务监测[启动反应器监测(1) /关闭反应器监测(2) /退出(3)] <"
bb
"> : "
)
)
)
( bb )
)
)
(cond
((= bb "1")(bb:vlr-test-run)(textscr))
((= bb "2") (bb::vlr-CleanReactors )(graphscr))
((= bb "3")(princ))
)
(princ)
)
;;反应器应用--右键终止while进程实例
(
defun
C:dd
(
/
loop
**loop
)
(
defun
my-mouse-beginRightClick
(
x
y
)
(
setq
**loop
"close"
)
)
(
setq
**loop
"open"
)
(
vlr-mouse-reactor
"beginRightClick"
'
(
(
:vlr-beginRightClick
.
my-mouse-beginRightClick
)
)
)
(while
(
and
(
/=
(
type
loop
)
'PICKSET
)
(
not
(
=
**loop
"close"
)
)
)
(
setq
loop
(
ssget
":s"
)
)
)
)
664571221 发表于 2021-4-28 14:16
强哥真是百年一遇的人才,给你点赞
谢谢夸奖,感谢 mokson 发表于 2021-4-30 07:45
屌丝的我,只能望码兴叹了。
加油加油奥里给 感谢作者分享,把反应器这一课补上。 又放出高级工具来啦 强哥真是百年一遇的人才,给你点赞:P:lol;P:victory::kiss:{:1_1:}:handshake 名贴必须标记! 强哥牛逼!!! 高人,向你学习 请问什么叫反应器? 感谢石总共享代码! 屌丝的我,只能望码兴叹了。