x_s_s_1 发表于 2022-3-24 23:41:56

对话框切换问题

本帖最后由 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对话框;
发帖的时候没条件录屏,补个动图,表达的清楚一些

(defun c:aa ()
(setqdcllst '("temp1:dialog {"
   "            :button {"
   "                key = \"bt1\" ;"
   "                label = \"下一个对话框\" ;"
   "            }"
   "            :button {"
   "                is_cancel = true ;"
   "                key = \"bt2\" ;"
   "                label = \"取消\" ;"
   "            }"
   "}"
   "temp2:dialog {"
   "            :button {"
   "                key = \"bt3\" ;"
   "                label = \"图中选择\" ;"
   "            }"
   "            :button {"
   "                is_cancel = true ;"
   "                key = \"bt4\" ;"
   "                label = \"回前菜单\" ;"
   "            }"
   "}"
    )
)
(setqtmpf (xty-sys-makeFbylst
         (vl-filename-mktemp nil nil ".dcl")
         dcllst
       )
)
(setq callback1 2)
(setq dcl_id (load_dialog tmpf))
(vl-file-delete tmpf)
(while (> callback1 1)
    (new_dialog "temp1" dcl_id)
    (action_tile "bt1" "(do_bt1)")
    (action_tile "bt2" "(do_bt2)")
    (setq callback1 (start_dialog))
    (cond ((= 1 callback1) (showtemp2))
    ((= 2 callback1))
    )
)
(unload_dialog dcl_id)
)
(defun do_bt1 () (done_dialog 1))
(defun do_bt2 () (done_dialog 2))
(defun showtemp2 ()
(setq callback2 2)
(while (> callback2 1)
    (new_dialog "temp2" dcl_id)
    (action_tile "bt3" "(do_bt3)")
    (action_tile "bt4" "(do_bt4)")
    (setq callback2 (start_dialog))
    (cond ((= 1 callback2))
    ((= 2 callback2))
    )
)
)
(defun xty-sys-makeFbylst (filename strlst / f n)
(setq f (open filename "w"))
(foreach n strlst (write-line n f))
(close f)
filename
)





masterlong 发表于 2022-3-24 23:41:57

无非就是一个逻辑关系嘛
DCL文件里有几个对话框有啥关系
都是可以单独调用的

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

wzg356 发表于 2022-3-25 00:18:25

本帖最后由 wzg356 于 2022-3-25 00:23 编辑

分开写简单些
取消按钮(done_dialog 0)为默认/必须,可以不写
(defun c:aa ( / dcllst tmpf dcl_id callback1)
(setqdcllst '("temp1:dialog {"
   "            :button {"
   "                key = \"bt1\" ;"
   "                label = \"下一个对话框\" ;"
   "            }"
   "            :button {"
   "                is_cancel = true ;"
   "                key = \"bt2\" ;"
   "                label = \"取消\" ;"
   "            }"
   "}"
    )
)
(setqtmpf (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)
(setqdcllst '("temp2:dialog {"
   "            :button {"
   "                key = \"bt3\" ;"
   "                label = \"图中选择\" ;"
   "            }"
   "            :button {"
   "                is_cancel = true ;"
   "                key = \"bt4\" ;"
   "                label = \"回前菜单\" ;"
   "            }"
   "}"
    )
)
(setqtmpf (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
)

x_s_s_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对话框。晚点我验证一下。再次感谢,辛苦了.

x_s_s_1 发表于 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的代码
(defun c:aa()(bb))
(defun bb ()
(setq        dcllst1        '("temp1:dialog {"
                  "            :button {"
                  "                key = \"bt1\" ;"
                  "                label = \"下一个对话框\" ;"
                  "            }"
                  "            :button {"
                  "                is_cancel = true ;"
                  "                key = \"bt2\" ;"
                  "                label = \"取消\" ;"
                  "            }"
                  "}"
                  )
        )
(setq        tmpf (xty-sys-makeFbylst
             (vl-filename-mktemp nil nil ".dcl")
             dcllst1
             )
        )
(setq callback1 2)
(setq dcl_id1 (load_dialog tmpf))
(vl-file-delete tmpf)
(while (> callback1 1)
    (new_dialog "temp1" dcl_id1)
    (action_tile "bt1" "(do_bt1)")
    (action_tile "bt2" "(do_bt2)")
    (setq callback1 (start_dialog))
    (cond ((= 1 callback1) (cc))
          ((= 2 callback1))
          )
    )
(unload_dialog dcl_id1)
)
(defun cc ()
(setq        dcllst2        '("temp2:dialog {"
                  "            :button {"
                  "                key = \"bt3\" ;"
                  "                label = \"图中选择\" ;"
                  "            }"
                  "            :button {"
                  "                is_cancel = true ;"
                  "                key = \"bt4\" ;"
                  "                label = \"回前菜单\" ;"
                  "            }"
                  "}"
                  )
        )
