明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2672|回复: 19

[提问] 对话框切换问题

[复制链接]
发表于 2022-3-24 23:41:56 | 显示全部楼层 |阅读模式
10明经币
本帖最后由 x_s_s_1 于 2022-3-25 08:59 编辑

关于多个对话框之间的切换,尝试了很久,没有成功,麻烦各位网友相助,谢谢。
举例,一个dcl文件中,包含temp1和temp2两个对话框.1.执行命令aa,显示temp1对话框,其有两个按钮【下一个对话框】【取消】;
2.对话框temp1有两个按钮,当按【取消】时,关闭temp1对话框;
3.当按【下一个对话框】按钮时,关闭temp1对话框,显示temp2对话框;
4.temp2对话框有两个按钮【图中选择】【回前菜单】;
5.当按【图中选择】按钮时,关闭全部对话框,至图中选择一个图元,选择完毕后回到temp2对话框;
6.当按【回前菜单】按钮时关闭temp2对话框,显示temp1对话框;
发帖的时候没条件录屏,补个动图,表达的清楚一些

  1. (defun c:aa ()
  2.   (setq  dcllst '("temp1:dialog {"
  3.      "            :button {"
  4.      "                key = "bt1" ;"
  5.      "                label = "下一个对话框" ;"
  6.      "            }"
  7.      "            :button {"
  8.      "                is_cancel = true ;"
  9.      "                key = "bt2" ;"
  10.      "                label = "取消" ;"
  11.      "            }"
  12.      "}"
  13.      "temp2:dialog {"
  14.      "            :button {"
  15.      "                key = "bt3" ;"
  16.      "                label = "图中选择" ;"
  17.      "            }"
  18.      "            :button {"
  19.      "                is_cancel = true ;"
  20.      "                key = "bt4" ;"
  21.      "                label = "回前菜单" ;"
  22.      "            }"
  23.      "}"
  24.     )
  25.   )
  26.   (setq  tmpf (xty-sys-makeFbylst
  27.          (vl-filename-mktemp nil nil ".dcl")
  28.          dcllst
  29.        )
  30.   )
  31.   (setq callback1 2)
  32.   (setq dcl_id (load_dialog tmpf))
  33.   (vl-file-delete tmpf)
  34.   (while (> callback1 1)
  35.     (new_dialog "temp1" dcl_id)
  36.     (action_tile "bt1" "(do_bt1)")
  37.     (action_tile "bt2" "(do_bt2)")
  38.     (setq callback1 (start_dialog))
  39.     (cond ((= 1 callback1) (showtemp2))
  40.     ((= 2 callback1))
  41.     )
  42.   )
  43.   (unload_dialog dcl_id)
  44. )
  45. (defun do_bt1 () (done_dialog 1))
  46. (defun do_bt2 () (done_dialog 2))
  47. (defun showtemp2 ()
  48.   (setq callback2 2)
  49.   (while (> callback2 1)
  50.     (new_dialog "temp2" dcl_id)
  51.     (action_tile "bt3" "(do_bt3)")
  52.     (action_tile "bt4" "(do_bt4)")
  53.     (setq callback2 (start_dialog))
  54.     (cond ((= 1 callback2))
  55.     ((= 2 callback2))
  56.     )
  57.   )
  58. )
  59. (defun xty-sys-makeFbylst (filename strlst / f n)
  60.   (setq f (open filename "w"))
  61.   (foreach n strlst (write-line n f))
  62.   (close f)
  63.   filename
  64. )






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

最佳答案

查看完整内容

无非就是一个逻辑关系嘛 DCL文件里有几个对话框有啥关系 都是可以单独调用的 所有的对话框启动和退出时 设置好对话框数据的load与save函数以后 循环调用、嵌套调用想怎么做怎么做
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-3-24 23:41:57 | 显示全部楼层
无非就是一个逻辑关系嘛
DCL文件里有几个对话框有啥关系
都是可以单独调用的

所有的对话框启动和退出时
设置好对话框数据的load与save函数以后
循环调用、嵌套调用想怎么做怎么做
回复

使用道具 举报

发表于 2022-3-25 00:18:25 | 显示全部楼层
本帖最后由 wzg356 于 2022-3-25 00:23 编辑

