明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1285|回复: 14

[提问] DCL界面按钮触发后,怎么返回界面

[复制链接]
发表于 2025-3-1 13:14:16 | 显示全部楼层 |阅读模式
我点击dcl界面的一个按钮,然后执行拾取dwg中相关内容操作。这一点我能做到。

我的问题是,拾取后,怎么又能返回dcl界面呢,我之前的做法就是再次调用,但是这样感觉不丝滑,大家知道怎么写吗。
回复

使用道具 举报

发表于 2025-3-1 19:26:16 | 显示全部楼层
不需要两次new_dialog,在一开始直接给dcl_status赋值大于1,然后
(setq dcl_status 10)
(while (> dcl_status 1)
(new_dialog.......)
......
(setq dcl_status (done_dialog))
(cond((= dcl_status 1) (....))
        ((= dcl_status 2) (....))
        ((= dcl_status 3) (....))
        ...
); EndCond
); EndWhile
回复 支持 2 反对 0

使用道具 举报

发表于 2025-3-1 18:04:27 | 显示全部楼层
我二十天前也遇到这个问题,deepseek给了我思路:
  1. my_dialog : dialog {
  2.     label = "选择基点";
  3.     : text {
  4.         key = "txt_pt";
  5.         label = "基点: 未选择";
  6.     }
  7.     : button {
  8.         key = "btn_pick";
  9.         label = "拾取基点";
  10.     }
  11.     ok_cancel;
  12. }

  1. (defun c:test (/ dcl_id pt saved_pt dcl_status)
  2.     (setq dcl_id (load_dialog "base_pt.dcl"))
  3.     (if (not (new_dialog "my_dialog" dcl_id))
  4.         (exit)
  5.     )
  6.     ; 初始化基点显示
  7.     (set_tile "txt_pt" (if pt
  8.                          (vl-princ-to-string pt)
  9.                          "未选择"))
  10.   
  11.     ; 设置按钮动作
  12.     (action_tile "btn_pick" "(done_dialog 2)")
  13.     (action_tile "accept" "(done_dialog 1)")
  14.     (action_tile "cancel" "(done_dialog 0)")
  15.    
  16.     (setq dcl_status (start_dialog))
  17.     (unload_dialog dcl_id)
  18.    
  19.     ; 处理拾取循环
  20.     (while (= dcl_status 2)
  21.         ; 临时保存当前点
  22.         (setq saved_pt pt)
  23.         ; 获取新点
  24.         (if (setq pt (getpoint "\n指定基点: "))
  25.             (princ (strcat "\n基点已设为: " (vl-princ-to-string pt)))
  26.             (setq pt saved_pt) ; 用户取消,恢复之前的值
  27.         )
  28.         ; 重新加载对话框
  29.         (setq dcl_id (load_dialog "base_pt.dcl"))
  30.         (if (not (new_dialog "my_dialog" dcl_id))
  31.             (exit)
  32.         )
  33.         ; 更新基点显示
  34.         (set_tile "txt_pt" (if pt
  35.                              (vl-princ-to-string pt)
  36.                              "未选择"))
  37.         ; 重新绑定动作
  38.         (action_tile "btn_pick" "(done_dialog 2)")
  39.         (action_tile "accept" "(done_dialog 1)")
  40.         (action_tile "cancel" "(done_dialog 0)")
  41.         (setq dcl_status (start_dialog))
  42.         (unload_dialog dcl_id)
  43.     )
  44.    
  45.     ; 用户点击确定时返回点
  46.     (if (= dcl_status 1)
  47.         (progn
  48.             (princ "\n最终基点: ")
  49.             (princ pt)
  50.             pt ; 返回点供后续使用
  51.         )
  52.     )
  53. )

  54. ;(setq my_base_pt (c:test))
  55. ;(if my_base_pt
  56. ;    (command "_circle" my_base_pt 5) ; 示例:在基点绘制圆
  57. ;)



本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-3-2 17:49:01 | 显示全部楼层
;(dddd "123")
(defun dddd(a / strs file f dcl_id d)"is_cancel=true;"
(setq strs '(
"ddddcl:dialog {label = \"重载dcl示例\" ;"
"    :edit_box {edit_width = 10 ;key = \"key1\" ;}"
"    :button {label = \"图取文字\";key = \"key3\";}"
"    :button {label = \"输出\";key = \"key2\";}"
"    :button {label = \"取消\";key = \"key4\";is_cancel=true;}"
"    }"
))
    (setq file (vl-filename-mktemp "DclTemp.dcl"))
    (setq f (open file "w"))
    (foreach str strs(princ "\n" f)(princ str f))
    (close f)
    (setq dcl_id (load_dialog file))
        (new_dialog "ddddcl" dcl_id)       
        (set_tile "key1" a)
        (action_tile "key2" "(setq a(get_tile \"key1\"))(done_dialog 1)")
        (action_tile "key3" "(done_dialog 2)")                       
        (setq dd (start_dialog))
        (unload_dialog dcl_id)
        (vl-file-delete file);删除临时dcl文件       
        (cond
                ((= 1 dd)a)
                ((= 2 dd)(dddd (cdr(assoc 1(entget(car(entsel"点取文字图元")))))))
        )               
)
回复 支持 反对

使用道具 举报

发表于 2025-3-1 13:18:38 | 显示全部楼层
加个循环、只有点击确定或取消时关闭对话框就行了
回复 支持 反对

使用道具 举报

发表于 2025-3-1 13:37:43 | 显示全部楼层
把启动对话框做成自定义函数  拾取后再调用
回复 支持 反对

使用道具 举报

发表于 2025-3-1 14:33:49 | 显示全部楼层
(defun jzdcl ()


(action_tile "xjsq" "(done_dialog 1)")
(if (= dd 0) (vl-exit-with-value 0))
  (if (= dd 1) (sub_sjsq))


(defunct  sub_sjsq()



(jzdcl)
回复 支持 反对

使用道具 举报

发表于 2025-3-1 15:35:20 | 显示全部楼层

回复 支持 反对

使用道具 举报

发表于 2025-3-1 21:34:56 | 显示全部楼层
01、启动设置为一个函数,调用函数就可以。
02、但是如果有除了拾取以外的编辑框数据,记得保存数据,否则你的拾取数据正确了,但是其他数据为初始数值,可能也不好用;
回复 支持 反对

使用道具 举报

发表于 2025-3-4 08:37:03 来自手机 | 显示全部楼层
路人看下热闹,飘过
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-1 09:28 , Processed in 0.191712 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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