源泉和探索者插件命令怎么自动键入关键字
本帖最后由 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
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)
) test 只有全部执行完yq_dim_pline命令后,才会执行Sendkeys
没毛病呀? 自贡黄明儒 发表于 2025-4-9 18:18
test 只有全部执行完yq_dim_pline命令后,才会执行Sendkeys
没毛病呀?
那样就不是我想要的效果了,我是想在yq_dim_pline命令执行过程中输入关键字“B”
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#要么c++ liuhe 发表于 2025-4-10 09:49
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#要么c++
好吧,那个没有研究[捂脸]
Qwer1243 发表于 2025-4-10 11:42
感谢提供的钩子思路,我用下面的方法实现了
666666 我是不会反应器,所以想不到。反应器和c#的事件应该是一个东西 liuhe 发表于 2025-4-10 14:23
666666 我是不会反应器,所以想不到。反应器和c#的事件应该是一个东西
我是看到你说的方向,就用deepseek搜了一下,自己调试了几下,就行的通了
可以将源泉命令注册为内部命令,这样就可以用command 带参数使用了vla-add-cmd,大概是这个函数 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]