分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callback1)
  (setq  dcllst '("temp1:dialog {"
     "            :button {"
     "                key = \"bt1\" ;"
     "                label = \"下一个对话框\" ;"
     "            }"
     "            :button {"
     "                is_cancel = true ;"
     "                key = \"bt2\" ;"
     "                label = \"取消\" ;"
     "            }"
     "}"
    )
  )
  (setq  tmpf (xty-sys-makeFbylst
         (vl-filename-mktemp nil nil ".dcl")
         dcllst
       )
  )
  (setq dcl_id (load_dialog tmpf))
  (vl-file-delete tmpf)
  (new_dialog "temp1" dcl_id)
  (action_tile "bt1" "(done_dialog 1)")
  (setq callback1 (start_dialog))   
  (unload_dialog dcl_id)
  (if (= callback1 1) (bb))
)
(defun bb ( / dcllst tmpf dcl_id callback1)
  (setq  dcllst '("temp2:dialog {"
     "            :button {"
     "                key = \"bt3\" ;"
     "                label = \"图中选择\" ;"
     "            }"
     "            :button {"
     "                is_cancel = true ;"
     "                key = \"bt4\" ;"
     "                label = \"回前菜单\" ;"
     "            }"
     "}"
    )
  )
  (setq  tmpf (xty-sys-makeFbylst
         (vl-filename-mktemp nil nil ".dcl")
         dcllst
       )
  )  
  (setq dcl_id (load_dialog tmpf))
  (vl-file-delete tmpf)
   (new_dialog "temp2" dcl_id)
   (action_tile "bt3" "(done_dialog 1)")
   (action_tile "bt4" "(done_dialog 2)")
   (setq callback1 (start_dialog))
   (unload_dialog dcl_id)
    (cond
            ((= callback1 2) (c:aa))
            ((= callback1 1) (alert "图中选择"))
            (t nil)
   
    )
)
(defun xty-sys-makeFbylst (filename strlst / f n)
  (setq f (open filename "w"))
  (foreach n strlst (write-line n f))
  (close f)
  filename
)

评分

参与人数 2明经币 +2 收起 理由
AndyWang + 1 赞一个!
x_s_s_1 + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2022-3-25 08:19:30 | 显示全部楼层
wzg356 发表于 2022-3-25 00:18
分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callb ...

谢谢,这么晚还回帖,分开的dcl我写出来了,您这个代码我看了一下,估计在点取了bt3后直接退出命令,不会回到temp2对话框。晚点我验证一下。再次感谢,辛苦了.
回复

使用道具 举报

 楼主| 发表于 2022-3-25 08:53:11 | 显示全部楼层
wzg356 发表于 2022-3-25 00:18
分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callb ...

验证了一下您的代码,确实点了bt3以后不会回到temp2,下面是我自己写的两个dcl的代码
  1. (defun c:aa()(bb))
  2. (defun bb ()
  3.   (setq        dcllst1        '("temp1:dialog {"
  4.                   "            :button {"
  5.                   "                key = "bt1" ;"
  6.                   "                label = "下一个对话框" ;"
  7.                   "            }"
  8.                   "            :button {"
  9.                   "                is_cancel = true ;"
  10.                   "                key = "bt2" ;"
  11.                   "                label = "取消" ;"
  12.                   "            }"
  13.                   "}"
  14.                   )
  15.         )
  16.   (setq        tmpf (xty-sys-makeFbylst
  17.                (vl-filename-mktemp nil nil ".dcl")
  18.                dcllst1
  19.                )
  20.         )
  21.   (setq callback1 2)
  22.   (setq dcl_id1 (load_dialog tmpf))
  23.   (vl-file-delete tmpf)
  24.   (while (> callback1 1)
  25.     (new_dialog "temp1" dcl_id1)
  26.     (action_tile "bt1" "(do_bt1)")
  27.     (action_tile "bt2" "(do_bt2)")
  28.     (setq callback1 (start_dialog))
  29.     (cond ((= 1 callback1) (cc))
  30.           ((= 2 callback1))
  31.           )
  32.     )
  33.   (unload_dialog dcl_id1)
  34.   )
  35. (defun cc ()
  36.   (setq        dcllst2        '("temp2:dialog {"
  37.                   "            :button {"
  38.                   "                key = "bt3" ;"
  39.                   "                label = "图中选择" ;"
  40.                   "            }"
  41.                   "            :button {"
  42.                   "                is_cancel = true ;"
  43.                   "                key = "bt4" ;"
  44.                   "                label = "回前菜单" ;"
  45.                   "            }"
  46.                   "}"
  47.                   )
  48.         )
  49.   (setq        tmpf (xty-sys-makeFbylst
  50.                (vl-filename-mktemp nil nil ".dcl")
  51.                dcllst2
  52.                )
  53.         )
  54.   (setq callback2 2)
  55.   (setq dcl_id2 (load_dialog tmpf))
  56.   (vl-file-delete tmpf)
  57.   (while (> callback2 1)
  58.     (new_dialog "temp2" dcl_id2)
  59.     (action_tile "bt3" "(do_bt3)")
  60.     (action_tile "bt4" "(do_bt4)")
  61.     (setq callback2 (start_dialog))
  62.     (cond ((= 2 callback2) (setq pt(getpoint"\n图中拾取:")))
  63.           ((= 0 callback2)(bb))
  64.           )
  65.     )
  66.   (unload_dialog dcl_id2)
  67.   )
  68. (defun do_bt1()(done_dialog 1))
  69. (defun do_bt3()(done_dialog 2))
