乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 95|回复: 19

[编程交流] DCL中的复选框

[复制链接]

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:24:53 | 显示全部楼层 |阅读模式
大家好,
 
我一直在尝试在dcl中实现复选框。我从切换中选择的返回值是否相同(0值)。我在下面给出了代码和使用的对话框。
 
如果您能帮我解决这个问题,我们将不胜感激。
 
芦荟
  1. samp8 : dialog {                                //dialog name
  2.      label = "Pipe Lines" ;      //give it a label
  3.       : row {                                        //define row
  4.       :boxed_column {                        //define radio column
  5.       label = "Pipe diameters used (mm)" ; //give it a label
  6.        : toggle {                        //define toggle
  7.               key = "tog1" ;                                //give it a name
  8.               label = "150" ;                        //give it a label
  9.                                                
  10.               }                                       
  11.             : toggle {                        //define toggle
  12.               key = "tog2" ;                                //give it a name
  13.               label = "200" ;                //give it a label
  14.             }                               
  15.             : toggle {                        //define toggle
  16.               key = "tog3" ;                                //give it a name
  17.               label = "225" ;                        //give it a label
  18.               }                                       
  19.             : toggle {                        //define toggle
  20.               key = "tog4" ;                                //give it a name
  21.               label = "250" ;                        //give it a label
  22.             }                                       
  23.             : toggle {                        //define toggle
  24.               key = "tog5" ;                                //give it a name
  25.               label = "300" ;                       //give it a label
  26.               }                                       
  27.             : toggle {                        //define toggle
  28.               key = "tog6" ;                                //give it a name
  29.               label = "375" ;                        //give it a label
  30.             }
  31.             : toggle {                        //define toggle
  32.               key = "tog7" ;                                //give it a name
  33.               label = "450" ;                        //give it a label
  34.             }
  35.             : toggle {                        //define toggle
  36.               key = "tog8" ;                                //give it a name
  37.               label = "600" ;                       //give it a label
  38.             }
  39.        }                                        //end toggle collumn
  40.        : boxed_column {                        //define boxed column
  41.        label = "Variables" ;
  42.       
  43.       
  44.             : edit_box {                                //edit box
  45.        key = "eb1" ;
  46.        label = "Manning 'n'" ;                  
  47.        edit_width = 6 ;                               
  48.       
  49.       
  50.        }
  51.        : edit_box {                                //edit box
  52.        key = "eb2" ;                                  
  53.        label = "% part full" ;
  54.        edit_width = 6 ;               
  55.        }
  56.       }                                        //end boxed collumn
  57.       
  58.      
  59.        }                               
  60.     ok_cancel ;                                //predifined OK/Cancel
  61.    
  62.                                            //end text
  63.     }
  64. (defun C:samp8 ()
  65. (setq dcl_id(load_dialog "samp8.dcl"))
  66. (if(not(new_dialog "samp8" dcl_id)
  67.     )
  68.    (exit)
  69. )
  70. (set_tile "eb1" "0.013")
  71.   (set_tile "eb2" "50")
  72. (setq t1(atoi(get_tile "tog1")))
  73. (setq t2(atoi(get_tile "tog2")))
  74. (setq t3(atoi(get_tile "tog3")))
  75. (setq t4(atoi(get_tile "tog4")))
  76. (setq t5(atoi(get_tile "tog5")))
  77. (setq t6(atoi(get_tile "tog6")))
  78. (setq t7(atoi(get_tile "tog7")))
  79. (setq t8(atoi(get_tile "tog8")))
  80. (start_dialog)
  81. (unload_dialog dcl_id)
  82. )