(setq        tmpf (xty-sys-makeFbylst
             (vl-filename-mktemp nil nil ".dcl")
             dcllst2
             )
        )
(setq callback2 2)
(setq dcl_id2 (load_dialog tmpf))
(vl-file-delete tmpf)
(while (> callback2 1)
    (new_dialog "temp2" dcl_id2)
    (action_tile "bt3" "(do_bt3)")
    (action_tile "bt4" "(do_bt4)")
    (setq callback2 (start_dialog))
    (cond ((= 2 callback2) (setq pt(getpoint"\n图中拾取:")))
          ((= 0 callback2)(bb))
          )
    )
(unload_dialog dcl_id2)
)
(defun do_bt1()(done_dialog 1))
(defun do_bt3()(done_dialog 2))

xyp1964 发表于 2022-3-25 15:01:16


(defun c:aa ()
(defun do_bt1 () (done_dialog 1))
(defun do_bt2 () (done_dialog 0))
(setq        dcl1        '("temp1:dialog{:button{key=bt1;label=下一个对话框;}"
                  ":button{is_cancel=true;key=bt2;label=取消;}}"
               )
        tmpf        (xty-sys-makeFbylst
                  (vl-filename-mktemp nil nil ".dcl")
                  dcl1
                )
        dcl_id1        (load_dialog tmpf)
)
(vl-file-delete tmpf)
(new_dialog "temp1" dcl_id1)
(action_tile "bt1" "(do_bt1)")
(action_tile "bt2" "(do_bt2)")
(setq callback1 (start_dialog))
(cond ((= callback1 1) (c:bb)))
(unload_dialog dcl_id1)
(princ)
)

(defun c:bb ()
(defun do_bt3 () (done_dialog 1))
(defun do_bt4 () (done_dialog 2))
(setq        dcl2        '("temp2:dialog{"
                  ":button{key=bt3;label=图中选择;}"
                  ":button{is_cancel=true;key=bt4;label=回前菜单;}}"
               )
        tmpf        (xty-sys-makeFbylst
                  (vl-filename-mktemp nil nil ".dcl")
                  dcl2
                )
        dcl_id2        (load_dialog tmpf)
)
(vl-file-delete tmpf)
(new_dialog "temp2" dcl_id2)
(action_tile "bt3" "(do_bt3)")
(action_tile "bt4" "(do_bt4)")
(setq callback2 (start_dialog))
(cond        ((= callback2 1) (setq pt (getpoint "\n图中拾取:")))
        ((= callback2 2) (c:aa))
)
(unload_dialog dcl_id2)
(princ)
)

(defun xty-sys-makeFbylst (filename strlst / f n)
(setq f (open filename "w"))
(foreach n strlst (write-line n f))
(close f)
filename
)

wzg356 发表于 2022-3-25 19:09:52

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

不影响啊

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

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

xyp1964 发表于 2022-3-25 22:16:17