回复

使用道具 举报

发表于 2022-3-25 15:01:16 | 显示全部楼层
  1. (defun c:aa ()
  2.   (defun do_bt1 () (done_dialog 1))
  3.   (defun do_bt2 () (done_dialog 0))
  4.   (setq        dcl1        '("temp1:dialog{:button{key=bt1;label=下一个对话框;}"
  5.                   ":button{is_cancel=true;key=bt2;label=取消;}}"
  6.                  )
  7.         tmpf        (xty-sys-makeFbylst
  8.                   (vl-filename-mktemp nil nil ".dcl")
  9.                   dcl1
  10.                 )
  11.         dcl_id1        (load_dialog tmpf)
  12.   )
  13.   (vl-file-delete tmpf)
  14.   (new_dialog "temp1" dcl_id1)
  15.   (action_tile "bt1" "(do_bt1)")
  16.   (action_tile "bt2" "(do_bt2)")
  17.   (setq callback1 (start_dialog))
  18.   (cond ((= callback1 1) (c:bb)))
  19.   (unload_dialog dcl_id1)
  20.   (princ)
  21. )

  22. (defun c:bb ()
  23.   (defun do_bt3 () (done_dialog 1))
  24.   (defun do_bt4 () (done_dialog 2))
  25.   (setq        dcl2        '("temp2:dialog{"
  26.                   ":button{key=bt3;label=图中选择;}"
  27.                   ":button{is_cancel=true;key=bt4;label=回前菜单;}}"
  28.                  )
  29.         tmpf        (xty-sys-makeFbylst
  30.                   (vl-filename-mktemp nil nil ".dcl")
  31.                   dcl2
  32.                 )
  33.         dcl_id2        (load_dialog tmpf)
  34.   )
  35.   (vl-file-delete tmpf)
  36.   (new_dialog "temp2" dcl_id2)
  37.   (action_tile "bt3" "(do_bt3)")
  38.   (action_tile "bt4" "(do_bt4)")
  39.   (setq callback2 (start_dialog))
  40.   (cond        ((= callback2 1) (setq pt (getpoint "\n图中拾取:")))
  41.         ((= callback2 2) (c:aa))
  42.   )
  43.   (unload_dialog dcl_id2)
  44.   (princ)
  45. )

  46. (defun xty-sys-makeFbylst (filename strlst / f n)
  47.   (setq f (open filename "w"))
  48.   (foreach n strlst (write-line n f))
  49.   (close f)
  50.   filename
  51. )

点评

院长,谢谢您,不过您这个也是两个dcl文件的,两个dcl文件我是可以搞定的,搞不定的是一个dcl文件中含有两个dcl的。  发表于 2022-3-25 15:36

评分

参与人数 2明经币 +2 收起 理由
AndyWang + 1 赞一个!
x_s_s_1 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2022-3-25 19:09:52 | 显示全部楼层
x_s_s_1 发表于 2022-3-25 08:19
谢谢,这么晚还回帖,分开的dcl我写出来了,您这个代码我看了一下,估计在点取了bt3后直接退出命令,不会 ...

不影响啊

aa里面两个对话框一起也可以,

把bb里面写/删对话框过程删掉就行了
回复

使用道具 举报

