AutoCAD DCL对话框编程教程:为LISP工具创建图形界面
-
<p><strong>核心结论:DCL(Dialog Control Language)是AutoCAD的原生对话框语言,配合AutoLISP可以创建专业人机交互界面。通过DCL让你的LISP工具从命令行进化到可视化操作。</strong></p>
<h3>什么是DCL对话框?</h3>
<p>DCL是Autodesk为AutoCAD开发的对话框定义语言,使用纯文本文件(.dcl)描述对话框布局,由LISP程序加载和驱动交互。</p>
<h4>DCL的特点</h4>
<ul>
<li><strong>零依赖</strong>:不需任何第三方库,AutoCAD原生支持</li>
<li><strong>风格统一</strong>:对话框与AutoCAD自身完全一致</li>
<li><strong>极其轻量</strong>:一个输入对话框只需10-20行代码</li>
</ul><h3>第一个DCL对话框</h3>
<h4>DCL文件(hello.dcl)</h4>
<pre><code>
hello : dialog {
label = "LISP工具集";
: text {
label = "欢迎使用模具设计LISP工具集";
}
: button {
label = "确定";
key = "accept";
is_default = true;
}
}
</code></pre><h4>对应的LISP程序</h4>
<pre><code>
(defun c:HELLO ( / dcl_id )
(setq dcl_id (load_dialog "hello.dcl"))
(if (not (new_dialog "hello" dcl_id)) (exit))
(action_tile "accept" "(done_dialog 1)")
(start_dialog)
(unload_dialog dcl_id)
(princ)
)
</code></pre><h3>DCL控件类型大全</h3>
<h4>输入类控件</h4>
<table>
<tr><td>控件</td><td>用途</td><td>关键属性</td></tr>
<tr><td>edit_box</td><td>文本输入框</td><td>label, key, value, width</td></tr>
<tr><td>popup_list</td><td>下拉选择</td><td>label, key, list, value</td></tr>
<tr><td>list_box</td><td>多行选择</td><td>label, key, list, multiple_select</td></tr>
<tr><td>radio_button</td><td>单选按钮</td><td>label, key, value</td></tr>
<tr><td>check_box</td><td>复选框</td><td>label, key, value</td></tr>
<tr><td>slider</td><td>滑块调节</td><td>key, min_value, max_value</td></tr>
</table><h4>布局容器</h4>
<table>
<tr><td>容器</td><td>用途</td><td>说明</td></tr>
<tr><td>row</td><td>水平排列</td><td>一行内排列多个控件</td></tr>
<tr><td>column</td><td>垂直排列</td><td>一列内排列多个控件</td></tr>
<tr><td>boxed_row</td><td>带框水平组</td><td>带边框的组</td></tr>
<tr><td>boxed_column</td><td>带框垂直组</td><td>带边框的组</td></tr>
<tr><td>spacer</td><td>空白间距</td><td>调整布局间隔</td></tr>
</table><h3>实战案例:模具材料快速选择对话框</h3>
<h4>DCL文件</h4>
<pre><code>
steel_pick : dialog {
label = "模具材料快速选择";
: boxed_column {
label = "模具类型";
: popup_list {
key = "mold_type";
list = "注塑模具\n压铸模具\n冲压模具";
value = 0;
width = 30;
}
}
: boxed_column {
label = "推荐材料";
: list_box {
key = "steel_list";
list = "P20(预硬钢)\n718H(高抛光)\nNAK80(镜面钢)\nS136H(不锈钢)\nH13(热作钢)\nCr12MoV(冷作钢)\nDC53(高速钢)";
value = 0;
width = 30;
}
}
: boxed_column {
label = "参数设置";
: edit_box {
label = "硬度要求:";
key = "hardness";
value = "HRC 48-52";
}
}
spacer;
ok_cancel;
}
</code></pre><h4>LISP驱动代码</h4>
<pre><code>
(defun c:STEELPICK ( / dcl_id )
(setq dcl_id (load_dialog "steel_pick.dcl"))
(if (not (new_dialog "steel_pick" dcl_id)) (exit));; 模具类型切换时更新钢材列表
(action_tile "mold_type" "(update_steel $value)")(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")(if (= (start_dialog) 1)
(progn
(setq steel (get_tile "steel_list"))
(setq hardness (get_tile "hardness"))
(princ (strcat "\n推荐钢材: " steel " 硬度: " hardness))
)
)
(unload_dialog dcl_id)
(princ)
)(defun update_steel (type)
(start_list "steel_list")
(cond
((= type "0") (add_list "P20")(add_list "718H")(add_list "NAK80"))
((= type "1") (add_list "H13")(add_list "8407")(add_list "DAC"))
((= type "2") (add_list "Cr12MoV")(add_list "DC53")(add_list "SKD11"))
)
(end_list)
)
</code></pre><h3>DCL进阶技巧</h3>
<h4>滑块与数值联动</h4>
<pre><code>
(action_tile "slider_hardness"
"(set_tile "txt_hardness" (strcat "HRC " $value))")
</code></pre><h4>临时生成DCL文件</h4>
<pre><code>
;; 在LISP中动态写DCL文件,避免依赖外部文件
(setq fname (vl-filename-mktemp "temp.dcl"))
(setq file (open fname "w"))
(write-line "temp_dlg : dialog {" file)
(write-line " label = "动态对话框";" file)
(write-line " : edit_box { key = "input"; label = "输入:"; }" file)
(write-line " spacer; ok_cancel;" file)
(write-line "}" file)
(close file)
</code></pre><h3>完整工具:图框自动填写</h3>
<pre><code>
(defun c:FILLTITLE ( / dcl_id fname file)
;; 生成临时DCL
(setq fname (vl-filename-mktemp "fill.dcl"))
(setq file (open fname "w"))
(write-line "filltitle : dialog {" file)
(write-line " label = "图框填写工具 v1.0\
这个参数你们一般设多少?评论区说说。
</code></pre>