明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: yaojing38

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

[复制链接]
 楼主| 发表于 2025-9-1 15:21:38 | 显示全部楼层
qifeifei 发表于 2025-9-1 15:18
(vl-load-com)

;; --- 获取当前文档 ---

vla-AddEventHandler  没这个,,给个?
回复 支持 反对

使用道具 举报

发表于 2025-9-1 15:25:01 | 显示全部楼层
本帖最后由 kozmosovia 于 2025-9-1 15:28 编辑
yaojing38 发表于 2025-9-1 15:21
vla-AddEventHandler  没这个,,给个?

别信这种AI臆造函数的代码。如果要确保顺序,可以在scr文件的最后,生成一个特殊图元,比如半径为1234.5678的圆,后继代码可以while 判断entlast是否是特殊图元,是了才结束while,删除该特殊图元并继续。

点评

他现在最好的办法就是找AI 我有问题都是找的ai 多个ai循环问  发表于 2025-9-1 15:29
回复 支持 反对

使用道具 举报

发表于 2025-9-1 15:29:22 | 显示全部楼层
看情况是把Lisp当作具备多线程语言来写了.
回复 支持 反对

使用道具 举报

发表于 2025-9-1 15:33:43 | 显示全部楼层
  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📘 开始执行 TESTCMD 测试...")

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



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

  19.   (prompt "\n⚠️ 注意:对话框已打开,但 LISP 代码仍在运行!")

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

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



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

  33.   (prompt "\n✅ 继续执行最后一步...")



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

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

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

使用道具 举报

发表于 2025-9-1 15:59:32 | 显示全部楼层
kozmosovia 发表于 2025-9-1 15:25
别信这种AI臆造函数的代码。如果要确保顺序,可以在scr文件的最后,生成一个特殊图元,比如半径为1234.56 ...

简单的问题可以,它现在这个是个比较复杂的个例。AI见过的所有lisp程序中,估计会用到script的,不到百万分之一。所以就别指望AI能很好的处理script相关的要求。

点评

确实是这样;当ai处理超过600行的代码 就会崩溃 而且非常卡  发表于 2025-9-1 16:35
回复 支持 反对

使用道具 举报

发表于 2025-9-1 16:30:45 | 显示全部楼层

你这是deepseek写的吧
回复 支持 反对

使用道具 举报

发表于 2025-9-1 16:44:08 | 显示全部楼层
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积分 我真的太爱回复了  发表于 2025-9-1 16:45
回复 支持 反对

使用道具 举报

发表于 2025-9-1 16:59:06 | 显示全部楼层

不错,国内的试用下来感觉还是deepseek厉害一点

点评

我去测试;结果 服务器繁忙,请稍后重试  发表于 2025-9-1 17:32
没用过deepseek;他每次都要思考好久 等不下去  发表于 2025-9-1 17:02
回复 支持 反对

使用道具 举报

发表于 2025-9-1 17:45:41 | 显示全部楼层
cghdy 发表于 2025-9-1 16:59
不错,国内的试用下来感觉还是deepseek厉害一点

他的思考过程是精华
回复 支持 反对

使用道具 举报

发表于 2025-9-1 17:47:59 | 显示全部楼层
现在跨界的多了,工程师开始卷代码;command方式的话,可以假如pause实现等待功能

点评

cmd我记得用的是这个  发表于 2025-9-1 19:09
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 07:47 , Processed in 0.167451 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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