Qwer1243 发表于 2025-4-9 17:30:37

源泉和探索者插件命令怎么自动键入关键字

本帖最后由 Qwer1243 于 2025-4-9 21:11 编辑

我想用源泉插件中的“yq_dim_pline”命令(闭合多段线自动标注),运行命令后,想自动键入关键“B”,在自动完成回车;紧接着运行探索者中的“CHDCHL”(重叠标注处理),处理多段线中重叠的标注,我自己试了好几方法都不行,都无法实现,大家有没有什么好方法可以实现?

用(command)和(vl-cmdf)都无法直接调用“yq_dim_pline”命令

(defun c:66 (/ ss)
(setvar "cmdecho" 0)
(setq lastent (entlast))
(setq ss (ssget))
(command-s "change" ss "" "p" "la" "0" "")
(command-s "change" ss "" "p" "c" "BYLAYER" "")
(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "ddzz\n" "B\n" "p\n" " "))
(setq ss1 (ssadd))
(while (setq lastent (entnext lastent))
    (ssadd lastent ss1)
)
(Sssetfirst nil ss1)
(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "CHDCHL\n" " "))
(prin1)
)这种方法,vla-sendcommand和vlisp代码执行不同步,会在所有vlisp代码都执行完以后再执行vla-sendcommand里面的代码
(defun c:test()
(setvar "cmdecho" 0)
(setq WshShell (Vlax-Get-Or-Create-Object "WScript.Shell" ))
(c:yq_dim_pline)
(Vlax-Invoke-Method WshShell 'Sendkeys "B")
(vlax-release-object WshShell)
(princ "\n运行结束")
(setvar "cmdecho" 1)
)用Sendkeys也不行,只有全部执行完yq_dim_pline命令后,才会执行Sendkeys



Qwer1243 发表于 2025-4-10 11:42:47

liuhe 发表于 2025-4-10 09:49
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#要么c++

感谢提供的钩子思路,我用下面的方法实现了
(defun c:66 (/ ss ss1)
(setvar "cmdecho" 0)
        ;; 错误处理函数
(defun *error* (msg)
    (if cmd-reactor (vlr-remove cmd-reactor))
    (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
      (princ (strcat "\n错误: " msg))
    )
    (princ)
)
       
(setq lastent (entlast))
(setq ss (ssget))
(command-s "change" ss "" "p" "la" "0" "")
(command-s "change" ss "" "p" "c" "BYLAYER" "")

; 定义反应器回调函数
(defun OnCommandEnd (reactor params)
                ;(princ "\n反应器:")
                ;(princ (car params))
                (if (and lastent (equal (car params) "-COLOR")) ; -COLOR 命令完成后触发
                        (progn
                        (princ "\n记录次数:")
                                (setq ss1 (ssadd))
                                (while (setq lastent (entnext lastent)) (ssadd lastent ss1))
                                (Sssetfirst nil ss1)
                                (princ "\n准备执行重叠处理")
                                (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "CHDCHL ")
                                (vlr-remove cmd-reactor); 移除反应器避免重复触发
                                (setq lastent nil)
                        )
                )
)

; 注册反应器
(setq cmd-reactor (vlr-command-reactor nil '((:vlr-commandEnded . OnCommandEnd))))
(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "yq_dim_pline B p " " "))
        (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "-color" " " " "))
(princ)
)

自贡黄明儒 发表于 2025-4-9 18:18:08

test 只有全部执行完yq_dim_pline命令后,才会执行Sendkeys
没毛病呀?

Qwer1243 发表于 2025-4-9 18:22:16

自贡黄明儒 发表于 2025-4-9 18:18
test 只有全部执行完yq_dim_pline命令后,才会执行Sendkeys
没毛病呀?

那样就不是我想要的效果了,我是想在yq_dim_pline命令执行过程中输入关键字“B”

liuhe 发表于 2025-4-10 09:49:28

这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#要么c++

Qwer1243 发表于 2025-4-10 09:55:33

liuhe 发表于 2025-4-10 09:49
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#要么c++

好吧,那个没有研究[捂脸]

liuhe 发表于 2025-4-10 14:23:10

Qwer1243 发表于 2025-4-10 11:42
感谢提供的钩子思路,我用下面的方法实现了

666666   我是不会反应器,所以想不到。反应器和c#的事件应该是一个东西

Qwer1243 发表于 2025-4-10 15:36:34

liuhe 发表于 2025-4-10 14:23
666666   我是不会反应器,所以想不到。反应器和c#的事件应该是一个东西

我是看到你说的方向,就用deepseek搜了一下,自己调试了几下,就行的通了

tigcat 发表于 2025-4-11 07:51:46

可以将源泉命令注册为内部命令,这样就可以用command 带参数使用了vla-add-cmd,大概是这个函数

Qwer1243 发表于 2025-4-11 10:12:47

tigcat 发表于 2025-4-11 07:51
可以将源泉命令注册为内部命令,这样就可以用command 带参数使用了vla-add-cmd,大概是这个函数

感谢回复,是vlax-add-cmd命令,注册以后可以用(command)带参数调用
(vl-load-com) ; 初始化ActiveX
;; 注册为内部命令
(if (not (vlax-add-cmd "yq_dim_pline" 'c:yq_dim_pline))
(princ "\n命令注册失败!")
(princ "\n命令 yq_dim_pline (别名: ydp) 已注册。")
)
(setq ss (ssget))
(vl-cmdf "yq_dim_pline" "B" ss "")
页: [1]
查看完整版本: 源泉和探索者插件命令怎么自动键入关键字