本帖最后由 yaojing38 于 2025-9-1 14:41 编辑
大佬们,怎么等待一个command 命令自动结束了,才执行下一句呢??感觉不太行 cmdactive !感觉没等待就进行下一句了,或者有啥 像断点一样的功能吗?求大佬指点!
网友答:
calude写的
网友答:
网友答:
(repeat (length fil)
(setq fi (nth i fil) wb_na1 (nth i fil1))
(command "SCRIPT" fi)
;(command-s "_.delay" 10000)
(while (= (getvar "cmdactive") 1) (command pause))
(setq wb_na (strcat dir "\\" wb_na1 ".dwg"))
(setq wb_ss (ssget "x"))
(command "-wblock" wb_na "" '(0 0 0) wb_ss "" "oops")
(command "ERASE" wb_ss "" )
(setq i (1+ i))
)网友答: 难道你是用了sendCommand?网友答:
啥意义,没有,,就是我的命令在绘图,需要一定时间完成网友答:
??发言意义不明...网友答: 本帖最后由 yaojing38 于 2025-9-1 14:59 编辑
没用 sendCommand 但是cmdactive 没有等待 就执行下一个了网友答: 加入延迟命令 网友答:
那就别用它啊,具体代码具体展示网友答:
试了也是不行网友答:
(vl-load-com)
;; --- 获取当前文档 ---
(setq *acadDoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
;; --- 定义回调函数,命令结束后执行 ---
(defun my-cmd-end-callback (/)
(princ "\n命令已执行完毕,可以执行下一步逻辑。")
;; 放你要执行的下一句代码
(command "_circle" '(50 50) 25)
)
;; --- 注册事件监听 ---
(vla-AddEventHandler *acadDoc* 'CommandEnded 'my-cmd-end-callback)
;; --- 发送命令(异步) ---
(vla-sendcommand *acadDoc* "._line 0,0 100,0 ")
(princ "\n命令已发送,等待结束...")
大佬们,怎么等待一个command 命令自动结束了,才执行下一句呢??感觉不太行 cmdactive !感觉没等待就进行下一句了,或者有啥 像断点一样的功能吗?求大佬指点!
网友答:
cghdy 发表于 2025-9-1 16:30
你这是deepseek写的吧
calude写的

- ;; AutoLISP 命令等待示例
- ;; 演示如何等待命令完成后再执行下一句
- (defun c:wait-demo ()
- (princ "\n=== 命令等待演示 ===\n")
-
- ;; 方法1: 使用 command 函数 (推荐)
- ;; command 函数会自动等待命令完成
- (princ "\n方法1: 使用 command 函数")
- (command "circle" "0,0" "50") ; 画圆,会等待完成
- (princ "\n圆已绘制完成,继续下一步...")
-
- ;; 方法2: 使用 vl-cmdf 函数 (更现代的方式)
- (princ "\n方法2: 使用 vl-cmdf 函数")
- (vl-cmdf "line" "100,0" "200,100" "") ; 画线,会等待完成
- (princ "\n线已绘制完成...")
-
- ;; 方法3: 检查系统变量 CMDACTIVE
- (princ "\n方法3: 监控 CMDACTIVE 系统变量")
- (command "arc" "300,0" "400,50" "350,100")
- (while (> (getvar "CMDACTIVE") 0) ; 等待命令完成
- (princ ".") ; 显示等待过程
- )
- (princ "\n弧线已绘制完成...")
-
- (princ "\n=== 演示完成 ===")
- (princ)
- )
- ;; 高级等待函数示例
- (defun wait-for-command-complete ()
- "等待当前命令完成的通用函数"
- (while (> (getvar "CMDACTIVE") 0)
- (command "") ; 发送空命令继续
- )
- )
- ;; 带超时的等待函数
- (defun wait-with-timeout (timeout-seconds)
- "带超时的命令等待函数"
- (setq start-time (getvar "DATE"))
- (while (and (> (getvar "CMDACTIVE") 0)
- (< (- (getvar "DATE") start-time) (/ timeout-seconds 86400.0)))
- (command "")
- )
- (if (> (getvar "CMDACTIVE") 0)
- (progn
- (command "^C^C") ; 取消命令
- (princ "\n命令超时,已取消")
- )
- (princ "\n命令正常完成")
- )
- )
- ;; 实际应用示例:批量绘图
- (defun c:batch-draw ()
- "批量绘图示例 - 确保每个命令完成后再执行下一个"
- (princ "\n开始批量绘图...")
-
- ;; 设置图层
- (command "layer" "m" "图形层" "c" "red" "图形层" "")
- (wait-for-command-complete)
-
- ;; 绘制多个图形
- (setq shapes (list
- '("circle" "0,0" "25")
- '("rectangle" "50,50" "100,100")
- '("line" "150,0" "200,50" "")
- ))
-
- (foreach shape shapes
- (princ (strcat "\n正在绘制: " (car shape)))
- (apply 'command shape) ; 执行绘图命令
- (wait-for-command-complete) ; 等待完成
- (princ " 完成!")
- )
-
- (princ "\n批量绘图完成!")
- (princ)
- )
- ;; 用户交互等待示例
- (defun c:interactive-demo ()
- "交互式命令等待演示"
- (princ "\n请选择一个点...")
-
- ;; 等待用户输入
- (setq pt (getpoint "\n选择起点: "))
- (if pt
- (progn
- (princ "\n开始绘制...")
- (command "circle" pt "30")
- (wait-for-command-complete)
- (princ "\n绘制完成!")
- )
- (princ "\n用户取消操作")
- )
- (princ)
- )
- ;; 错误处理的等待示例
- (defun c:safe-command ()
- "带错误处理的命令等待"
- (setq old-error *error*) ; 保存原错误处理
- (setq *error* my-error-handler) ; 设置自定义错误处理
-
- (princ "\n执行可能出错的命令...")
- (command "unknown-command") ; 故意的错误命令
-
- ;; 恢复错误处理
- (setq *error* old-error)
- (princ)
- )
- (defun my-error-handler (msg)
- "自定义错误处理函数"
- (princ (strcat "\n发生错误: " msg))
- (command "^C^C") ; 取消当前命令
- (setq *error* old-error) ; 恢复原错误处理
- (princ)
- )
- ;; 调试辅助函数
- (defun debug-command-state ()
- "显示当前命令状态信息"
- (princ (strcat "\nCMDACTIVE: " (itoa (getvar "CMDACTIVE"))))
- (princ (strcat "\nCMDNAME: " (getvar "CMDNAMES")))
- (princ (strcat "\nCMDECHO: " (itoa (getvar "CMDECHO"))))
- (princ)
- )
- ;; 使用说明:
- ;; 1. 加载此文件到AutoCAD
- ;; 2. 运行 wait-demo 查看基本等待方法
- ;; 3. 运行 batch-draw 查看批量操作示例
- ;; 4. 运行 interactive-demo 查看交互式等待
- ;; 5. 运行 debug-command-state 查看当前命令状态

- ;;=========================================
- ;; wait_command_demo.lsp
- ;; 演示:如何等待 command 命令结束后再执行下一句
- ;; 支持普通命令和弹出对话框的命令
- ;; 加载方式:APPLOAD 或 (load "wait_command_demo")
- ;; 输入命令:TESTCMD 开始测试
- ;;=========================================
- ;; 确保加载 Visual LISP 扩展函数(用于 sleep 和 redraw)
- (vl-load-com)
- (defun c:TESTCMD (/ pt1 pt2)
- (prompt "\n📘 开始执行 TESTCMD 测试...")
- ; ---- 1. 普通命令:LINE(会自动等待结束)----
- (prompt "\n👉 第一步:请绘制一条直线...")
- (command "_.line" pause pause "") ; pause 等待用户输入两点,"" 表示回车结束
- (prompt "\n✅ 直线已绘制完成,command 已自动阻塞等待结束。\n")
- ; ---- 2. 弹出对话框命令:DIMSTYLE(不会自动等待!)----
- (prompt "\n👉 第二步:打开【标注样式管理器】对话框...")
- (command "_.dimstyle") ; 这个命令会弹出对话框,但 LISP 不会等待它关闭!
- (prompt "\n⚠️ 注意:对话框已打开,但 LISP 代码仍在运行!")
- ; 🔁 使用 CMDACTIVE 轮询,等待用户关闭对话框
- (prompt "\n⏳ 正在等待用户关闭【标注样式管理器】...")
- (while (= (getvar "CMDACTIVE") 1)
- (vl-cmdf "_.redraw") ; 防止界面卡死
- (sleep 200) ; 暂停200毫秒,避免CPU占用过高
- )
- (prompt "\n✅ 对话框已关闭,命令真正结束!现在继续执行后续代码。\n")
- ; ---- 3. 模拟“断点”调试功能 ----
- (prompt "\n🛑 现在进入调试模式(类似断点)...")
- (prompt (strcat "\n💡 提示:当前 LISP 变量 pt1 = " (if pt1 (rtos pt1 2 2) "nil")))
- (princ "\n⌨️ 按回车键继续执行...") ; 提示用户
- (!) ; 输出所有当前变量(仅在 VLIDE 调试时有用)
- (pause) ; 暂停,等待用户按回车
- (prompt "\n✅ 继续执行最后一步...")
- ; ---- 4. 最后执行一个简单命令 ----
- (command "_.circle" '(50 50) 100 "")
- (prompt "\n🟢 一个圆已绘制在 (50,50),半径100。")
- (prompt "\n🎉 所有操作完成!感谢使用 TESTCMD。")
- (princ) ; 静默退出,不打印多余内容
- )
- ;; 可选:加载时提示
- (princ "\n📦 已加载:wait_command_demo.lsp")
- (princ "\n📌 输入命令 TESTCMD 开始测试。")
- (princ)
你有种再说一遍 发表于 2025-9-1 15:02
那就别用它啊,具体代码具体展示
(repeat (length fil)
(setq fi (nth i fil) wb_na1 (nth i fil1))
(command "SCRIPT" fi)
;(command-s "_.delay" 10000)
(while (= (getvar "cmdactive") 1) (command pause))
(setq wb_na (strcat dir "\\" wb_na1 ".dwg"))
(setq wb_ss (ssget "x"))
(command "-wblock" wb_na "" '(0 0 0) wb_ss "" "oops")
(command "ERASE" wb_ss "" )
(setq i (1+ i))
)网友答: 难道你是用了sendCommand?网友答:
你有种再说一遍 发表于 2025-9-1 14:43
难道你是用了sendCommand?
啥意义,没有,,就是我的命令在绘图,需要一定时间完成网友答:
yaojing38 发表于 2025-9-1 14:45
啥意义,没有,,就是我的命令在绘图,需要一定时间完成
??发言意义不明...网友答: 本帖最后由 yaojing38 于 2025-9-1 14:59 编辑
你有种再说一遍 发表于 2025-9-1 14:46
??发言意义不明...
没用 sendCommand 但是cmdactive 没有等待 就执行下一个了网友答: 加入延迟命令 网友答:
yaojing38 发表于 2025-9-1 14:58
没用 sendCommand 但是cmdactive 没有等待 就执行下一个了
那就别用它啊,具体代码具体展示网友答:
qifeifei 发表于 2025-9-1 15:00
加入延迟命令
试了也是不行网友答:
yaojing38 发表于 2025-9-1 15:16
试了也是不行
(vl-load-com)
;; --- 获取当前文档 ---
(setq *acadDoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
;; --- 定义回调函数,命令结束后执行 ---
(defun my-cmd-end-callback (/)
(princ "\n命令已执行完毕,可以执行下一步逻辑。")
;; 放你要执行的下一句代码
(command "_circle" '(50 50) 25)
)
;; --- 注册事件监听 ---
(vla-AddEventHandler *acadDoc* 'CommandEnded 'my-cmd-end-callback)
;; --- 发送命令(异步) ---
(vla-sendcommand *acadDoc* "._line 0,0 100,0 ")
(princ "\n命令已发送,等待结束...")