Lisp教程下册 DCL编程彩版.docx
《Lisp教程下册 DCL编程彩版.docx》由会员分享,可在线阅读,更多相关《Lisp教程下册 DCL编程彩版.docx(60页珍藏版)》请在冰豆网上搜索。
Lisp教程下册DCL编程彩版
DCL(DialogControlLanguage)语言教程
课程简介
课程主要介绍AutoLISP程序的编写,配合使用DCL(DialogControlLanguage)语言,作对话方框的开发及应用.本课程只适合对AutoLISP程序设计有相当认识之人仕.全课共分为12篇,每篇一个主题;而每篇再分为若干小节,每天顺序显示.
内文若有错漏,敬祁见谅,欢迎来函赐教,多谢!
!
课程大纲
第一篇(0-4课)AutoLISP及Dialog程序设计基本知识
第二篇(5-8课)开启对话方框
第三篇(9-13课)设定及取得对话框内组件的值
第四篇(14-19课)按钮(button)及核取框(切换钮,toggle)
第五篇(20-25课)横列(row),直行(column),空白(spacer)及文字组件(text)
第六篇(26-30课)滑杆(滚动条)组件(slider)
第七篇(31-36课)其它按钮及影像按钮组件(image_button)
第八篇(37-43课)列表选框组件(list_box)
第九篇(44-48课)下拉式(弹出式)列表选框组件(popup_list)
第十一篇
(53
-57课)影像组件(image)
第十二篇
(58
-60课)其它组件
第十篇(49-52课)选台钮(radio_button)
注意事项
在各篇课程所介绍的语法结构中,包含在方括号[]中的数据,表示为选择性项目;可因应
情况,自行决定是否须要加上.
字型为紫色的项目,表示可自行设定其名称或内容
定义文件为设定对话框组件的纯文本文件(扩展名为DCL),程序文件则是编写AuotLISP程序的纯
文本文件(扩展名LSP)
在定义档中,批注以双除号//开始,批注符号及其右边的文字可以不输入;但在程序文件中,
批注以分号;开始,批注符号及其右边的文字可以不输入.
第一篇基本知识
基本知识对话框是现今最流行的人机互动面接口;在早期的AutoCAD版本中巳经使用,但只有在R12版
本开始,才提供给用户自行编程的对话框开发功能.
对话框的描述定义在一纯文本檔(扩展名为DCL)内,无须特别的开发环境定义文件中的对话框描述,均以对话控制语言(DialogControlLanguage,简称DCL语言)所建立
在AutoLISP程序中,配合可编程对话框(PorgrammableDialogBox,简称PDB)函数,激活及操控对话框
可以在一个定义档(扩展名DCL)中定义多个对话框对话框由方块本身,及包含于其内的组件(或称为控件,构件)所组成
每个组件的属性定义均包含在一对大括号{}中在定义文件中,各组件及其属性均为小写;只有在赋值给属性,或设定对话框名称时才可使用大写字母
属性以等号=赋值,并以分号;结束(注意:
在AutoLISP程序中,分号是作为批注)一般要在组件名称前加上一个冒号:
但若组件并不设定属性,则不需要在组件名称前加冒号,但却要以分号结束
空行会被忽
若定义档发生严重的错误,会在当前的目录下,产生ACAD.DCE文件,以指明所发生的错误.
定义档
BASE.DCL默认在SUPPORT的目录中,它包含了各组件的原型定义,及各类型巳定义的其它基本组件;而所有自行开发的对话框定义文件,都可以使用在BASE.DCL定义文件中的各个组件
ACAD.DCL默认在SUPPORT的目录中,它包含了AutoCAD中所有标准对话框的定义
参考定义档
可在自行开发的对话框定义文件中,经由include指令,取得指定DCL文件中所定义的组件;其语法
如下:
@include"对话框定义档"
e.g.@include"david.dcl"
定义档名称要包含在双引号"中,可以在檔名前加上定的目录路径会先在当前的目录中搜寻该定义文件,然后是定义文件所在的目录;若有指定档案的路径,则只会在指定的目录内寻找
不可以参考ACAD.DCL所定义的对话框,即不可以使用@include"acad.dcl"
预视对话框
若在VisualLISP中开启一对话框定义文件,即可使用:
工具--接口工具--预览编辑器DCL
在下拉式列示框中,选取该定义文件中所设定的对话框名称,即可预视对话框
亦可直接输入该对话框的名称(要注意大小写)
批注
//
/*
*/
表示其右边(至该行末端)的文字视为注释
包括在两个批注符号中间的所有文字(可跨越多行)均视为注释
语义检核
提供4个等级的检核,该些检核会在对话框载入时完成;可以将下列语句放在定义档中的任何位置,但不能在任何对话框的定义内.
dcl_settings:
default_dcl_settings{audit_level=3;}
等级0不检查:
只有在该定义档巳被检核且不会再作修改时使用
等级1错误:
找出可能造成AutoCAD终止的错误,此等级也是默认值
等级2警告:
找出配置或行为模式的错误,所有定义在修改后,最少应执行此等级的检查
一次
等级3提示:
找出多余的属性定义
对话框的设计
美观性颜色配比,组件整齐排列等
方便性相同功能的项目要编排在一起,或使用线框包围
使用频繁的项目应设置在最显眼及方便的位置
适当设置快捷键及默认值(默认值,省缺值)
除非对话框中的项目过多,否则应避免使用巢状(嵌套)式对话方框
互锁或互换项目选取(或不选取)时,会否引致其它项目功能的改变(enable或
disable...等)
对话框定义文件内容模式
对话框名称:
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="Rectanglewidth:
";//组件的属性
}
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函数加载DCL定义文件函数
(LOAD_DIALOG"对话框定义档名称")
e.g.(LOAD_DIALOG"C:
/RECT.DCL")
自变量是要加载的对话框定义文件名称字符串(所以要在前后加双引号);若不设定扩展名则预设为.DCL函数会依资源搜寻路径找寻该定义文件;不在搜寻路径中的档案,要在文件名前加上指定的路径函数若成功加载该定义档,会传回一正整数值的档案处理码,供其它函数呼叫使用;无法载入时则传回负整数值
一般会将传回的档案处理码以SETQ函数存入变量中
e.g.(SETQDCL_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_DIALOGDCL_ID)
从内存释放档案处理码(经由LOAD_DIALOG函数取得)指定的对话框定义档
函数传回值一定是NIL
对话框开启方式
(DEFUNC:
函数名称()(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盘
的根目录中,程序代码如下:
(DEFUNC:
RECT()(SETQDCL_ID(LOAD_DIALOG"C:
/RECT.DCL"))(NEW_DIALOG"RECT"DCL_ID)
(START_DIALOG)(UNLOAD_DIALOGDCL_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函数左边的开括号,结束整个程序
编辑框组件(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
练习(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;
}
定义说明:
1设定对话框的名称为RECT,紧接一个以冒号开始的组件dialog
2最左边为dialog组件的开大括号,右边是其属性label,并以等号设定其属性值为
"Rectangle",以分号结束此行叙述
3edit_box为"编辑框"组件,组件名称前要加冒号
4最左边为edit_box组件的开大括号,右边是其属性label,并以等号设定其属性值为
"Rectanglewidth:
",最后以分号结束此行叙述
5设定属性key的属性值为RECT_W(即设定此编辑框的名称)
6设定属性edit_limit的属性值为16(即最多可以在编辑框中输入16个数字)
7设定属性edit_width的属性值为10(编辑框只会显示10个字的长度)
8设定属性fixed_width的属性值为true,表示表将编辑框以固定的阔度显示
9关大括号是对应第4行的开大括号,这一对大括号同属于第3行的edit_box组件
10至16与3至9行相似,设定另一个编辑框以输入高度的数据;只有属性label及key的属性
值不同
17以ok_only组件,在对话框中显示一个确定(OK)按钮,作为结束对话框之用
18关大括号是对应第2行的开大括号,这一对大括号同属于第1行的dialog组件
注意
1在第一个编辑框(输入四边形的阔度)的label属性值中,在字符串最后的冒号后面,加多了一
个空格,目的是方更与下一个编辑框对齐
第三篇设定及取得对话框组件内的值
AutoLISP函数
设定组件的值
(SET_TILE"组件关键词"设定值)
e.g.(SET_TILE"RECT_W""50.0")
组件的初始值可在定义文件中以属性value设定,但在程序文件中则以此函数设定组件关键词即是在对话框定义文件中,以组件属性key所定义的属性值,以赋予该组件一个操作名称
组件关键词是有区分大小写的
此函数要在START_DIALOG函数之后才能使用
取得组件的值
(GET_TILE"组件关键词")
e.g.(GET_TILE"RECT_W")
作用是在AutoLISP程序文件中取得组件(以关键词指定)的设定值组件关键词的说明与SET_TILE函数相同此函数要在DONE_DIALOG函数之前使用(即要在对话框结束前使用)
设定组件的状态
(MODE_TILE"组件关键词"状态模式)
e.g.(MODE_TILE"RECT_W"0)
作用是在AutoLISP程序文件中设定组件(以关键词指定)的使用状态,其状态模式可以设定为
下列任一整数值:
0使指定的组件成为使用状态
1使指定的组件成为禁用状态(组件以灰色显示)
2使指定的组件成为焦点
3选取指定编辑框组件的内容
4图像高亮度显示的开关
组件关键词的说明与SET_TILE函数相同
练习(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"//注意设定值为字符串型态,要在前后加双引号
}
}
以修改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)
)
程序说明:
1以DEFUN函数定义程序的名称RECT,使用LOAD_DIALOG函数将对话框定义文件RECT3.DCL载入;
使用SETQ函数,将LOAD_DIALOG传回的档案处理码存入变量DCL_ID中,以方便其它函数使用
2使用NEW_DIALOG,开启及显示定义文件中(档案处理码)名称为RECT的对话框
3,4使用SET_TILE函数,设定输入阔度的编辑框组件RECT_W(组件关键词,在定义文件中key设定
的属性值)为50,设定输入高度的编辑框组件RECT_H为25
5使用START_DIALOG函数,使对话框开始作用并接受使用者输入(在本例中只有确定钮可
按);使用UNLOAD_DIALOG函数以结束对话框
6关括号是对应第1行DEFUN函数左边的开括号,结束整个程序
AutoLISP函数
组件指定动作
(ACTION_TILE"组件关键词""指定动作")
e.g.(ACTION_TILE"RECT_W""(SETQTEMP1)")
当焦点在指定的组件(关键词)上并按下接受键时,即会执行函数所指定的动作指定动作会取代定义文件中,该组件的action属性之默认动作组件关键词"accept"在默认情况下是与确定按钮组件关连(即是确定按钮的默认关键字),"cancel"则与取消按钮组件关连(即是取消按钮的默认关键词)
终止对话框
(DONE_DIALOG[指定传回值])
e.g.(DONE_DIALOG)
此函数的传回值为一个2D点串行坐标,为结束对话框时,对话框的所在位置;可作为下次启
动同一个对话框的位置自变量,使对话框在之前结束时的位置再次显现
练习(Exercises)
将定义档RECT3.DCL复制至RECT4.DCL,但不作任何修改.将程序文件RECT3.LSP复制至RECT4.LSP,并修改为:
使用ACTION_TILE函数,指定在按下确定钮时,执行一辅助程序;在该辅助程序中,使用GET_TILE函数最得对话框中四边形的阔度及高度,并在用户选取的位置上绘画出四边形.
(DEFUNC:
RECT()(SETQDCL_ID(LOAD_DIA