
AutoLisp和对话框DCL.docx
11页第 1节 基本知识对话框是现今最流行的人机互动面接口;在早期的 AutoCAD版本中巳经使用,但只有在 R12版本开始,才提供给用户自行编程的对话框开发功能.对话框的描述定义在一纯文本档(扩展名为 DCL)内,无须特别的开发环境 定义文件中的对话框描述,均以对话控制语言(Dialog Control Language,简称 DCL语言)所建立 在 AutoLISP程序中,配合可编程对话框(Porgrammable Dialog Box,简称 PDB)函数,激活及操控对话框 可以在一个定义档(扩展名 DCL)中定义多个对话框 对话框由方块本身,及包含于其内的组件(或称为控件,构件)所组成 每个组件的属性定义均包含在一对大括号{ }中 在定义文件中,各组件及其属性均为小写;只有在赋值给属性,或设定对话框名称时才可使用大写字母 属性以等号=赋值,并以分号;结束(注意 : 在 AutoLISP程序中,分号是作为批注) 一般要在组件名称前加上一个冒号:,但若组件并不设定属性,则不需要在组件名称前加冒号,但却要以分号结束 空行会被忽 若定义档发生严重的错误,会在当前的目录下,产生 ACAD.DCE文件,以指明所发生的错误.第 2节 定义档BASE.DCL 默认在 SUPPORT的目录中,它包含了各组件的原型定义,及各类型巳定义的其它基本组件;而所有自行开发的对话框定义文件,都可以使用在 BASE.DCL定义文件中的各个组件 ACAD.DCL 默认在 SUPPORT的目录中,它包含了 AutoCAD中所有标准对话框的定义参考定义档可在自行开发的对话框定义文件中,经由 include指令,取得指定 DCL文件中所定义的组件;其语法如下:@include "对话框定义档"e.g. @include "david.dcl"定义档名称要包含在双引号"中,可以在档名前加上定的目录路径 会先在当前的目录中搜寻该定义文件,然后是定义文件所在的目录;若有指定档案的路径,则只会在指定的目录内寻找 不可以参考 ACAD.DCL所定义的对话框,即不可以使用@include "acad.dcl"预视对话框若在 Visual LISP中开启一对话框定义文件,即可使用 :工具 -- 接口工具 -- 预览编辑器 DCL在下拉式列示框中,选取该定义文件中所设定的对话框名称,即可预视对话框 亦可直接输入该对话框的名称(要注意大小写)第 3节 批注// 表示其右边(至该行末端)的文字视为注释 /* */ 包括在两个批注符号中间的所有文字(可跨越多行)均视为注释语义检核提供 4个等级的检核,该些检核会在对话框载入时完成;可以将下列语句放在定义文件中的任何位置,但不能在任何对话框的定义内.dcl_settings : default_dcl_settings {audit_level = 3;}等级 0 不检查 : 只有在该定义档巳被检核且不会再作修改时使用 等级 1 错误 : 找出可能造成 AutoCAD终止的错误,此等级也是默认值 等级 2 警告 : 找出配置或行为模式的错误,所有定义在修改后,最少应执行此等级的检查一次 等级 3 提示 : 找出多余的属性定义对话框的设计美观性 颜色配比,组件整齐排列等 方便性 相同功能的项目要编排在一起,或使用线框包围使用频繁的项目应设置在最显眼及方便的位置适当设置快捷键及默认值(默认值,省缺值)除非对话框中的项目过多,否则应避免使用巢状(嵌套)式对话方框互锁或互换 项目选取(或不选取)时,会否引致其它项目功能的改变(enable 或disable...等)第 4节 对话框定义文件内容模式对话框名称:dialog{ label="对话框标题" ; :组件名称{ 属性名称=属性值; } //组件定义结束 } //对话框结束定义说明 1 对话框名称就是由 AutoLISP程序,启动对话框时所呼叫的名称;可以自行设定,要区分大小写字母dialog为对话框中,最外层的组件(即整个对话框),其它的组件均包含在其中一般组件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;结束 2 开大括号{紧随组件名称之后,以包含该组件的属性或其它组件label为属性名称,并以等号=赋以其右边的属性值,最后以分号;结束该行叙述 3 包含在对话框中的其它组件组件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;结束 4 开大括号{紧随组件名称之后,以包含组件的属性或其它组件包含在组件中的属性,要以等号=赋以其右边的属性值;最后以分号;结束该行叙述 5 以关大括号}与第 4行的开大括号}对应,以结束该组件(第 3行)之定义双除号//右边的文字即为批注 6 以关大括号}与第 2行的开大括号}对应,以结束该组件之定义(在本例中为整个对话框的定义,即第 1行的 dialog组件注意:上例中缩排只为方便观察及维护,不作缩排亦可 包含在对话框中的组件及组件中的属性可以不只一个第 5节 练习 (Exercises)请输入以下的对话框定义,并命名为 RECT.DCL(纯文本格式),存在 C盘的根目录中RECT:dialog { label="Rectangle" ; :text //文字组件 { label="Rectangle width :" ; //组件的属性 } ok_only; }定义说明: 1 设定对话框的名称为 RECT,紧接一个以冒号开始的组件 dialog2 最左边为 dialog组件的开大括号,右边是其属性 label,并以等号设定其属性值为"Rectangle",以分号结束此行叙述 3 text为"字符串"组件,其作用是在对话框中显示文字,组件名称前要加冒号 4 最左边为 text组件的开大括号,右边是其属性 label,并以等号设定其属性值为"Rectangle width",最后以分号结束此行叙述 5 关大括号是对应第 4行的开大括号,这对大括号同属于第 3行的 text组件 6 ok_only为一"按钮组件",它的作用是在对话框中显示一个"确定(OK)"按钮;在一个对话框中,必需提供最少一个"确定"按钮,或一个"取消"按钮(组件名称为 cancel_button),以作为结束对话框之用;本例中不设定按钮之属性,固不需以冒号放在组件名称的前面,但却需要以分号结束 7 关大括号是对应第 2行的开大括号,这对大括号同属于第 1行的 dialog组件注意:虽然定义档巳经完作,但仍要待学习完第 2篇的课程后,才能开启及显示该对话框第 1节 AutoLISP函数加载 DCL定义文件函数(LOAD_DIALOG "对话框定义档名称")e.g. (LOAD_DIALOG "C:/RECT.DCL")自变量是要加载的对话框定义文件名称字符串(所以要在前后加双引号);若不设定扩展名则预设为.DCL 函数会依资源搜寻路径找寻该定义文件;不在搜寻路径中的档案,要在文件名前加上指定的路径 函数若成功加载该定义档,会传回一正整数值的档案处理码,供其它函数呼叫使用;无法加载时则传回负整数值 一般会将传回的档案处理码以 SETQ函数存入变量中e.g. (SETQ DCL_ID (LOAD_DIALOG "C:/RECT.DCL"))开启并显示对话框(NEW_DIALOG "对话框名称" 档案处理码 ["预设动作" [对话框位置]]) e.g. (NEW_DIALOG "RECT" DCL_ID)对话框名称为字符串,要在前后加双引号;要注意一个定义档中,可包含多个对话框名称及其定义 档案处理码是经由 LOAD_DIALOG函数取得 默认动作为字符串表示式;函数可以不加默认动作,或以空字符串""表示 如果要设定对话框显示时的位置,则必须同时设定预设动作 对话框位置为 2D的点串行,指定对话框左上角的 X,Y坐标 如果以 '(-1 -1)为对话框位置,则会在绘图屏幕的中心点开启对话框 如果成功开启对话框,函数会传回 T,否则传回 NIL开始接受使用者输入 (START_DIALOG)函数不须提供任何自变量 使前一个用 NEW_DIALOG函数开启的对话框开始作用,直至操作表示式或回复函数呼叫DONE_DIALOG函数为止 一般 DONE_DIALOG与关键词 accept(一般是按下确定按钮)或关键词 cancel(一般是按下取消按钮)相关 若传回值为 1,表示使用者按下确定钮结束对话框;0 表示按下取消钮;-1 表示全部对话框都以 TERM_DIALOG函数终止;大于 1的整数,其意义由应用程序决定释放(卸除)对话框(UNLOAD_DIALOG "档案处理码")e.g. (UNLOAD_DIALOG DCL_ID)从内存释放档案处理码(经由 LOAD_DIALOG函数取得)指定的对话框定义档 函数传回值一定是 NIL第 2节 对话框开启方式(DEFUN C:函数名称( ) (SETQ 变量 (LOAD_DIALOG "对话框定义档")) (NEW_DIALOG "对话框名称" 变量) (START_DIALOG) (UNLOAD_DIALOG 变数) )程序说明: 1 以 DEFUN函数定义程序的名称,使用 LOAD_DIALOG函数加载指定的对话框定义档使用 SETQ函数,将 LOAD_DIALOG传回的档案处理码存入变量中,以方便其它函数使用 2 使用 NEW_DIALOG,开启及显示定义文件中(档案处理码),指定的对话框 3 使用 START_DIALOG函数,使对话框开始作用并接受使用者输入使用 UNLOAD_DIALOG函数以结束对话框 4 关括号是对应第 1行 DEFUN函数左边的开括号,结束整个程序练习 (Exercises)编写一 AutoLISP程序,以开启上一课所定义的对话框;并将该程序命名为RECT.LSP,存在 C盘的根目录中,程序代码如下 :(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT.DCL")) (NEW_DIALOG "RECT" DCL_ID) (START_DIALOG) (UNLOAD_DIALOG DCL_ID) )程序说明: 1 以 DEFUN函数定义程序的名称为 RECT,使用 LOAD_DIALOG函数将对话框定义文件RECT.DCL载入;使用 SETQ函数,将 LOAD_DIALOG传回的档案处理码存入变量 DCL_ID中,以方便其它函数使用 2 使用 NEW_DIALOG,开启及显示定义文件中(档案处理码)名称为 RECT的对话框 3 使用 START_DIALOG函数,使对话框开始作用并接受使用者输入(在本例中只有确定钮可按);使用 UNLOAD_DIALOG函数以结束对话框 4 关括号是对应第 1行 DEFUN函数左边的开括号,结束整个程序第 3节 编辑框组件(edit_box)可供用户直接输入字符串的矩形方框;注意在编辑框中所显示及输入的数据均为字符串型态,而数字则要在取得编辑框的字符串内容后(在下一篇中介绍),使用 AutoLISP函数将其转为数值型态的数据:edit_box //组件名称 { 属性="属性值" ; }属性 label 显示在编辑框前面(左边)的提示文字 key 其属性值即为使用该组件的关键词,使在 AutoLISP程序中操控此组件;在同一个对话框定义中,不能有相同名称的关键词定义 edit_limit 指定在编辑框中,可输入字符串的最大字符长度 edit_width 指定编辑框显示时的阔度(通常与 fixed_width属性一拼使用) value 指定编辑框显示时,当中的默认值(注意显示数值数据时,要先用 AutoLISP函数将数据(或变量)转为字符串型态) fixed_width 通常与 width属性一拼使用,以固定编辑框显示时的阔。