xyp1964 发表于 2022-3-25 15:01



(defun c:tt ()
(setq        dlst '("temp1:dialog{:button{key=bt1;label=下一个对话框;}"
             ":button{is_cancel=true;key=bt2;label=取消;}}"
             "temp2:dialog{:button{key=bt3;label=图中选择;}"
             ":button{is_cancel=true;key=bt4;label=回前菜单;}}"
              )
)
(defun aa () ; tt(dcl界面切换)
    (defun do_bt1 () (done_dialog 1))
    (defun do_bt2 () (done_dialog 0))
    (setq tmpf          (xty-sys-makeFbylst
                  (vl-filename-mktemp nil nil ".dcl")
                  dlst
                  )
          dcl_id1 (load_dialog tmpf)
    )
    (vl-file-delete tmpf)
    (new_dialog "temp1" dcl_id1)
    (action_tile "bt1" "(do_bt1)")
    (action_tile "bt2" "(do_bt2)")
    (setq callback1 (start_dialog))
    (cond ((= callback1 1) (bb)))
    (unload_dialog dcl_id1)
    (princ)
)
(defun bb ()
    (defun do_bt3 () (done_dialog 1))
    (defun do_bt4 () (done_dialog 2))
    (setq tmpf          (xty-sys-makeFbylst
                  (vl-filename-mktemp nil nil ".dcl")
                  dlst
                  )
          dcl_id2 (load_dialog tmpf)
    )
    (vl-file-delete tmpf)
    (new_dialog "temp2" dcl_id2)
    (action_tile "bt3" "(do_bt3)")
    (action_tile "bt4" "(do_bt4)")
    (setq callback2 (start_dialog))
    (cond ((= callback2 1) (setq pt (getpoint "\n图中拾取:")))
          ((= callback2 2) (aa))
    )
    (unload_dialog dcl_id2)
    (princ)
)
(defun xty-sys-makeFbylst (filename strlst / f n)
    (setq f (open filename "w"))
    (foreach n strlst (write-line n f))
    (close f)
    filename
)
(aa)
(princ)
)

x_s_s_1 发表于 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,所以要单独把写文件的函数写在循环外面。
下面是我调整后的代码(defun c:cc (/ aa bb callback dcllst dcl_id pt tmpf)
(defun aa ()
(new_dialog "temp1" dcl_id)
(action_tile "bt1" "(done_dialog 1)")
(setq callback (start_dialog))
(cond
    ((= 1 callback) (bb))
    )
)
(defun bb ()
(new_dialog "temp2" dcl_id)
(action_tile "bt3" "(done_dialog 2)")
(action_tile "bt4" "(done_dialog 4)")
(setq callback (start_dialog))
(cond
    ((= 2 callback) (setq pt (getpoint "\n图中拾取:")) (bb))
    ((= 4 callback) (aa))
    )
)
(setq      dcllst
         '("temp1:dialog{"
         ":button {key = \"bt1\" ;label = \"下一个对话框\" ;}"
         ":button {is_cancel = true ;key = \"bt2\" ;label = \"取消\" ;}"
         "}"
         "temp2:dialog {"
         ":button {key = \"bt3\" ;label = \"图中选择\" ;}"
         ":button {is_cancel = true ;key = \"bt4\" ;label = \"回前菜单\" ;}"
         "}"
         )
      )
(setq      tmpf (xty-sys-makeFbylst
               "c:\\1.dcl"
               dcllst
               )
      )
(setq dcl_id (load_dialog tmpf))
(vl-file-delete tmpf)
(aa)
(unload_dialog dcl_id)
)

x_s_s_1 发表于 2022-3-26 00:36:08

虽然masterlong并没有给出实际的解决方案,但是他的提醒非常有用,我还是将最佳答案给masterlong兄,wzg356和院长应该不会有意见吧,如有意见,私发消息给我,我另行补偿,谢谢各位.
页: [1] 2
查看完整版本: 对话框切换问题