lisp教程网络版2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第 0 课 <第一篇 基本知识> (第1节)
基本知识
对话框是现今最流行的人机互动面接口;在早期的AutoCAD版本中巳经使用,但只有在R12版本开始,才提供给使用者自行编程的对话框开发功能.
对话框的描述定义在一纯文字文件(扩展名为DCL)内,无须特别的开发环境 定义文件中的对话框描述,均以对话控制语言(Dialog Control Language,简称DCL语言)所建立
在AutoLISP程序中,配合可编程对话框(Porgrammable Dialog Box,简称PDB)函数,激活及操控对话框
可以在一个定义档(扩展名DCL)中定义多个对话框
对话框由方块本身,及包含于其内的组件(或称为控件,构件)所组成
每个组件的属性定义均包含在一对大括号{ }中
在定义文件中,各组件及其属性均为小写;只有在赋值给属性,或设定对话框名称时才可使用大写字母
属性以等号=赋值,并以分号;结束(注意 : 在AutoLISP程序中,分号是作为批注)
一般要在组件名称前加上一个冒号:,但若组件并不设定属性,则不需要在组件名称前加冒号,但却要以分号结束
空行会被忽
若定义档发生严重的错误,会在当前的目录下,产生ACAD.DCE文件,以指明所发生的错误.
第 1 课 <第一篇 基本知识> (第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
在下拉式列示框中,选取该定义文件中所设定的对话框名称,即可预视对话框
亦可直接输入该对话框的名称(要注意大小写)
第 2 课 <第一篇 基本知识> (第3节)
批注
//表示其右边(至该行末端)的文字视为注释
/* */包括在两个批注符号中间的所有文字(可跨越多行)均视为注释
语义检核
提供4个等级的检核,该些检核会在对话框载入时完成;可以将下列语句放在定义文件中的任何位置,但不能在任何对话框的定义内.
dcl_settings : default_dcl_settings {audit_level = 3;}
等级0 不检查 : 只有在该定义档巳被检核且不会再作修改时使用
等级1 错误 : 找出可能造成AutoCAD终止的错误,此等级也是默认值
等级2 警告 : 找出配置或行为模式的错误,所有定义在修改后,最少应执行此等级的检查一次
等级3 提示 : 找出多余的属性定义
对话框的设计
美观性 颜色配比,组件整齐排列等
方便性 相同功能的项目要编排在一起,或使用线框包围
使用频繁的项目应设置在最显眼及方便的位置
适当设置快速键及默认值(默认值,省缺值)
除非对话框中的项目过多,否则应避免使用巢状(嵌套)式对话
方框
互锁或互换 项目选取(或不选取)时,会否引致其它项目功能的改变
(enable或disable...等)
第 3 课 <第一篇 基本知识> (第4节)
对话框定义文件内容模式
对话框名称:dialog
{label="对话框标题" ;
:组件名称
{ 属性名称=属性值;
} //组件定义结束
} //对话框结束
定义说明
1对话框名称就是由AutoLISP程序,启动对话框时所呼叫的名称;可以自行设定,要区分大小写字母
dialog为对话框中,最外层的组件(即整个对话框),其它的组件均包含在其中
一般组件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;
结束
2开大括号{紧随组件名称之后,以包含该组件的属性或其它组件 label为属性名称,并以等号=赋以其右边的属性值,最后以分号;结束该行叙述
3包含在对话框中的其它组件
组件要以冒号:开始,并为小写字母;因为不是属性,所以不须使用分号;结束4开大括号{紧随组件名称之后,以包含组件的属性或其它组件 包含在组件中的属性,要以等号=赋以其右边的属性值;最后以分号;结束该行叙述
5以关大括号}与第4行的开大括号}对应,以结束该组件(第3行)之定义 双除号//右边的文字即为批注
6以关大括号}与第2行的开大括号}对应,以结束该组件之定义(在本例中为整个对话框的定义,即第1行的dialog组件
注意:
上例中缩排只为方便观察及维护,不作缩排亦可
包含在对话框中的组件及组件中的属性可以不只一个
第 4 课 <第一篇 基本知识> (第5节)
练习 (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篇的课程后,才能开启及显示该对话框
第 5 课 <第二篇 开启对话框> (第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
第 6 课 <第二篇 开启对话框> (第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函数左边的开括号,结束整个程序
第 7 课 <第二篇 开启对话框> (第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
第 8 课 <第二篇 开启对话框> (第4节)
练习(Exercises)
将上一课的RECT.DCL对话框定义档复制至RECT1.DCL,开启新的定义档并作如下的修改,使其可以输入四边形的阔度及高度;将AutoLISP程序文件RECT.LSP 复制至RECT1.LSP,开启新的程序文件,并将要加载的对话框定义档改为
RECT1(程序第1行);完成后即可加载及执行新的程序文件
RECT:dialog
{label="Rectangle" ;
:edit_box//编辑框组件
{label="Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
}
:edit_box//编辑框组件
{label="Rectangle heigth :" ;
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,并以等号设定其属性值为 "Rectangle width : ",最后以分号结束此行叙述
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属性值中,在字符串最后的冒号后面,加多了一个空格,目的是方更与下一个编辑框对齐
1节)
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函数相同
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
{"Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="50.0" //注意设定值为字符串型态,要在前
后加双引号
}
:edit_box
{"Rectangle height :" ;
key="RECT_H" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="25.0" //注意设定值为字符串型态,要在前
后加双引号
}
}
第 11 课 <第三篇 设定及取得对话框组件内的值> (第
3节)
练习 (Exercises)
以修改AutoLISP程序文件的方式,使输入阔度的编辑框其初始值为50,输入高度的编辑框其初始值为25
定义档 将RECT1.DCL(不是RECT2.DCL)复制至RECT3.DCL,不作任何修改 程序文件 将RECT1.LSP复制至RECT3.LSP,程序代码如下:
(DEFUN C:RECT()(SETQ DCL_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_DIALOG DCL_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函数左边的开括号,结束整个程序
第 12 课 <第三篇 设定及取得对话框组件内的值> (第
4节)
AutoLISP函数
组件指定动作
(ACTION_TILE "组件关键词" "指定动作")
e.g. (ACTION_TILE "RECT_W" "(SETQ TEMP 1)")
当焦点在指定的组件(关键词)上并按下接受键时,即会执行函数所指定的动

指定动作会取代定义文件中,该组件的action属性之预设动作
组件关键词"accept"在预设情况下是与确定按钮组件关连(即是确定按钮的预设关键词),"cancel"则与取消按钮组件关连(即是取消按钮的预设关键词)
终止对话框
(DONE_DIALOG [指定传回值])
e.g. (DONE_DIALOG)
此函数的传回值为一个2D点串行坐标,为结束对话框时,对话框的所在位置;
可作为下次启动同一个对话框的位置自变量,使对话框在之前结束时的位置再次显现
练习 (Exercises)
将定义档RECT3.DCL复制至RECT4.DCL,但不作任何修改.将程序文件
RECT3.LSP复制至RECT4.LSP,并修改为 : 使用ACTION_TILE函数,指定在按下确定钮时,执行一辅助程序;在该辅助程序中,使用GET_TILE函数最得对话框中四边形的阔度及高度,并在使用者选取的位置上绘画出四边形.
(DEFUN C:RECT()(SETQ DCL_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)
(SETQ PT_0 (GETPOINT "\nSelect rectangle lower left
point : "))
(SETQ PT_1 (POLAR PT_0 0 TMP_W)
PT_2 (POLAR PT_1 (/ PI 2) TMP_H)
PT_3 (POLAR PT_2 PI TMP_W))
(COMMAND "PLINE" PT_0 PT_1 PT_2 PT_3 "C")
(PRINC))
(DEFUN S_RECT()(SETQ TMP_W (ABS (ATOF (GET_TILE "RECT_W")))
TMP_H (ABS (ATOF (GET_TILE "RECT_H"))))
)
续下一课 ....
第 13 课 <第三篇 设定及取得对话框组件内的值> (第
5节)
续上一课 ....
主程序(RECT)说明:
1注意将LOAD_DIALOG函数所加载的对话框定义档改为RECT4.DCL
2-
参阅RECT3程序的说明
4
5使用ACTION_TILE函数设定关键词为accept的组件(预设为确定按钮)的指定动作 : 先执行辅助程序S_RECT,取得输入的数据,再使用DONE_DIALOG函数结束对话框
6参阅RECT3程序,第5行的说明
7使用GETPOINT函数让使用者选取四边形的左下角位置坐标,存入变量PT_0 8使用POLAR函数取得新坐标点 : 从选取点PT_0开始,向右(角度为0),距离为四边形的阔度(变量TMP_W,在辅助程序中取得),存入变量PT_1
9使用POLAR函数取得新坐标点 : 从上一点PT_1开始,向上(角度90,等于PI 除2),距离为四边形的高度(变量TMP_H,在辅助程序中取得),存入变量PT_2 10使用POLAR函数取得新坐标点 : 从上一点PT_2开始,向左(角度1800,等于PI),距离为四边形的阔度(变量TMP_W,在辅助程序中取得),存入变量PT_3;
注意最右边的关括号,是对应第8行SETQ函数左边的开括号
11使用COMMAND函数执行PLINE指令,并分别设定四个坐标变量,最后以"C"选项封闭聚合线
12以一个不带参数的PRINC函数,抑制多余的显示及传回值;最右边的关括号是对应第1行DEFUN函数左边的开括号
辅助程序(S_RECT)说明:
1设定函数名称;使用GET_TILE函数取得指定关键词(RECT_W,代表输入阔度的编辑框组件)的值,并将该值使用ATOF函数由字符串型态转为实数型态(有小数);再使用ABS函数取得实数的绝对值,以防止使用者输入负数;最后将数据存入变量TMP_W
2使用GET_TILE函数取得指定关键词(RECT_H,代表输入高度的编辑框组件)的值,转型及取得绝对值后,存入变量TMP_H
3用一个关括号,对应第1行DEFUN函数左的开括号
第 14 课 <第四篇 按钮及核取框(切换钮)> (第1节)
按钮组件(button)
一个矩形的按钮,可显示指定的讯息在按钮上
:button//组件名称
{ 属性="属性值" ;
}
属性
label显示在按钮中的提示文字
key其属性值即为使用该按钮组件的关键词
width指定按钮的显示阔度
height指定按钮的显示高度
fixed_width通常与width属性一并使用,以固定按钮的显示阔度
fixed_height 通常与height属性一并使用,以固定按钮的显示高度
is_enable可设定按钮是否可以使用,其属性值可设定为true(可使用)或false(禁用,按钮中的消息正文变为灰色显示),默认值为true is_default属性值可设定为true或false;当使用者按下接受键(大部份的情况,ENTER被用作接受键)时,本属性设定为true的组件会自动
被选取.当使用者在allow_accept属性设为true的编辑框,列表
框或图像按钮中.按下接受键或双击鼠标键(只对列表框及图像
按钮有效)时,本属性设定为true的组件亦会自动被选取 alignment如果组件成水平方向排列,属性值可设定为left,right或
centered(若不设定则预设为left);如果组件成垂直方向排列,
属性值可设定为top,bottom或centered(若不设定则预设为
centered)
其它属性
action is_cancel is_tab_top mnemonic
第 15 课 <第四篇 按钮及核取框(切换钮)> (第2节)核取框(切换钮)组件(toggle)
是一个启用或关闭的切换方框,当方框中没有剔勾符号时,表示该功能为关闭状态,其组件的值为0;当方框中有剔勾符号时,表示该功能为启用状态,其组件的值为1
:toggle//组件名称
{ 属性="属性值" ;
}
属性
label显示在切换钮后面(右边)的提示文字
key其属性值即为使用该按钮组件的关键词
is_enable可设定切换钮是否可以使用,其属性值可设定为true(可使用)或false(禁用),默认值为true
value方框中没有剔勾符号时,表示该功能为关闭状态,其组件的值为0(亦是默认值);相反则为启用状态,组件的值为1
alignment如果组件成水平方向排列,属性值可设定为left,right或
centered(若不设定则预设为left);如果组件成垂直方向排列,
属性值可设定为top,bottom或centered(若不设定则预设为
centered)
其它属性
action is_tab_stop width heigth
fixed_width fixed_heigth
第 16 课 <第四篇 按钮及核取框(切换钮)> (第3节)练习 (Exercises)
在四边形的对话框中,增加一核取框,以确定是否在四边形中加上交叉的对角线;另在对话框的底部增加两个按钮,按下时可使核取框作用或禁用
定义档 将RECT4.DCL复制至RECT5.DCL,在新的定义档中增加核取框及按钮定义
RECT:dialog
{label="Rectangle" ;
:edit_box
{"Rectangle width : " ;
key="RECT_W" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="50.0"
}
:edit_box
{"Rectangle height :" ;
key="RECT_H" ;
edit_limit=16;
edit_width=10;
fixed_width=true;
value="25.0"
}
:toggle //新增的核取框(切换钮)组件
{label="X line in rectangle" ;
key="RECT_X" ;
}
:button //新增的按钮组件
{label="&Enable" ;
key="RECT_E" ;
width=10;
fixed_width=true;
}
:button //新增的按钮组件
{label="&Disable" ;
key="RECT_D" ;
width=10;
fixed_width=true;
}
ok_only;
}
续下一课 ....
第 17 课 <第四篇 按钮及核取框(切换钮)> (第4节)
续上一课 ....
定义说明:
第1至第18行的定义,与上一课练习RECT4.DCL定义相同,不再叙述
19以冒号开始,定义一个切换钮组件
20切换钮的开大括号,以label属性定义切换钮右边的消息正文
21以key属性设定切换钮的操作关键词
22关大括号是对应第20行的开大括号,此对大括号同属于第19行的切换钮组件
23以冒号开始,定义一个按钮组件
24按钮的开大括号,以label属性定义按钮上显示的消息正文.注意 : 字符串的&符号,表示设定在该符号右边的一个字母为快捷键;在显示时,&符号不会出现,但&符号右边的一个字符会以加底线显示
25以key属性设定按钮的操作关键词
26以width属性设定按钮的阔度,否则按钮会自动加长并占用整列的长度 27fixed_width属性设定为true,使按钮以固定的阔度显示
28关大括号是对应第24行的开大括号,此对大括号同属于第23行的按钮组件
29至34与上个按钮的定义类似(23至28行),但其label及key的属性值不同
35定义一个确定按钮,以结束对话框
36关大括号是对应第2行的开大括号,此对大括号同属于第1行的dialog组件
续下一课 ....
第 18 课 <第四篇 按钮及核取框(切换钮)> (第5节)
续上一课 ....
程序文件 将RECT4.LSP复制至RECT5.LSP,其程序代码如下:
(DEFUN C:RECT() (SETQ DCL_ID (LOAD_DIALOG "C:/RECT5.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)")
(ACTION_TILE "RECT_E" "(MODE_TILE \"RECT_X\" 0)") ;设定使用按钮的动作
(ACTION_TILE "RECT_D" "(MODE_TILE \"RECT_X\" 0)") ;设定禁用按钮的动作
(START_DIALOG)(UNLOAD_DIALOG)
(SETQ PT_0 (GETPOINT "\nSelect rectangle lower left point : ")) (SETQ PT_1 (POLAR PT_0 0 TMP_W)
PT_2 (POLAR PT_1 (/ PI 2) TMP_H)
PT_3 (POLAR PT_2 PI TMP_W))
(COMMAND "PLINE" PT_0 PT_1 PT_2 PT_3 "C")
(IF (= TMP_X 1) (COMMAND"LINE" PT_0 PT_2 "" "LINE" PT_1 PT_3 "")) (PRINC))
(DEFUN S_RECT() (SETQ TMP_W (ABS (ATOF (GET_TILE "RECT_W"))) TMP_H (ABS (ATOF (GET_TILE "RECT_H")))
TMP_X (ATOI (GET_TILE "RECT_X"))) ;取得切换钮的状态)
续下一课 ....
第 19 课 <第四篇 按钮及核取框(切换钮)> (第6节)
续上一课 ....
主程序(RECT)说明:
1至5 与程序RECT4.LSP相同,主要是加载及显示对话框,并设定其中的组件 6使用ACTION_TILE函数,设定当按下ENABLE按钮(关键词为RECT_E)时,所执行的动作 : 使用MODE_TILE函数,设定切换钮(关键词为RECT_X)的状态为
0,使其处于作用状态.注意指定的动作为字符串型态,前后要加上双引号";
而包含在字符串中的双引号,则必须以反斜线加双引号\"表示
7与第6行相似,设定按下DISABLE按钮(关键词为RECT_D)时,将切换钮的状态设为1,使其处于禁用状态
8至13 与程序RECT4.LSP相同,主要是用作绘画出四边形
14使用IF函数检查变量TMP_X(在辅助程序中取得,表示切换钮的状态)是否为1;若是则以COMMAND函数,执行两个LINE指令,绘画出四边形的对角线
15以一个不带参数的PRINC函数,抑制多余的显示及传回值;最右边的关括号是对应第1行DEFUN函数左边的开括号
辅助程序(S_RECT)说明:
1,2大致与RECT4.LSP的辅助程序相同,都是用以取得编辑框内的数据并存入变量中
3使用GET_TILE函数取得切换钮(关键词为RECT_X)的状态(传回值是字符串,"0"是使用,"1"是禁用),再用ATOI函数将传回的字符串变为整数,存入变量TMP_X,供主程序第14行的IF函数,判断是否需要加上对角线.注意 : 传回值转型后,结果只会是1或0,固不须使用ABS函数取其绝对值
4关括号与1行DEFUN函数左边的开括号对应
第 20 课 <第五篇 横列,直行,空白及文字组件> (第1
节)
横列(row)及直行(column)组件
其实这两个都不算是实体的组件,只是用作指定后续的其它组件的排列格式指定为横列时,则包含在此组件一对大括号中的所有组件,均作水平左至右排列;直行时则呈垂直上至下排列
若不指定组件的排列格式时,则预设为直行格式
若有指定其label属性,则会在外围加上一矩形线框(包含在大括号中间的其它组件则显示在线框中);其属性值则为该线框左上角的标题文字;若不设定则没有线框及标题。

相关文档
最新文档