lisp 对话框.docx
- 文档编号:24192485
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:71
- 大小:95.36KB
lisp 对话框.docx
《lisp 对话框.docx》由会员分享,可在线阅读,更多相关《lisp 对话框.docx(71页珍藏版)》请在冰豆网上搜索。
lisp对话框
对话框编程
第一篇基本知识
第1节基本知识
对话框是现今最流行的人机互动面接口;在早期的AutoCAD版本中巳经使用,但只有在R12版本开始,才提供给使用者自行编程的对话框开发功能。
对话框的描述定义在一纯文字文件(扩展名为DCL)内,无须特别的开发环境;定义文件中的对话框描述,均以对话控制语言(DialogControlLanguage,简称DCL语言)所建立;在AutoLISP程序中,配合可编程对话框(PorgrammableDialogBox,简称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"。
预视对话框若在VisualLISP中开启一对话框定义文件,即可使用:
工具--接口工具--预览编辑器DCL
在下拉式列示框中,选取该定义文件中所设定的对话框名称,即可预视对话框;亦可直接输入该对话框的名称(要注意大小写)。
第3节
批注//表示其右边(至该行末端)的文字视为注释
/**/包括在两个批注符号中间的所有文字(可跨越多行)均视为注释
语义检核提供4个等级的检核,该些检核会在对话框载入时完成;可以将下列语句放在定义文件中的任何位置,但不能在任何对话框的定义内。
dcl_settings:
default_dcl_settings{audit_level=3;}
等级0不检查:
只有在该定义档巳被检核且不会再作修改时使用
等级1错误:
找出可能造成AutoCAD终止的错误,此等级也是默认值
等级2警告:
找出配置或行为模式的错误,所有定义在修改后,最少应执行此等级的检查一次
等级3提示:
找出多余的属性定义
对话框的设计美观性颜色配比,组件整齐排列等
方便性相同功能的项目要编排在一起,或使用线框包围;使用频繁的项目应设置在最显眼及方
便的位置;适当设置快速键及默认值(默认值,省缺值);除非对话框中的项目过多,
否则应避免使用巢状(嵌套)式对话方框
互锁或互换项目选取(或不选取)时,会否引致其它项目功能的改变(enable或disable......等)
第4节对话框定义文件内容模式
对话框名称:
dialog
{label="对话框标题";
:
组件名称
{属性名称=属性值;
}//组件定义结束
}//对话框结束
定义说明:
对话框名称就是由AutoLISP程序,启动对话框时所呼叫的名称;可以自行设定,要区分大小写字母;dialog为对话框中,最外层的组件(即整个对话框),其它的组件均包含在其中;一般组件要以冒号:
开始,并为小写字母;因为不是属性,所以不须使用分号;结束;
开大括号{紧随组件名称之后,以包含该组件的属性或其它组件;label为属性名称,并以等号=赋以其右边的属性值,最后以分号;结束该行叙述;
包含在对话框中的其它组件;组件要以冒号:
开始,并为小写字母;因为不是属性,所以不须使用分号;结束;
开大括号{紧随组件名称之后,以包含组件的属性或其它组件;包含在组件中的属性,要以等号=赋以其右边的属性值;最后以分号;结束该行叙述;
以关大括号}与第4行的开大括号}对应,以结束该组件(第3行)之定义;双除号//右边的文字即为批注;
以关大括号}与第2行的开大括号}对应,以结束该组件之定义(在本例中为整个对话框的定义,即第1行的dialog组件。
注意:
上例中缩排只为方便观察,不作缩排亦可;包含在对话框中的组件及组件中的属性可以不只一个。
第5节练习(Exercises)
请输入以下的对话框定义,并命名为RECT.DCL(纯文字格式),存在C盘的根目录中
RECT:
dialog
{label="Rectangle";
:
text//文字组件
{label="Rectanglewidth:
";//组件的属性
}
ok_only;
}
定义说明:
设定对话框的名称为RECT,紧接一个以冒号开始的组件dialog;
最左边为dialog组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectangle",以分号结束此行叙述;
text为"字符串"组件,其作用是在对话框中显示文字,组件名称前要加冒号;
最左边为text组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectanglewidth",最后以分号结束此行叙述;
关大括号是对应第4行的开大括号,这对大括号同属于第3行的text组件;
ok_only为一"按钮组件",它的作用是在对话框中显示一个"确定(OK)"按钮;在一个对话框中,必需提供最少一个"确定"按钮,或一个"取消"按钮(组件名称为cancel_button),以作为结束对话框之用;本例中不设定按钮之属性,固不需以冒号放在组件名称的前面,但却需要以分号结束;
关大括号是对应第2行的开大括号,这对大括号同属于第1行的dialog组件。
注意:
虽然定义档巳经完作,但仍要待学习完第2篇的课程后,才能开启及显示该对话框。
第二篇开启对话框
第1节AutoLISP函数
加载DCL定义文件函数(LOAD_DIALOG"对话框定义档名称")例如:
(LOAD_DIALOG"C:
/RECT.DCL")
自变量是要加载的对话框定义文件名称字符串(所以要在前后加双引号);若不设定扩展名则预设为.DCL;函数会依资源搜寻路径找寻该定义文件;不在搜寻路径中的档案,要在文件名称前加上指定的路径;函数若成功加载该定义档,会传回一正整数值的档案处理码,供其它函数呼叫使用;无法加载时则传回负整数值;一般会将传回的档案处理码以SETQ函数存入变量中例如:
(SETQDCL_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_DIALOGDCL_ID)
从内存释放档案处理码(经由LOAD_DIALOG函数取得)指定的对话框定义档;函数传回值一定是NIL。
第2节对话框开启方式
(DEFUNC:
函数名称()(SETQ变量(LOAD_DIALOG"对话框定义档"))
(NEW_DIALOG"对话框名称"变量)
(START_DIALOG)(UNLOAD_DIALOG变数)
)
程序说明:
以DEFUN函数定义程序的名称,使用LOAD_DIALOG函数加载指定的对话框定义档;使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量中,以方便其它函数使用;
使用NEW_DIALOG,开启及显示定义文件中(档案处理码),指定的对话框;
使用START_DIALOG函数,使对话框开始作用并接受使用者输入;使用UNLOAD_DIALOG函数以结束对话框;
关括号是对应第1行DEFUN函数左边的开括号,结束整个程序。
练习(Exercises)
编写一AutoLISP程序,以开启上一课所定义的对话框;并将该程序命名为RECT.LSP,存在C盘的根目录中,程序代码如下:
(DEFUNC:
RECT()(SETQDCL_ID(LOAD_DIALOG"C:
/RECT.DCL"))
(NEW_DIALOG"RECT"DCL_ID)
(START_DIALOG)(UNLOAD_DIALOGDCL_ID)
)
程序说明:
以DEFUN函数定义程序的名称为RECT,使用LOAD_DIALOG函数将对话框定义文件RECT.DCL载入;使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量DCL_ID中,以方便其它函数使用;
使用NEW_DIALOG,开启及显示定义文件中(档案处理码)名称为RECT的对话框;
使用START_DIALOG函数,使对话框开始作用并接受使用者输入(在本例中只有确定钮可按);使用UNLOAD_DIALOG函数以结束对话框;
关括号是对应第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)
其它属性actionallow_acceptfixed_heightheight
is_tab_stopmnemonicwidth
第4节练习(Exercises)
将上一课的RECT.DCL对话框定义档复制至RECT1.DCL,开启新的定义档并作如下的修改,使其可以输入四边形的阔度及高度;将AutoLISP程序文件RECT.LSP复制至RECT1.LSP,开启新的程序文件,并将要加载的对话框定义档改为RECT1(程序第1行);完成后即可加载及执行新的程序文件
RECT:
dialog
{label="Rectangle";
:
edit_box//编辑框组件
{label="Rectanglewidth:
";
key="RECT_W";
edit_limit=16;
edit_width=10;
fixed_width=true;
}
:
edit_box//编辑框组件
{label="Rectangleheigth:
";
key="RECT_H";
edit_limit=16;
edit_width=10;
fixed_width=true;
}
ok_only;
}
定义说明:
设定对话框的名称为RECT,紧接一个以冒号开始的组件dialog;
最左边为dialog组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectangle",以分号结束此行叙述;
edit_box为"编辑框"组件,组件名称前要加冒号;
最左边为edit_box组件的开大括号,右边是其属性label,并以等号设定其属性值为"Rectanglewidth:
",最后以分号结束此行叙述;
设定属性key的属性值为RECT_W(即设定此编辑框的名称);
设定属性edit_limit的属性值为16(即最多可以在编辑框中输入16个数字);
设定属性edit_width的属性值为10(编辑框只会显示10个字的长度);
设定属性fixed_width的属性值为true,表示表将编辑框以固定的阔度显示;
关大括号是对应第4行的开大括号,这一对大括号同属于第3行的edit_box组件;
至
与3至9行相似,设定另一个编辑框以输入高度的数据;只有属性label及key的属性值不同;
以ok_only组件,在对话框中显示一个确定(OK)按钮,作为结束对话框之用;
关大括号是对应第2行的开大括号,这一对大括号同属于第1行的dialog组件。
注意:
在第一个编辑框(输入四边形的阔度)的label属性值中,在字符串最后的冒号后面,加多了一个空格,目的是方更与下一个编辑框对齐。
第三篇设定及取得对话框元件内的值
第1节AutoLISP函数
设定组件的值(SET_TILE"组件关键词"设定值)例如:
(SET_TILE"RECT_W""50.0")
组件的初始值可在定义文件中以属性value设定,但在程序文件中则以此函数设定;组件关键词即是在对话框定义文件中,以组件属性key所定义的属性值,以赋予该组件一个操作名称;组件关键词是有区分大小写的;此函数要在START_DIALOG函数之后才能使用。
取得组件的值(GET_TILE"组件关键词")例如:
(GET_TILE"RECT_W")
作用是在AutoLISP程序文件中取得组件(以关键词指定)的设定值;组件关键词的说明与SET_TILE函数相同;此函数要在DONE_DIALOG函数之前使用(即要在对话框结束前使用)。
设定组件的状态(MODE_TILE"组件关键词"状态模式)例如:
(MODE_TILE"RECT_W"0)
作用是在AutoLISP程序文件中设定组件(以关键词指定)的使用状态,其状态模式可以设定为下列任一整数值:
0使指定的组件成为使用状态1使指定的组件成为禁用状态(组件以灰色显示)
2使指定的组件成为焦点3选取指定编辑框组件的内容
4图像高亮度显示的开关
组件关键词的说明与SET_TILE函数相同。
第2节练习(Exercises)
以修改对话框定义档的方式,设定输入阔度的编辑框其初始值为50,输入高度的编辑框其初始值为25
定义档将RECT1.DCL复制至RECT2.DCL,在关键词为RECT_W的组件中,加入value属性并设定其初始值为50;在关键词为RECT_H的组件中,加入value属性并设定其初始值为25
程序文件将RECT1.LSP复制至RECT2.LSP,只须修改其加载的定义档名称为RECT2.DCL即可;完成后存盘,进入AutoCAD并载入RECT2.LSP程序文件,执行RECT2程序
RECT:
dialog
{label="Rectangle";
:
edit_box
{"Rectanglewidth:
";
key="RECT_W";
edit_limit=16;
edit_width=10;
fixed_width=true;
value="50.0"//注意设定值为字符串型态,要在前后加双引号
}
:
edit_box
{"Rectangleheight:
";
key="RECT_H";
edit_limit=16;
edit_width=10;
fixed_width=true;
value="25.0"//注意设定值为字符串型态,要在前后加双引号
}
}
第3节练习(Exercises)
以修改AutoLISP程序文件的方式,使输入阔度的编辑框其初始值为50,输入高度的编辑框其初始值为25
定义档将RECT1.DCL(不是RECT2.DCL)复制至RECT3.DCL,不作任何修改
程序文件将RECT1.LSP复制至RECT3.LSP,程序代码如下:
(DEFUNC:
RECT()(SETQDCL_ID(LOAD_DIALOG"C:
/RECT3.DCL"))
(NEW_DIALOG"RECT"DCL_ID)
(SET_TILE"RECT_W""50.0")
(SET_TILE"RECT_H""25.0")
(START_DIALOG)(UNLOAD_DIALOGDCL_ID)
)
程序说明:
以DEFUN函数定义程序的名称RECT,使用LOAD_DIALOG函数将对话框定义文件RECT3.DCL载入;使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量DCL_ID中,以方便其它函数使用;
使用NEW_DIALOG,开启及显示定义文件中(档案处理码)名称为RECT的对话框;
使用SET_TILE函数,设定输入阔度的编辑框组件RECT_W(组件关键词,在定义文件中key设定的属性值)为50,设定输入高度的编辑框组件RECT_H为25;
使用START_DIALOG函数,使对话框开始作用并接受使用者输入(在本例中只有确定钮可按);使用UNLOAD_DIALOG函数以结束对话框;
关括号是对应第1行DEFUN函数左边的开括号,结束整个程序。
第4节AutoLISP函数
组件指定动作(ACTION_TILE"组件关键词""指定动作")
例如:
(ACTION_TILE"RECT_W""(SETQTEMP1)")
当焦点在指定的组件(关键词)上并按下接受键时,即会执行函数所指定的动作;指定动作会取代定义文件中,该组件的action属性之预设动作;组件关键词"accept"在预设情况下是与确定按钮组件关连(即是确定按钮的预设关键词),"cancel"则与取消按钮组件关连(即是取消按钮的预设关键词)。
终止对话框(DONE_DIALOG[指定传回值])例如:
(DONE_DIALOG)
此函数的传回值为一个2D点串行坐标,为结束对话框时,对话框的所在位置;可作为下次启动同一个对话框的位置自变量,使对话框在之前结束时的位置再次显现。
练习(Exercises)
将定义档RECT3.DCL复制至RECT4.DCL,但不作任何修改。
将程序文件RECT3.LSP复制至RECT4.LSP,并修改为:
使用ACTION_TILE函数,指定在按下确定钮时,执行一辅助程序;在该辅助程序中,使用GET_TILE函数最得对话框中四边形的阔度及高度,并在使用者选取的位置上绘画出四边形。
(DEFUNC:
RECT()(SETQDCL_ID(LOAD_DIALOG"C:
/RECT4.DCL"))
(NEW_DIALOG"RECT"DCL_ID)
(SET_TILE"RECT_W""50.0")
(SET_TILE"RECT_H""25.0")
(ACTION_TILE"accept""(S_RECT)(DONE_DIALOG)")
(START_DIALOG)(UNLOAD_DIALOG)
(SETQPT_0(GETPOINT"\nSelectrectanglelowerleftpoint:
"))
(SETQPT_1(POLARPT_00TMP_W)
PT_2(POLARPT_1(/PI2)TMP_H)
PT_3(POLARPT_2PITMP_W))
(COMMAND"PLINE"PT_0PT_1PT_2PT_3"C")
(PRINC))
(DEFUNS_RECT()(SETQTMP_W(ABS(ATOF(GET_TILE"RECT_W")))
TMP_H(ABS(ATOF(GET_TILE"RECT_H"))))
)
主程序(RECT)说明:
注意将LOAD_DIALOG函数所加载的对话框定义档改为RECT4.DCL;
-
参阅RECT3程序的说明;
使用ACTION_TILE函数设定关键词为accept的组件(预设为确定按钮)的指定动作:
先执行辅助程序S_RECT,取得输入的数据,再使用DONE_DIALOG函数结束对话框;
参阅RECT3程序,第5行的说明;
使用GETPOINT函数让使用者选取四边形的左下角位置坐标,存入变量PT_0;
使用POLAR函数取得新坐标点:
从选取点PT_0开始,向右(角度为0),距离为四边形的阔度(变量TMP_W,在辅助程序中取得),存入变量PT_1;
使用POLAR函数取得新坐标点:
从上一点PT_1开始,向上(角度90,等于PI除2),距离为四边形的高度(变量TMP_H,在辅助程序中取得),存入变量PT_2;
使用POLAR函数取得新坐标点:
从上一点PT_2开始,向左(角度1800,等于PI),距离为四边形的阔度(变量TMP_W,在辅助程序中取得),存入变量PT_3;注意最右边的关括号,是对应第8行SETQ函数左边的开括号;
使用COMMAND函数执行PLINE指令,并分别设定四个坐标变量,最后以"C"选项封闭聚合线;
以一个不带参数的PRINC函数,抑制多余的显示及传回值;最右边的关括号是对应第1行DEFUN函数左边的开括号。
辅助程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lisp 对话框