明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 656|回复: 29

[经验] 怎么等待一个命令结束 才执行下一句?

[复制链接]
发表于 前天 14:27 | 显示全部楼层 |阅读模式
本帖最后由 yaojing38 于 2025-9-1 14:41 编辑

大佬们,怎么等待一个command 命令自动结束了,才执行下一句呢??感觉不太行 cmdactive !感觉没等待就进行下一句了,或者有啥 像断点一样的功能吗?求大佬指点!
"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 前天 16:44 | 显示全部楼层
cghdy 发表于 2025-9-1 16:30
你这是deepseek写的吧

calude写的
  1. ;; AutoLISP 命令等待示例
  2. ;; 演示如何等待命令完成后再执行下一句

  3. (defun c:wait-demo ()
  4.   (princ "\n=== 命令等待演示 ===\n")
  5.   
  6.   ;; 方法1: 使用 command 函数 (推荐)
  7.   ;; command 函数会自动等待命令完成
  8.   (princ "\n方法1: 使用 command 函数")
  9.   (command "circle" "0,0" "50")  ; 画圆,会等待完成
  10.   (princ "\n圆已绘制完成,继续下一步...")
  11.   
  12.   ;; 方法2: 使用 vl-cmdf 函数 (更现代的方式)
  13.   (princ "\n方法2: 使用 vl-cmdf 函数")
  14.   (vl-cmdf "line" "100,0" "200,100" "")  ; 画线,会等待完成
  15.   (princ "\n线已绘制完成...")
  16.   
  17.   ;; 方法3: 检查系统变量 CMDACTIVE
  18.   (princ "\n方法3: 监控 CMDACTIVE 系统变量")
  19.   (command "arc" "300,0" "400,50" "350,100")
  20.   (while (> (getvar "CMDACTIVE") 0)  ; 等待命令完成
  21.     (princ ".")  ; 显示等待过程
  22.   )
  23.   (princ "\n弧线已绘制完成...")
  24.   
  25.   (princ "\n=== 演示完成 ===")
  26.   (princ)
  27. )

  28. ;; 高级等待函数示例
  29. (defun wait-for-command-complete ()
  30.   "等待当前命令完成的通用函数"
  31.   (while (> (getvar "CMDACTIVE") 0)
  32.     (command "")  ; 发送空命令继续
  33.   )
  34. )

  35. ;; 带超时的等待函数
  36. (defun wait-with-timeout (timeout-seconds)
  37.   "带超时的命令等待函数"
  38.   (setq start-time (getvar "DATE"))
  39.   (while (and (> (getvar "CMDACTIVE") 0)
  40.               (< (- (getvar "DATE") start-time) (/ timeout-seconds 86400.0)))
  41.     (command "")
  42.   )
  43.   (if (> (getvar "CMDACTIVE") 0)
  44.     (progn
  45.       (command "^C^C")  ; 取消命令
  46.       (princ "\n命令超时,已取消")
  47.     )
  48.     (princ "\n命令正常完成")
  49.   )
  50. )

  51. ;; 实际应用示例:批量绘图
  52. (defun c:batch-draw ()
  53.   "批量绘图示例 - 确保每个命令完成后再执行下一个"
  54.   (princ "\n开始批量绘图...")
  55.   
  56.   ;; 设置图层
  57.   (command "layer" "m" "图形层" "c" "red" "图形层" "")
  58.   (wait-for-command-complete)
  59.   
  60.   ;; 绘制多个图形
  61.   (setq shapes (list
  62.     '("circle" "0,0" "25")
  63.     '("rectangle" "50,50" "100,100")
  64.     '("line" "150,0" "200,50" "")
  65.   ))
  66.   
  67.   (foreach shape shapes
  68.     (princ (strcat "\n正在绘制: " (car shape)))
  69.     (apply 'command shape)  ; 执行绘图命令
  70.     (wait-for-command-complete)  ; 等待完成
  71.     (princ " 完成!")
  72.   )
  73.   
  74.   (princ "\n批量绘图完成!")
  75.   (princ)
  76. )

  77. ;; 用户交互等待示例
  78. (defun c:interactive-demo ()
  79.   "交互式命令等待演示"
  80.   (princ "\n请选择一个点...")
  81.   
  82.   ;; 等待用户输入
  83.   (setq pt (getpoint "\n选择起点: "))
  84.   (if pt
  85.     (progn
  86.       (princ "\n开始绘制...")
  87.       (command "circle" pt "30")
  88.       (wait-for-command-complete)
  89.       (princ "\n绘制完成!")
  90.     )
  91.     (princ "\n用户取消操作")
  92.   )
  93.   (princ)
  94. )

  95. ;; 错误处理的等待示例
  96. (defun c:safe-command ()
  97.   "带错误处理的命令等待"
  98.   (setq old-error *error*)  ; 保存原错误处理
  99.   (setq *error* my-error-handler)  ; 设置自定义错误处理
  100.   
  101.   (princ "\n执行可能出错的命令...")
  102.   (command "unknown-command")  ; 故意的错误命令
  103.   
  104.   ;; 恢复错误处理
  105.   (setq *error* old-error)
  106.   (princ)
  107. )

  108. (defun my-error-handler (msg)
  109.   "自定义错误处理函数"
  110.   (princ (strcat "\n发生错误: " msg))
  111.   (command "^C^C")  ; 取消当前命令
  112.   (setq *error* old-error)  ; 恢复原错误处理
  113.   (princ)
  114. )

  115. ;; 调试辅助函数
  116. (defun debug-command-state ()
  117.   "显示当前命令状态信息"
  118.   (princ (strcat "\nCMDACTIVE: " (itoa (getvar "CMDACTIVE"))))
  119.   (princ (strcat "\nCMDNAME: " (getvar "CMDNAMES")))
  120.   (princ (strcat "\nCMDECHO: " (itoa (getvar "CMDECHO"))))
  121.   (princ)
  122. )

  123. ;; 使用说明:
  124. ;; 1. 加载此文件到AutoCAD
  125. ;; 2. 运行 wait-demo 查看基本等待方法
  126. ;; 3. 运行 batch-draw 查看批量操作示例
  127. ;; 4. 运行 interactive-demo 查看交互式等待
  128. ;; 5. 运行 debug-command-state 查看当前命令状态

点评

每次评论就能获得5积分 我真的太爱回复了  发表于 前天 16:45
回复 支持 反对

使用道具 举报

发表于 前天 15:33 | 显示全部楼层
  1. ;;=========================================
  2. ;; wait_command_demo.lsp
  3. ;; 演示:如何等待 command 命令结束后再执行下一句
  4. ;; 支持普通命令和弹出对话框的命令
  5. ;; 加载方式:APPLOAD 或 (load "wait_command_demo")
  6. ;; 输入命令:TESTCMD  开始测试
  7. ;;=========================================

  8. ;; 确保加载 Visual LISP 扩展函数(用于 sleep 和 redraw)
  9. (vl-load-com)

  10. (defun c:TESTCMD (/ pt1 pt2)

  11.   (prompt "\n&#128216; 开始执行 TESTCMD 测试...")

  12.   ; ---- 1. 普通命令:LINE(会自动等待结束)----
  13.   (prompt "\n&#128073; 第一步:请绘制一条直线...")
  14.   (command "_.line" pause pause "")  ; pause 等待用户输入两点,"" 表示回车结束
  15.   (prompt "\n&#9989; 直线已绘制完成,command 已自动阻塞等待结束。\n")



  16.   ; ---- 2. 弹出对话框命令:DIMSTYLE(不会自动等待!)----
  17.   (prompt "\n&#128073; 第二步:打开【标注样式管理器】对话框...")
  18.   (command "_.dimstyle")  ; 这个命令会弹出对话框,但 LISP 不会等待它关闭!

  19.   (prompt "\n&#9888;&#65039; 注意:对话框已打开,但 LISP 代码仍在运行!")

  20.   ; &#128257; 使用 CMDACTIVE 轮询,等待用户关闭对话框
  21.   (prompt "\n&#9203; 正在等待用户关闭【标注样式管理器】...")
  22.   (while (= (getvar "CMDACTIVE") 1)
  23.     (vl-cmdf "_.redraw")  ; 防止界面卡死
  24.     (sleep 200)           ; 暂停200毫秒,避免CPU占用过高
  25.   )

  26.   (prompt "\n&#9989; 对话框已关闭,命令真正结束!现在继续执行后续代码。\n")



  27.   ; ---- 3. 模拟“断点”调试功能 ----
  28.   (prompt "\n&#128721; 现在进入调试模式(类似断点)...")
  29.   (prompt (strcat "\n&#128161; 提示:当前 LISP 变量 pt1 = " (if pt1 (rtos pt1 2 2) "nil")))
  30.   (princ "\n&#9000;&#65039;  按回车键继续执行...")  ; 提示用户
  31.   (!)     ; 输出所有当前变量(仅在 VLIDE 调试时有用)
  32.   (pause) ; 暂停,等待用户按回车

  33.   (prompt "\n&#9989; 继续执行最后一步...")



  34.   ; ---- 4. 最后执行一个简单命令 ----
  35.   (command "_.circle" '(50 50) 100 "")
  36.   (prompt "\n&#128994; 一个圆已绘制在 (50,50),半径100。")

  37.   (prompt "\n&#127881; 所有操作完成!感谢使用 TESTCMD。")
  38.   (princ) ; 静默退出,不打印多余内容
  39. )

  40. ;; 可选:加载时提示
  41. (princ "\n&#128230; 已加载:wait_command_demo.lsp")
  42. (princ "\n&#128204; 输入命令 TESTCMD 开始测试。")
  43. (princ)
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 15:15 | 显示全部楼层
你有种再说一遍 发表于 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))
        )
