夏生生 发表于 2021-12-3 11:12:23

如何定义自己的右键单击或左键双击反应器

本帖最后由 夏生生 于 2021-12-3 11:37 编辑

哪位大侠可以指导一下,谢谢。我又如下代码:
(defun c:temp ( / loop gr)
(setq loop t)
(prompt "\n输入m,c,l:")
(while loop
    (setq gr (grread T 15 2))
    (cond ((or (equal gr (list 2(ascii "m"))) (equal gr (list 2(ascii "M"))))
      (setq loop nil)
   (command "move")
   )
   ((or (equal gr (list 2(ascii "c"))) (equal gr (list 2(ascii "C"))))
      (setq loop nil)
      (command "copy")
   )
   ((or (equal gr (list 2(ascii "l"))) (equal gr (list 2(ascii "L"))))
      (setq loop nil)
      (command "line")
   )
   )
)
)如何在autocad命令行无命令输入且有选择或无选择的情况下,右键,自动执行temp命令,也就是自定义一个永久右键反应器,在其它的插件定义了右键反应器的情况下,要关闭其它的右键反应器。
另:左键双击空白处也可以




xtjd 发表于 2021-12-3 11:12:24

(defun temp(x y)(alert "ok"))
(defun c:test()
(vlr-remove-all :vlr-mouse-reactor);删除鼠标反应器
(vlr-mouse-reactor "右键单击" '((:vlr-beginRightClick . temp)))
(vlr-mouse-reactor "左键双击" '((:vlr-beginDoubleClick . temp)))
)

夏生生 发表于 2021-12-3 17:48:52

本帖最后由 夏生生 于 2021-12-3 17:50 编辑

xtjd 发表于 2021-12-3 14:44
(defun temp(x y)(alert "ok"))
(defun c:test()
(vlr-remove-all :vlr-mouse-reactor);删除鼠标反应器 ...
您的第一步是禁用所有鼠标反应器吧?如何禁用我想禁用的呢?而且这个temp不能定义成命令是吗?谢谢

yanshengjiang 发表于 2021-12-3 23:28:12

xtjd 发表于 2021-12-3 14:44
(defun temp(x y)(alert "ok"))
(defun c:test()
(vlr-remove-all :vlr-mouse-reactor);删除鼠标反应器 ...

看了你明经第一个主题是2006年。 老lsper了啊

夏生生 发表于 2021-12-4 10:37:38

yanshengjiang 发表于 2021-12-3 23:28
看了你明经第一个主题是2006年。 老lsper了啊

我是老新手

夏生生 发表于 2021-12-6 11:57:12

xtjd 发表于 2021-12-3 11:12
(defun temp(x y)(alert "ok"))
(defun c:test()
(vlr-remove-all :vlr-mouse-reactor);删除鼠标反应器 ...

朋友,请问能深入指导一下吗?谢谢。我的初衷是加载代码,建立A反应器,屏蔽其它右键反应器,右键调用自己的代码B,当代码B执行的时候,屏蔽A反应器,代码B执行完毕,停止屏蔽A反应器,以便下次右键的时候执行该反应器。能力有限,把自己绕晕了。下面的代码,右键的时候,可以在右键所在点画一个point,但是画完以后autocad自带的右键反应器又启动了。
;;;建立反应器对象
(vlr-remove-all :vlr-mouse-reactor) ;_删除反应器
(if (null **val**)
(setq        **val**        (vlr-mouse-reactor
                  "beginRightClick"
                  '((:vlr-beginRightClick . xxRightClickcallback))
                )
)
)
;;;定义回调函数
(defun xxRightClickcallback (obj point)
(if xxRightClickcall
    (xxRightClickcall point)
)
)
;;;定义反应器
(defun xxRightClickcall        (point / pt)
(setq pt (car point))
(vla-addPoint (vla-get-modelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3D-Point pt))
)

xtjd 发表于 2021-12-6 16:25:05

夏生生 发表于 2021-12-6 11:57
朋友,请问能深入指导一下吗?谢谢。我的初衷是加载代码,建立A反应器,屏蔽其它右键反应器,右键调用自 ...

右键很特殊,不好整,下面代码你研究看看
(defun vlrremove(x y)(vlr-remove beginRightClick))
(defun vlradd(x y)(vlr-add beginRightClick))
(defun c:nothing nil (princ))
(defun addpt(pt)
(vla-addPoint (vla-get-modelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3D-Point pt))
(vla-sendcommand(vla-get-ActiveDocument(vlax-get-acad-object))"nothing")
)
(defun c:test()
(vlr-remove-all :vlr-mouse-reactor);删除鼠标反应器
(setq beginRightClick(vlr-mouse-reactor "右键单击" '((:vlr-beginRightClick . temp))))
(setq commandWillStart(VLR-Command-Reactor nil '(
                                                   (:VLR-commandWillStart . vlrremove)
                                                   (:VLR-commandCancelled . vlradd)
                                                   (:VLR-commandEnded . vlradd)
                                                   )
                          )
        )
)

夏生生 发表于 2021-12-6 16:33:04

xtjd 发表于 2021-12-6 16:25
右键很特殊,不好整,下面代码你研究看看
(defun vlrremove(x y)(vlr-remove beginRightClick))
(defun ...

谢谢,我研究研究

xtjd 发表于 2021-12-6 16:51:00

(defun temp(x y)(addpt pt(car y)))

masterlong 发表于 2021-12-6 18:57:09

个人建议
占用一个【F*】功能键用于反应器的启停
按一次停止系统启用自定义
再按一次则反向操作
我自己用的是【F7】启停双击反应器

另外
最好不要用右键反应器
可以的话用空白双击代替右键
页: [1] 2
查看完整版本: 如何定义自己的右键单击或左键双击反应器