aloy 发表于 2022-7-5 16:24:53

DCL中的复选框

大家好,
 
我一直在尝试在dcl中实现复选框。我从切换中选择的返回值是否相同(0值)。我在下面给出了代码和使用的对话框。
 
如果您能帮我解决这个问题,我们将不胜感激。
 
芦荟
samp8 : dialog {                                //dialog name
   label = "Pipe Lines" ;      //give it a label

      : row {                                        //define row

      :boxed_column {                        //define radio column
      label = "Pipe diameters used (mm)" ; //give it a label

       : toggle {                        //define toggle
              key = "tog1" ;                                //give it a name
              label = "150" ;                      //give it a label
                                             
              }                                       

            : toggle {                        //define toggle
              key = "tog2" ;                                //give it a name
              label = "200" ;                //give it a label
            }                               

            : toggle {                        //define toggle
              key = "tog3" ;                                //give it a name
              label = "225" ;                      //give it a label
              }                                       

            : toggle {                        //define toggle
              key = "tog4" ;                                //give it a name
              label = "250" ;                        //give it a label
            }                                       

            : toggle {                        //define toggle
              key = "tog5" ;                                //give it a name
              label = "300" ;                       //give it a label
              }                                       

            : toggle {                        //define toggle
              key = "tog6" ;                                //give it a name
              label = "375" ;                      //give it a label
            }

            : toggle {                        //define toggle
              key = "tog7" ;                                //give it a name
              label = "450" ;                      //give it a label
            }

            : toggle {                        //define toggle
              key = "tog8" ;                                //give it a name
              label = "600" ;                       //give it a label
            }

       }                                        //end toggle collumn

       : boxed_column {                        //define boxed column
       label = "Variables" ;
      
      

            : edit_box {                                //edit box
       key = "eb1" ;
       label = "Manning 'n'" ;                  
       edit_width = 6 ;                               
      
      
       }

       : edit_box {                                //edit box
       key = "eb2" ;                                  
       label = "% part full" ;
       edit_width = 6 ;               
       }

      }                                        //end boxed collumn
      

   
       }                               

    ok_cancel ;                                //predifined OK/Cancel
   
                                           //end text
    }
(defun C:samp8 ()
(setq dcl_id(load_dialog "samp8.dcl"))
(if(not(new_dialog "samp8" dcl_id)
    )
   (exit)
)
(set_tile "eb1" "0.013")
(set_tile "eb2" "50")
(setq t1(atoi(get_tile "tog1")))

(setq t2(atoi(get_tile "tog2")))

(setq t3(atoi(get_tile "tog3")))

(setq t4(atoi(get_tile "tog4")))

(setq t5(atoi(get_tile "tog5")))

(setq t6(atoi(get_tile "tog6")))

(setq t7(atoi(get_tile "tog7")))

(setq t8(atoi(get_tile "tog8")))


(start_dialog)
(unload_dialog dcl_id)
)


Grrr 发表于 2022-7-5 16:28:48

Toggle的值从“0”到“1”不等,这些是字符串整数:
“0”是未选中时的值
“1”是选中时的值
或者在LISP中,单词“0”->nil;“1”->T。
如果可以在回调中获得label属性,那就太好了,但通常可用的属性是:$key$value$data$reason$x$y。
 
但是,您仍然可以通过一些列表操作(assoc list)或两个列表来获得所需内容:一个是在用户单击“确定”时收集切换值(结果),另一个是保存所有管道直径。
或者类似的东西:
 