发表于 2022-3-25 22:16:17 | 显示全部楼层

  1. (defun c:tt ()
  2.   (setq        dlst '("temp1:dialog{:button{key=bt1;label=下一个对话框;}"
  3.                ":button{is_cancel=true;key=bt2;label=取消;}}"
  4.                "temp2:dialog{:button{key=bt3;label=图中选择;}"
  5.                ":button{is_cancel=true;key=bt4;label=回前菜单;}}"
  6.               )
  7.   )
  8.   (defun aa () ; tt(dcl界面切换)
  9.     (defun do_bt1 () (done_dialog 1))
  10.     (defun do_bt2 () (done_dialog 0))
  11.     (setq tmpf          (xty-sys-makeFbylst
  12.                     (vl-filename-mktemp nil nil ".dcl")
  13.                     dlst
  14.                   )
  15.           dcl_id1 (load_dialog tmpf)
  16.     )
  17.     (vl-file-delete tmpf)
  18.     (new_dialog "temp1" dcl_id1)
  19.     (action_tile "bt1" "(do_bt1)")
  20.     (action_tile "bt2" "(do_bt2)")
  21.     (setq callback1 (start_dialog))
  22.     (cond ((= callback1 1) (bb)))
  23.     (unload_dialog dcl_id1)
  24.     (princ)
  25.   )
  26.   (defun bb ()
  27.     (defun do_bt3 () (done_dialog 1))
  28.     (defun do_bt4 () (done_dialog 2))
  29.     (setq tmpf          (xty-sys-makeFbylst
  30.                     (vl-filename-mktemp nil nil ".dcl")
  31.                     dlst
  32.                   )
  33.           dcl_id2 (load_dialog tmpf)
  34.     )
  35.     (vl-file-delete tmpf)
  36.     (new_dialog "temp2" dcl_id2)
  37.     (action_tile "bt3" "(do_bt3)")
  38.     (action_tile "bt4" "(do_bt4)")
  39.     (setq callback2 (start_dialog))
  40.     (cond ((= callback2 1) (setq pt (getpoint "\n图中拾取:")))
  41.           ((= callback2 2) (aa))
  42.     )
  43.     (unload_dialog dcl_id2)
  44.     (princ)
  45.   )
  46.   (defun xty-sys-makeFbylst (filename strlst / f n)
  47.     (setq f (open filename "w"))
  48.     (foreach n strlst (write-line n f))
  49.     (close f)
  50.     filename
  51.   )
  52.   (aa)
  53.   (princ)
  54. )
回复

使用道具 举报

 楼主| 发表于 2022-3-26 00:32:36 | 显示全部楼层
本帖最后由 x_s_s_1 于 2022-3-26 09:00 编辑
masterlong 发表于 2022-3-25 17:28
无非就是一个逻辑关系嘛
DCL文件里有几个对话框有啥关系
都是可以单独调用的

您的回帖点醒了我,我逐步调试了一下程序,大概理解了dcl的逻辑,与dcl文件中几个dialog没有任何关系;
new_dialog开始一个新的对话框,然后开始给对话框赋值,这个时候并没有显示对话框;
new_dialog一次,更新一次;
start_dialog显示对话框,把控制权交给对话框,这个时候可以选择控件;
再通过action_tile配合done_dialog 中断对话框,进行操作。
在这个期间,所有的dialog都在内存里面,想显示哪个dialog就new_dialog哪一个、
本帖中8楼以前的代码,实际上都多次写了dcl文件,因为bb函数回调的时候都调用了aa,所以要单独把写文件的函数写在循环外面。
下面是我调整后的代码
  1. (defun c:cc (/ aa bb callback dcllst dcl_id pt tmpf)
  2.   (defun aa ()
  3.   (new_dialog "temp1" dcl_id)
  4.   (action_tile "bt1" "(done_dialog 1)")
  5.   (setq callback (start_dialog))
  6.   (cond
  7.     ((= 1 callback) (bb))
  8.     )
  9.   )
  10. (defun bb ()
  11.   (new_dialog "temp2" dcl_id)
  12.   (action_tile "bt3" "(done_dialog 2)")
  13.   (action_tile "bt4" "(done_dialog 4)")
  14.   (setq callback (start_dialog))
  15.   (cond
  16.     ((= 2 callback) (setq pt (getpoint "\n图中拾取:")) (bb))
  17.     ((= 4 callback) (aa))
  18.     )
  19.   )
  20.   (setq        dcllst
  21.          '("temp1:dialog{"
  22.            ":button {key = \"bt1\" ;label = \"下一个对话框\" ;}"
  23.            ":button {is_cancel = true ;key = \"bt2\" ;label = \"取消\" ;}"
  24.            "}"
  25.            "temp2:dialog {"
  26.            ":button {key = \"bt3\" ;label = \"图中选择\" ;}"
  27.            ":button {is_cancel = true ;key = \"bt4\" ;label = \"回前菜单\" ;}"
  28.            "}"
  29.            )
  30.         )
  31.   (setq        tmpf (xty-sys-makeFbylst
  32.                "c:\\1.dcl"
  33.                dcllst
  34.                )
  35.         )
  36.   (setq dcl_id (load_dialog tmpf))
  37.   (vl-file-delete tmpf)
  38.   (aa)
  39.   (unload_dialog dcl_id)
  40.   )

回复

使用道具 举报

 楼主| 发表于 2022-3-26 00:36:08 | 显示全部楼层
虽然masterlong并没有给出实际的解决方案,但是他的提醒非常有用,我还是将最佳答案给masterlong兄,wzg356和院长应该不会有意见吧,如有意见,私发消息给我,我另行补偿,谢谢各位.

点评

思想当然是最重要的,代码啥都是浮云,哈哈哈哈  发表于 2022-3-26 14:20
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 01:22 , Processed in 0.292734 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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