明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 617|回复: 9

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

[复制链接]
发表于 2025-4-9 17:30:37 | 显示全部楼层 |阅读模式
本帖最后由 Qwer1243 于 2025-4-9 21:11 编辑

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

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

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



本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2025-4-10 11:42:47 | 显示全部楼层
liuhe 发表于 2025-4-10 09:49
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#  要么c++

感谢提供的钩子思路,我用下面的方法实现了
  1. (defun c:66 (/ ss ss1)
  2.   (setvar "cmdecho" 0)
  3.         ;; 错误处理函数
  4.   (defun *error* (msg)
  5.     (if cmd-reactor (vlr-remove cmd-reactor))
  6.     (if (not (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*"))
  7.       (princ (strcat "\n错误: " msg))
  8.     )
  9.     (princ)
  10.   )
  11.        
  12.   (setq lastent (entlast))
  13.   (setq ss (ssget))
  14.   (command-s "change" ss "" "p" "la" "0" "")
  15.   (command-s "change" ss "" "p" "c" "BYLAYER" "")
  16.   
  17.   ; 定义反应器回调函数
  18.   (defun OnCommandEnd (reactor params)
  19.                 ;(princ "\n反应器:")
  20.                 ;(princ (car params))
  21.                 (if (and lastent (equal (car params) "-COLOR")) ; -COLOR 命令完成后触发
  22.                         (progn
  23.                         (princ "\n记录次数:")
  24.                                 (setq ss1 (ssadd))
  25.                                 (while (setq lastent (entnext lastent)) (ssadd lastent ss1))
  26.                                 (Sssetfirst nil ss1)
  27.                                 (princ "\n准备执行重叠处理")
  28.                                 (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "CHDCHL ")
  29.                                 (vlr-remove cmd-reactor)  ; 移除反应器避免重复触发
  30.                                 (setq lastent nil)
  31.                         )
  32.                 )
  33.   )
  34.   
  35.   ; 注册反应器
  36.   (setq cmd-reactor (vlr-command-reactor nil '((:vlr-commandEnded . OnCommandEnd))))
  37.   (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "yq_dim_pline B p " " "))
  38.         (vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) (strcat "-color" " " " "))
  39.   (princ)
  40. )
回复 支持 1 反对 0

使用道具 举报

发表于 2025-4-9 18:18:08 | 显示全部楼层
test 只有全部执行完yq_dim_pline命令后,才会执行Sendkeys
没毛病呀?
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2025-4-10 09:49:28 | 显示全部楼层
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#  要么c++
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-10 09:55:33 | 显示全部楼层
liuhe 发表于 2025-4-10 09:49
这不是lisp能够实现的,你想要的是钩子系统,透明命令要么c#  要么c++

好吧,那个没有研究[捂脸]
回复 支持 反对

使用道具 举报

发表于 2025-4-10 14:23:10 | 显示全部楼层
Qwer1243 发表于 2025-4-10 11:42
感谢提供的钩子思路,我用下面的方法实现了

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

使用道具 举报

 楼主| 发表于 2025-4-10 15:36:34 | 显示全部楼层
liuhe 发表于 2025-4-10 14:23
666666   我是不会反应器,所以想不到。反应器和c#的事件  应该是一个东西

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

使用道具 举报

发表于 7 天前 | 显示全部楼层
可以将源泉命令注册为内部命令,这样就可以用command 带参数使用了vla-add-cmd,大概是这个函数
回复 支持 反对

使用道具 举报

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

感谢回复,是vlax-add-cmd命令,注册以后可以用(command)带参数调用
  1. (vl-load-com) ; 初始化ActiveX
  2. ;; 注册为内部命令
  3. (if (not (vlax-add-cmd "yq_dim_pline" 'c:yq_dim_pline))
  4.   (princ "\n命令注册失败!")
  5.   (princ "\n命令 yq_dim_pline (别名: ydp) 已注册。")
  6. )
  7. (setq ss (ssget))
  8. (vl-cmdf "yq_dim_pline" "B" ss "")
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-18 08:41 , Processed in 0.182105 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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