AutoLisp和对话框DCL
第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 "对话框定义档"
< @include "david.dcl"
定义档名称要包含在双引号"中,可以在档名前加上定的⽬录路径
会先在当前的⽬录中搜寻该定义⽂件,然后是定义⽂件所在的⽬录;若有指定档案的路径,则只会在指定的⽬录内寻
不可以参考ACAD.DCL所定义的对话框,即不可以使⽤@include "acad.dcl"
字符常量池是什么意思预视对话框
若在Visual LISP中开启⼀对话框定义⽂件,即可使⽤ :
⼯具 -- 接⼝⼯具 -- 预览编辑器DCL
在下拉式列⽰框中,选取该定义⽂件中所设定的对话框名称,即可预视对话框
亦可直接输⼊该对话框的名称(要注意⼤⼩写)
批注
//表⽰其右边(⾄该⾏末端)的⽂字视为注释
/* */包括在两个批注符号中间的所有⽂字(可跨越多⾏)均视为注释
语义检核
提供4个等级的检核,该些检核会在对话框载⼊时完成;可以将下列语句放在定义⽂件中的任何位置,但不能在任何对话框的定义内.
dcl_settings :default_dcl_settings {audit_level = 3;}
等级0 不检查 : 只有在该定义档巳被检核且不会再作修改时使⽤
等级1 错误 : 出可能造成AutoCAD终⽌的错误,此等级也是默认值
等级2 警告 : 出配置或⾏为模式的错误,所有定义在修改后,最少应执⾏此等级的检查⼀次
等级3 提⽰ : 出多余的属性定义
对话框的设计
美观性颜⾊配⽐,组件整齐排列等
⽅便性相同功能的项⽬要编排在⼀起,或使⽤线框包围
使⽤频繁的项⽬应设置在最显眼及⽅便的位置
适当设置快捷键及默认值(默认值,省缺值)
除⾮对话框中的项⽬过多,否则应避免使⽤巢状(嵌套)式对话⽅框互锁或互换项⽬选取(或不选取)时,会否引致其它项⽬功能的改变(enable或
<等)
对话框定义⽂件内容模式
对话框名称:dialog
{label="对话框标题" ;
:组件名称
{ 属性名称=属性值;
} //组件定义结束
} //对话框结束
定义说明
1对话框名称就是由AutoLISP程序,启动对话框时所呼叫的名称;可以⾃⾏设定,要区分⼤⼩写字母
dialog为对话框中,最外层的组件(即整个对话框),其它的组件均包含在其中
⼀般组件要以冒号:开始,并为⼩写字母;因为不是属性,所以不须使⽤分号;结束
2开⼤括号{紧随组件名称之后,以包含该组件的属性或其它组件
label为属性名称,并以等号=赋以其右边的属性值,最后以分号;结束该⾏叙述
3包含在对话框中的其它组件
组件要以冒号:开始,并为⼩写字母;因为不是属性,所以不须使⽤分号;结束
4开⼤括号{紧随组件名称之后,以包含组件的属性或其它组件
包含在组件中的属性,要以等号=赋以其右边的属性值;最后以分号;结束该⾏叙述
5以关⼤括号}与第4⾏的开⼤括号}对应,以结束该组件(第3⾏)之定义双除号//右边的⽂字即为批注
6以关⼤括号}与第2⾏的开⼤括号}对应,以结束该组件之定义(在本例中为整个对话框的定义,即第1⾏的dialog组件
注意:
上例中缩排只为⽅便观察及维护,不作缩排亦可
包含在对话框中的组件及组件中的属性可以不只⼀个
练习 (Exercises)
请输⼊以下的对话框定义,并命名为RECT.DCL(纯⽂本格式),存在C盘的根⽬录中
RECT:dialog
{label="Rectangle" ;
:text//⽂字组件
{label="Rectangle width :" ;//组件的属性
}
ok_only;
}
定义说明:
1设定对话框的名称为RECT,紧接⼀个以冒号开始的组件dialog
2最左边为dialog组件的开⼤括号,右边是其属性label,并以等号设定其属性值为"Rectangle",以分号结束此⾏叙述
3text为"字符串"组件,其作⽤是在对话框中显⽰⽂字,组件名称前要加冒号
4最左边为text组件的开⼤括号,右边是其属性label,并以等号设定其属性值为"Rectangle width",最后以分号结束此⾏叙述
5关⼤括号是对应第4⾏的开⼤括号,这对⼤括号同属于第3⾏的text组件
6ok_only为⼀"按钮组件",它的作⽤是在对话框中显⽰⼀个"确定(OK)"按钮;在⼀个对话框中,必需提供最少⼀个"确定"按钮,或⼀个"取消"按钮(组件名称为cancel_button),以作为结束对话框之⽤;本例中不设定按钮之属性,固不需以冒号放在组件名称的前⾯,但却需要以分号结束
7关⼤括号是对应第2⾏的开⼤括号,这对⼤括号同属于第1⾏的dialog组件
注意:
虽然定义档巳经完作,但仍要待学习完第2篇的课程后,才能开启及显⽰该对话框
AutoLISP函数
(LOAD_DIALOG "对话框定义档名称")
< (LOAD_DIALOG "C:/RECT.DCL")
⾃变量是要加载的对话框定义⽂件名称字符串(所以要在前后加双引号);若不设定扩展名则预设为.DCL
函数会依资源搜寻路径寻该定义⽂件;不在搜寻路径中的档案,要在⽂件名前加上指定的路径
函数若成功加载该定义档,会传回⼀正整数值的档案处理码,供其它函数呼叫使⽤;⽆法加载时则传回负整数值
⼀般会将传回的档案处理码以SETQ函数存⼊变量中
< (SETQ DCL_ID (LOAD_DIALOG "C:/RECT.DCL"))
(NEW_DIALOG "对话框名称" 档案处理码 ["预设动作" [对话框位置]])
< (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 "档案处理码")
< (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属性⼀拼使⽤,以固定编辑框显⽰时的阔度(其属性值可设定为true或false)
is_enable可设定编辑框是否可以使⽤(其属性值可设定为true或false,默认值为true)
alignment如果组件成⽔平⽅向排列,属性值可设定为left,right或centered
如果组件成垂直⽅向排列,属性值可设定为top,bottom或centered
(⽔平⽅向的默认值为left,垂直⽅向则为centered)
其它属性
action allow_accept fixed_height height
is_tab_stop mnemonic width
第4节
练习(Exercises)
将上⼀课的RECT.DCL对话框定义档复制⾄RECT1.DCL,开启新的定义档并作如下的修改,使其可以输⼊四边形的阔度及⾼度;将AutoLISP程序⽂件RECT.LSP复制⾄RECT1.LSP,开启新
的程序⽂件,并将要加载的对话框定义档改为RECT1(程序第1⾏);完成后即可加载及执⾏新的程序⽂件
RECT:dialog

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。