(defun C:test ( / *error* dcl des dch dcf togglekeys t1 t2 t3 t4 t5 t6 t7 t8 )

(defun *error* ( msg )
   (and (< 0 dch) (unload_dialog dch))
   (and (eq 'FILE (type des)) (close des))
   (and (eq 'STR (type dcl)) (findfile dcl) (vl-file-delete dcl))
   (and msg (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*") (princ (strcat "\nError: " msg)) ))
   (princ)
); defun *error*

(cond
   (
   (and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w"))
       (mapcar (function (lambda (x) (princ (strcat "\n" x) des)))
         '("samp8 : dialog "
         "{ label = \"Pipe Lines\";"
         ": row "
         "{ : boxed_column "
         "    { label = \"Pipe diameters used (mm)\";"
         "      : toggle { key = \"tog1\"; label = \"150\"; }"
         "      : toggle { key = \"tog2\"; label = \"200\"; }"
         "      : toggle { key = \"tog3\"; label = \"225\"; }"
         "      : toggle { key = \"tog4\"; label = \"250\"; }"
         "      : toggle { key = \"tog5\"; label = \"300\"; }"
         "      : toggle { key = \"tog6\"; label = \"375\"; }"
         "      : toggle { key = \"tog7\"; label = \"450\"; }"
         "      : toggle { key = \"tog8\"; label = \"600\"; }"
         "    }"
         "    : boxed_column"
         "    { label = \"Variables\";"
         "      : edit_box { key = \"eb1\"; label = \"Manning 'n'\"; edit_width = 6 ; value = \"0.013\"; }"
         "      : edit_box { key = \"eb2\"; label = \"% part full\"; edit_width = 6 ; value = \"50\"; }"
         "    }"
         "}"
         "ok_cancel;"
         "}"
         ); list
       ); mapcar
       (not (setq des (close des))) (< 0 (setq dch (load_dialog dcl))) (new_dialog "samp8" dch)
   ); and
   (setq togglekeys '("tog1" "tog2" "tog3" "tog4" "tog5" "tog6" "tog7" "tog8"))
   ; (client_data_tile "mykey" "mydata")
   ; (mapcar 'client_data_tile togglekeys '("150" "200" "225" "250" "300" "375" "450" "600")) ; this won't work in my plan here
   (client_data_tile "accept" (vl-prin1-to-string '("150" "200" "225" "250" "300" "375" "450" "600")))
   (action_tile "accept"
       (vl-prin1-to-string
         '(progn (mapcar 'set '(t1 t2 t3 t4 t5 t6 t7 t8) (read $data))
         (mapcar '(lambda (a b) (if (= a "0") (set b nil))) (mapcar 'get_tile togglekeys) '(t1 t2 t3 t4 t5 t6 t7 t8) )
         (done_dialog 1)
         ); progn
       ); vl-prin1-to-string
   ); action_tile
   (if (= 1 (setq dcf (start_dialog)))
       (alert (strcat "\nUser has chosen toggles:\n" (vl-prin1-to-string (vl-remove-if 'null (list t1 t2 t3 t4 t5 t6 t7 t8)))))
       (princ "\nUser cancelled the dialog.")
   )
   )
); cond
(*error* nil) (princ)
); defun C:test

 
还要尽量压缩代码(DCL语言易于阅读)。

BIGAL 发表于 2022-7-5 16:34:17

另一种方法是使用一个包含管道尺寸的列表框,然后选择所需的尺寸。好的是,它很容易添加其他尺寸或类型等
 
150pvc 150conc
 
检查李的网站,查看列表框dcl。

Grrr 发表于 2022-7-5 16:35:10

正如BIGAL所提到的,list\u box是执行此类任务的常用方式(我认为这是最灵活的互动程序,可以替代切换/按钮/单选按钮/弹出列表)。
无论如何,还有另一种方法,将动作分配给每个切换,如下所示:

(action_tile "tog4"
(vl-prin1-to-string
   '(cond
   ( (= "0" $value) (setq t4 nil) )
   ( (= "1" $value) (setq t4 250) )
   )
)
)
但是做这样的事情需要大量的重复,因此如果不进行列表处理,最终会得到很长的代码。

aloy 发表于 2022-7-5 16:40:17

吼叫声
 
您之前的解决方案也很好。然而,为了简单起见,我更喜欢你的第二个选择。
非常感谢Grrr。

BIGAL 发表于 2022-7-5 16:42:48

aloy尝试使用列表,看看你的想法。
 
: credit to lee-mac for original dcl list routine
(defun C:samp8 ( )
(setq lst (list "150" "200" "225" "250" "300" "375" "450" "600"))
(setq dcl_id (load_dialog "c:\\acadtemp\\samp8.dcl")) ;change directory path to known location
(if (not (new_dialog "samp8" dcl_id))
   (exit)
)
(set_tile "eb1" "0.013")
(set_tile "eb2" "50")
(start_list "list")
(foreach itm lst (add_list itm))
(end_list)
(setq rtn (set_tile "list" "0"))
(action_tile "list" "(setq rtn (atof (nth (atoi $value) lst)))")
(action_tile "eb1" "(setq mann (atof $value))")
(action_tile "eb2" "(setq perc (atof $value))")
(start_dialog)
(unload_dialog dcl_id)
(alert "use !rtn !perc !mann to see answers") ; rub this line out later
)

 

samp8 : dialog {                                //dialog name
      label = "Pipe Lines" ;      //give it a label
      : row {                                //define row
      :boxed_column {                        //define 2 x column
      label="Pipe diameters used (mm)" ; //give it a label
      spacer;
      :list_box{key="list";
      multiple_select=false;
      width=10;
      height=15;
      }                              //end list box
      }                              //end boxed column

      : boxed_column {                        //define boxed column
      label = "Variables" ;
      : edit_box {                        //edit box
      key = "eb1" ;
      label = "Manning 'n'" ;                  
      edit_width = 6 ;
      }                              //end edit box

      : edit_box {                        //edit box
      key = "eb2" ;                                  
      Label = "% part full" ;
      edit_width = 6 ;               
      }                                //end edit box
      }                                //end boxed collumn      
      }                              //end row       

      ok_cancel ;                        //predifined OK/Cancel
}

aloy 发表于 2022-7-5 16:45:33

比加尔,
代码似乎不起作用。我看不到列表框。将在阅读样本后尝试整理。
谢谢
芦荟

BIGAL 发表于 2022-7-5 16:47:16

你需要更改我硬编码到我的电脑上用于测试的目录名和samp8。dcl需要存在于您选择的目录中。
 

Grrr 发表于 2022-7-5 16:50:26

BIGAL你可以用这样的东西:

(if
(or
   (setq dcf (findfile "samp8.dcl"))
   (setq dcf (getfiled "Samp8.dcl Not Found, Please Specify the DCL file" "" "dcl" 0))
)
(setq dcl_id (load_dialog dcf))
(exit)
); if

为了避免“它不起作用”的回复。

aloy 发表于 2022-7-5 16:56:25

谢谢BIGAL,是的,它很有效。然而,我需要选择的所有多个管道都包含在rtn中。它一次给我一根管子。我将多项选择改为“true”的努力也没有奏效。
页: [1] 2
查看完整版本: DCL中的复选框