Steven P 发表于 2022-7-5 16:11:27

DCL对话框代码查询

下午好
 
 
是否可以在DCL对话框代码中进行循环?
 
 
例如,假设我想在我的拨号框上有10个单选按钮,我可以在代码中做一个循环来编写它们,并给每个按钮一个唯一的名称(RB1、RB2等)。
 
 
沿着以下路线:
-重复10次
-单选按钮{key“RB”+x}
-x=x+1
-结束重复
 
 
 
 
只是寻找一个是或不是真的,但如果是的话,有人给我指出正确的方向会很好(沿着“看看这个例子,或者#“试试这些命令”)
 
 
 
 
提前感谢

rkmcswain 发表于 2022-7-5 16:18:46

当然这是可能的。在加载对话框之前,使用lisp代码编写DCL代码。

Tharwat 发表于 2022-7-5 16:20:11

如果使用DCL文件格式,则为否;如果将DCL代码写入临时文件,则为是。

rlx 发表于 2022-7-5 16:22:52

嗨,史蒂文,
 
在这里,您可以找到一个示例:http://www.cadtutor.net/forum/showthread.php?100403-Rlx Tokkie amp SmartList只是一些DCL午餐的乐趣
 
正如Tharwat所写,当您动态创建对话框时,将使用此选项
 


(defun DynaToggle_write_header ()
(write-line
   (strcat
   "DynaToggle:dialog{label=\"DynaToggle\";spacer;spacer;:text_part {key=\"txt1\";width=32;fixed_width=true;}"
   ":text_part{key=\"txt2\";width=32;fixed_width=true;}spacer;") fp))


(defun DynaToggle_write_body1 ( %lst / i )
(write-line ":boxed_column{" fp)
(setq i 0)
(mapcar '(lambda (x)
      (write-line
          (strcat
      ":row{spacer;:toggle{key=\"tg" (itoa i) "\";width=2;fixed_width=true;}"
      ":text_part{key=\"tp" (itoa i) "\";label=\"" x "\";width=32;fixed_width=true;}}") fp)
      (setq i (1+ i)))
   %lst
)
(repeat (- 10 i)(write-line ":row{height=1.5;}" fp))
(write-line "}spacer;" fp)
)

(defun DynaToggle_write_body2 ( %lst / i )
(write-line ":boxed_row {:column{" fp)
(setq i 0)
(repeat 10
   (write-line
   (strcat
   ":row { spacer; :toggle { key =\"tg" (itoa i) "\";width=2;fixed_width=true;}"
   ":text_part{key=\"tp" (itoa i) "\";label=\"" (nth i %lst) "\";width=32;fixed_width=true;}}") fp)
   (setq i (1+ i))
)
(write-line
   (strcat "}:column{:slider{key=\"sldr\";layout=vertical;min_value=0;max_value=" (itoa nof-tog)
       ";small_increment=1;big_increment=10;value=" (itoa nof-tog) ";}}}spacer;") fp)
)

(defun DynaToggle_write_footer1 ()
(write-line
   (strcat
   "spacer;"
   ": row {: button{label=\"Select All\";key=\"all\";}:button{label=\"Select None\";key=\"none\";}}"
   "spacer;ok_cancel;}") fp))

(defun DynaToggle_write_footer2 ()
(write-line
   (strcat
   "spacer;"
   ":row{:button{label=\"|<\";key=\"home\";}:button{label=\"<\";key=\"back\";}"
   ":button{label=\">\";key=\"next\";}:button{label=\">|\";key=\"end\";}}"
   ":row{:button{label=\"Select All\";key=\"all\";}:button{label=\"Select None\";key=\"none\";}}"
   "spacer;ok_cancel;}") fp))

gr.Rlx

BIGAL 发表于 2022-7-5 16:29:04

我有另一个Alan Thompson的例子,你可以写一个列表,有多个标题,输入框大小等等,只要写一个列表,调用一个defun,使dcl,就会试图找到。

Grrr 发表于 2022-7-5 16:33:41

从列表生成DCL图块并不难(创建这样的子功能),
但是,如果您必须编写一个不断操纵对话框的自定义程序,则必须处理整个代码,而不要依赖生成这些代码的子函数。。实例
 
在学习和练习DCL之后,请记住这样的线程,我已经编写了几个生成切换/单选按钮/按钮/图像按钮的子函数-但是当您使用包含20多个项目的列表调用子函数时,对话框变得又丑又大。
 
因此,如果可能的话,解决方案是坚持使用list_box,或者练习rlx在他的tokkie(智能列表午餐乐趣)中使用的技术。
我花了几天时间剖析他的代码,并做了一些修改,但留下了未完成的工作:
该死,我的爱好越来越可怕了!

rlx 发表于 2022-7-5 16:36:00

你越来越擅长这个Grrr!
 
 
p、 很抱歉,这么长时间才解码,我的错误,应该写得更好。下次会做得更好。
 
 
这里有一个我忘记放在我的smartlist例程中,但在我的RlxBlk(主对话框中的设置按钮)中使用了它
 
 



; lst list of strings , def default (int) to set
(defun RlxBLK_ChooseFromColumn (lst def / fn fp dcl-id inp drv)
(if (and (setq fn (vl-filename-mktemp ".dcl")) (setq fp (openfn "w")))
   (progn
   (write-line "cfrc : dialog { label = \"Choose From Column\"; : boxed_radio_column {" fp)
   (mapcar '(lambda (x) (write-line (strcat " : radio_button { key = \"" x "\"; label = \"" x "\";}") fp)) lst)
   (write-line "} spacer;ok_cancel;}" fp)(close fp)(gc)
   (if (and (setq dcl-id (load_dialog fn)) (new_dialog "cfrc" dcl-id))
(progn
(mapcar '(lambda (x)(action_tile x "(setq inp $key)")) lst)
(if (not (null (nth def lst)))(set_tile (nth def lst) "1"))
(action_tile "accept" "(done_dialog 1)")
(setq drv (start_dialog))(unload_dialog dcl-id)))))
(cond ((not (null inp)) inp) ((not (null (nth def lst))) (nth def lst)) (t nil))
)
; * * testing * *
(defun c:cfc () (RlxBLK_ChooseFromColumn '("1 2" "a b" "3 4" "c d" "5 6" "e f" "7 8" "g h" "9 10" "i j") 5 ))



该例程使用单选按钮而不是tokkies(切换),并且(显然)仅在按钮数量有限的情况下工作
 
 
gr.Rlx

Steven P 发表于 2022-7-5 16:38:36

谢谢你。
 
 
我不得不道歉,我今天还没有机会看看这一切是如何运作的,但希望明天

Tharwat 发表于 2022-7-5 16:43:06

嘿,Rlx,卸载或加载对话框失败后,您需要删除临时文件,否则您的临时文件夹将充满*。dcl文件。

rlx 发表于 2022-7-5 16:46:03

 
哎呀,你说得很对。刚刚从我的一个应用程序中复制了代码,但现在你提到了它,我想知道我是否在那个应用程序中删除了它。但是autocad不会自动删除临时文件吗?
 
https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2015/ENU/AutoCAD-AutoLISP/files/GUID-F417A5EF-95BB-47EE-B60E-7C017635580D-htm.html
 
 
尽管如此,我还是会在事后努力清理,所以谢谢你的叫醒电话https://www.cadtutor.net/forum/images/editor/smilie.png
 
gr.Rlx
页: [1] 2
查看完整版本: DCL对话框代码查询