172458fqxknikxjlrxmzjz.png
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 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)或两个列表来获得所需内容:一个是在用户单击“确定”时收集切换值(结果),另一个是保存所有管道直径。
或者类似的东西:
 
  1. (defun C:test ( / *error* dcl des dch dcf togglekeys t1 t2 t3 t4 t5 t6 t7 t8 )
  2. (defun *error* ( msg )
  3.    (and (< 0 dch) (unload_dialog dch))
  4.    (and (eq 'FILE (type des)) (close des))
  5.    (and (eq 'STR (type dcl)) (findfile dcl) (vl-file-delete dcl))
  6.    (and msg (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*") (princ (strcat "\nError: " msg)) ))
  7.    (princ)
  8. ); defun *error*
  9. (cond
  10.    (
  11.      (and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w"))
  12.        (mapcar (function (lambda (x) (princ (strcat "\n" x) des)))
  13.          '("samp8 : dialog "
  14.            "{ label = "Pipe Lines";"
  15.            "  : row "
  16.            "  { : boxed_column "
  17.            "    { label = "Pipe diameters used (mm)";  "
  18.            "      : toggle { key = "tog1"; label = "150"; }"
  19.            "      : toggle { key = "tog2"; label = "200"; }"
  20.            "      : toggle { key = "tog3"; label = "225"; }"
  21.            "      : toggle { key = "tog4"; label = "250"; }"
  22.            "      : toggle { key = "tog5"; label = "300"; }"
  23.            "      : toggle { key = "tog6"; label = "375"; }"
  24.            "      : toggle { key = "tog7"; label = "450"; }"
  25.            "      : toggle { key = "tog8"; label = "600"; }"
  26.            "    }"
  27.            "    : boxed_column"
  28.            "    { label = "Variables";"
  29.            "      : edit_box { key = "eb1"; label = "Manning 'n'"; edit_width = 6 ; value = "0.013"; }"
  30.            "      : edit_box { key = "eb2"; label = "% part full"; edit_width = 6 ; value = "50"; }"
  31.            "    }"
  32.            "  }"
  33.            "  ok_cancel;"
  34.            "}"
  35.          ); list
  36.        ); mapcar
  37.        (not (setq des (close des))) (< 0 (setq dch (load_dialog dcl))) (new_dialog "samp8" dch)
  38.      ); and
  39.      (setq togglekeys '("tog1" "tog2" "tog3" "tog4" "tog5" "tog6" "tog7" "tog8"))
  40.      ; (client_data_tile "mykey" "mydata")
  41.      ; (mapcar 'client_data_tile togglekeys '("150" "200" "225" "250" "300" "375" "450" "600")) ; this won't work in my plan here
  42.      (client_data_tile "accept" (vl-prin1-to-string '("150" "200" "225" "250" "300" "375" "450" "600")))
  43.      (action_tile "accept"
  44.        (vl-prin1-to-string
  45.          '(progn (mapcar 'set '(t1 t2 t3 t4 t5 t6 t7 t8) (read $data))
  46.            (mapcar '(lambda (a b) (if (= a "0") (set b nil))) (mapcar 'get_tile togglekeys) '(t1 t2 t3 t4 t5 t6 t7 t8) )
  47.            (done_dialog 1)
  48.          ); progn
  49.        ); vl-prin1-to-string
  50.      ); action_tile
  51.      (if (= 1 (setq dcf (start_dialog)))
  52.        (alert (strcat "\nUser has chosen toggles:\n" (vl-prin1-to-string (vl-remove-if 'null (list t1 t2 t3 t4 t5 t6 t7 t8)))))
  53.        (princ "\nUser cancelled the dialog.")
  54.      )
  55.    )
  56. ); cond
  57. (*error* nil) (princ)
  58. ); defun C:test

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

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:34:17 | 显示全部楼层
另一种方法是使用一个包含管道尺寸的列表框,然后选择所需的尺寸。好的是,它很容易添加其他尺寸或类型等
 
150pvc 150conc
 
检查李的网站,查看列表框dcl。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:35:10 | 显示全部楼层
正如BIGAL所提到的,list\u box是执行此类任务的常用方式(我认为这是最灵活的互动程序,可以替代切换/按钮/单选按钮/弹出列表)。
无论如何,还有另一种方法,将动作分配给每个切换,如下所示:
  1. (action_tile "tog4"
  2. (vl-prin1-to-string
  3.    '(cond
  4.      ( (= "0" $value) (setq t4 nil) )
  5.      ( (= "1" $value) (setq t4 250) )
  6.    )
  7. )
  8. )

但是做这样的事情需要大量的重复,因此如果不进行列表处理,最终会得到很长的代码。
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:40:17 | 显示全部楼层
吼叫声
 
您之前的解决方案也很好。然而,为了简单起见,我更喜欢你的第二个选择。
非常感谢Grrr。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:42:48 | 显示全部楼层
aloy尝试使用列表,看看你的想法。
 
  1. : credit to lee-mac for original dcl list routine
  2. (defun C:samp8 ( )
  3. (setq lst (list "150" "200" "225" "250" "300" "375" "450" "600"))
  4. (setq dcl_id (load_dialog "c:\\acadtemp\\samp8.dcl")) ;  change directory path to known location
  5. (if (not (new_dialog "samp8" dcl_id))
  6.    (exit)
  7. )
  8. (set_tile "eb1" "0.013")
  9. (set_tile "eb2" "50")
  10. (start_list "list")
  11. (foreach itm lst (add_list itm))
  12. (end_list)
  13. (setq rtn (set_tile "list" "0"))
  14. (action_tile "list" "(setq rtn (atof (nth (atoi $value) lst)))")
  15. (action_tile "eb1" "(setq mann (atof $value))")
  16. (action_tile "eb2" "(setq perc (atof $value))")
  17. (start_dialog)
  18. (unload_dialog dcl_id)
  19. (alert "use !rtn !perc !mann to see answers") ; rub this line out later
  20. )

 
  1. samp8 : dialog {                                //dialog name
  2.       label = "Pipe Lines" ;      //give it a label
  3.       : row {                                //define row
  4.       :boxed_column {                        //define 2 x column
  5.       label="Pipe diameters used (mm)" ; //give it a label
  6.       spacer;
  7.       :list_box{key="list";
  8.       multiple_select=false;
  9.       width=10;
  10.       height=15;
  11.       }                              //end list box
  12.       }                              //end boxed column
  13.       : boxed_column {                        //define boxed column
  14.       label = "Variables" ;
  15.       : edit_box {                        //edit box
  16.       key = "eb1" ;
  17.       label = "Manning 'n'" ;                  
  18.       edit_width = 6 ;
  19.       }                                //end edit box
  20.       : edit_box {                        //edit box
  21.       key = "eb2" ;                                  
  22.       Label = "% part full" ;
  23.       edit_width = 6 ;               
  24.       }                                //end edit box
  25.       }                                //end boxed collumn      
  26.       }                                //end row       
  27.       ok_cancel ;                        //predifined OK/Cancel
  28. }
回复

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:45:33 | 显示全部楼层
比加尔,
代码似乎不起作用。我看不到列表框。将在阅读样本后尝试整理。
谢谢
芦荟
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 16:47:16 | 显示全部楼层
你需要更改我硬编码到我的电脑上用于测试的目录名和samp8。dcl需要存在于您选择的目录中。
 
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:50:26 | 显示全部楼层
BIGAL你可以用这样的东西:
  1. (if
  2. (or
  3.    (setq dcf (findfile "samp8.dcl"))
  4.    (setq dcf (getfiled "Samp8.dcl Not Found, Please Specify the DCL file" "" "dcl" 0))
  5. )
  6. (setq dcl_id (load_dialog dcf))
  7. (exit)
  8. ); if

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

使用道具 举报

53

主题

302

帖子

249

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
265
发表于 2022-7-5 16:56:25 | 显示全部楼层
谢谢BIGAL,是的,它很有效。然而,我需要选择的所有多个管道都包含在rtn中。它一次给我一根管子。我将多项选择改为“true”的努力也没有奏效。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 21:07 , Processed in 0.608184 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表