回复 支持 反对

使用道具 举报

发表于 前天 14:43 | 显示全部楼层
难道你是用了sendCommand?
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 14:45 | 显示全部楼层
你有种再说一遍 发表于 2025-9-1 14:43
难道你是用了sendCommand?

啥意义,没有,,就是我的命令在绘图,需要一定时间完成
回复 支持 反对

使用道具 举报

发表于 前天 14:46 | 显示全部楼层
yaojing38 发表于 2025-9-1 14:45
啥意义,没有,,就是我的命令在绘图,需要一定时间完成

??发言意义不明...
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 14:58 | 显示全部楼层
本帖最后由 yaojing38 于 2025-9-1 14:59 编辑

没用 sendCommand 但是cmdactive 没有等待  就执行下一个了
回复 支持 反对

使用道具 举报

发表于 前天 15:00 | 显示全部楼层
加入延迟命令
回复 支持 反对

使用道具 举报

发表于 前天 15:02 | 显示全部楼层
yaojing38 发表于 2025-9-1 14:58
没用 sendCommand 但是cmdactive 没有等待  就执行下一个了

那就别用它啊,具体代码具体展示
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 15:16 | 显示全部楼层

试了也是不行
回复 支持 反对

使用道具 举报

发表于 前天 15:18 | 显示全部楼层

(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命令已发送,等待结束...")
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-3 07:36 , Processed in 0.231236 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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