文档库 最新最全的文档下载
当前位置:文档库 › lisp 对话框

lisp 对话框

lisp 对话框
lisp 对话框

对话框编程

第一篇基本知识 (1)

第二篇开启对话框 (3)

第三篇设定及取得对话框元件内的值 (4)

第四篇按钮及核取框(切换钮) (6)

第五篇橫列,直行,空白及文字元件 (8)

第六篇滑杆(滚动条)元件 (11)

第七篇按钮及影像按钮元件 (12)

第八篇清单选框 (14)

第九篇下拉(弹出)式清单选框 (17)

第十篇选台钮元件 (19)

第十一篇影像及影像框(影像区块)元件 (20)

第十二篇其它元件 (22)

第一篇基本知识

第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 在下拉式列示框中,选取该定义文件中所设定的对话框名称,即可预视对话框;亦可直接输入该对话框的名称(要注意大小写)。

第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,紧接一个以冒号开始的组件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篇的课程后,才能开启及显示该对话框。

第二篇开启对话框

第1节AutoLISP函数

加载DCL定义文件函数 (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

{ 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组件。

注意:在第一个编辑框(输入四边形的阔度)的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

{ "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" //注意设定值为字符串型态,要在前后加双引号

}

}

第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函数左边的开括号,结束整个程序。

第4节AutoLISP函数

组件指定动作 (ACTION_TILE "组件关键词" "指定动作")

例如: (ACTION_TILE "RECT_W" "(SETQ TEMP 1)")

当焦点在指定的组件(关键词)上并按下接受键时,即会执行函数所指定的动作;指定动作会取代定义文件中,该组件的action属性之预设动作;组件关键词"accept"在预设情况下是与确定按钮组件关连(即是确定按钮的预设关键词),"cancel"则与取消按钮组件关连(即是取消按钮的预设关键词)。

终止对话框 (DONE_DIALOG [指定传回值]) 例如:(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"))))

)

主程序(RECT)说明:○1注意将LOAD_DIALOG函数所加载的对话框定义档改为RECT4.DCL ;○2-○4参阅RECT3程序的说明;○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函数左的开括号。

第四篇按钮及核取框(切换钮)

第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

第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 height fixed_width fixed_heigth

第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;

}

定义说明:○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组件。

程序文件

将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"))) ;取得切换钮的状态

)

主程序(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函数左边的开括号对应。

第五篇橫列,直行,空白及文字元件

第1节

横列(row)及直行(column)组件其实这两个都不算是实体的组件,只是用作指定后续的其它组件的排列格式;指定为横列时,则包含在此组件一对大括号中的所有组件,均作水平左至右排列;直行时则呈垂直上至下排列;若不指定组件的排列格式时,则预设为直行格式;若有指定其label属性,则会在外围加上一矩形线框(包含在大括号中间的其它组件则显示在线框中);其属性值则为该线框左上角的标题文字;若不设定则没有线框及标题。

:row :column

{ 其它组件或属性 { 其它组件或属性

} }

属性alignment fixed_height fixed_width height width label

框列(boxed_row)及框行(boxed_column)组件不论是否设定其label属性,均有矩形的线框包含中间的各个组件;若不设定此属性,则没有标题显示在线框的左上角

:boxed_row :boxed_column

{ 其它组件或属性 { 其它组件或属性

} }

属性与横列及直行相同

第2节空白(spacer)组件

可在对话框中加入空白组件,使其它组件移位,增加空间,美化对话框等作用;空白组件有下列3种:○1若不设定属性时,则不需在组件名称前加冒号,亦不需一对大括号,但需要在组件的名称后面加上分号;○2组件spacer在不设定其属性时,在垂直方向(直行)为半个字符高度;组件spacer_1则一个字符高度○3组件spacer_0在不设定其属性时,其高度为0,但夹在其它横向排列的组件中时,会自动扩大并与相邻的组件同高同阔。

:spacer :spacer_0 :spacer_1

{ 属性=属性值; { 属性=属性值; { 属性=属性值;

} } }

属性alignment fixed_heigh fixed_width height width

练习 (Exercises)

在RECT对话框内,使两个按钮(Enable及Disable)水平排列在同一横列上,并增加空间使两按钮臵中如下图:

定义档将RECT5.DCL复制至RECT6.DCL,修改的定义如下:

程序文件将RECT5.LSP复制至RECT6.LSP,程序中只须修改加载的定义档名称

RECT:dialog

{ label="Rectangle" ;

:edit_box

{ label="Rectangle width : " ;

key="RECT_W" ;

edit_limit=16;

edit_width=10;

fixed_width=true;

value="50.0"

}

:edit_box

{ label="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" ;

}

:row //新增的横列组件

{ spacer_0; //开大括号及空间组件

:button

{ label="&Enable" ;

key="RECT_E" ;

width=10;

fixed_width=true;

}

spacer_0; //开大括号及空间组件

:button

{ label="&Disable" ;

key="RECT_D" ;

width=10;

fixed_width=true;

}

spacer_0; //开大括号及空间组件

} //横列的关括号

ok_only;

}

定义说明:○1至○2定义对话框名称;定义dialog组件及其属性;○3至○10定义输入阔度的编辑框(关键词RECT_W)及其属性;○11至○18定义输入高度的编辑框(关键词RECT_H)及其属性;○19至○22定义切换钮(关键词RECT_X)及其属性;○23定义一个不设属性的横列row组件;○24横列组件的开大括号,以包含其它的组件;设定空间组件spacer_0,使第一个按钮左边的空间自动扩阔;○25至○30设定按钮(关键词RECT_E)组件及其属性;○31设定空间组件spacer_0,使两个按钮中间的空间自动扩阔;○32至○37设定按钮(关键词RECT_D)组件及其属性;○38设定空间组件spacer_0,使第二个按钮右边的空间自动扩阔;○39关大括号是对应第24行的开大括号,该对大括号同属于第23行的横列组件;使包含在中间的两个按钮组件会水平排列显示;○40显示一个确定按钮;○41关大括号是对应第2行的开大括号,该对大括号同属于第1行的dialog组件。

第3节

字符串组件(text)在对话框中显示一列文字;在label属性值的字符串中,可以使用以下之特殊符号:\" 显示双引号 \t 使文字跳至下一个定位点

\n 使文字符串换行 \\ 注意这个不是批注符号,它可以在字符串中加上反斜线:text

{ 属性="属性值" ;

}

属性 is_bold 若设定其属性值为true,则文字以粗体显示;若为false则正常显示

其它属性alignment fixed_width fixed_height width

height key label value

字符串组件(text_part)其组件的字符串形式不同于字符串组件text,在组件中的宇串,其边距(margin)为0;当要将多个组件并合成新字符串时,中间不会有多余的空间;组件亦是组成文字段落组件paragraph及单列字符串组组件concatenation的元素。

:text_part

{ 属性="属性值" ;

}

属性 alignment fixed_width fixed_height width height label

第4节

文字段落组件(paragraph)可由上一课的字符串组件text及字符串组件text_part组合而成;一般用于组合静态(不会动态更改)的文字符串。

:paragraph

{ 属性="属性值" ; //文字段落组件的属性

:字符串组件或字符串组件

{ 属性="属性值" ; //字符串组件或字符串组件的属性

}

}

属性 action alignment fixed_width fixed_height height width is_cancel is_default is_enabled is_tab_stop key cabel mnemonic

拼接文字组件(concatenation) 可由上一课的字符串组件text及字符串组件text_part组合而成;一般用于组合随时更新的文字符串。

:concatenation

{ 属性="属性值" ; //拼接文字组件的属性

:字符串组件或字符串组件

{ 属性="属性值" ; //字符串组件或字符串组件的属性

}

}

属性 action alignment fixed_width fixed_height height width is_cancel is_default is_enabled is_tab_stop key cabel mnemonic

注意:在上述"文字段落"组件及"拼接文字"组件中,若设定其label属性,则会以线框包围其中所组成的文字,而label属性的设定值会成为线框标题文字。

第六篇滑杆(滚动条)元件

第1节滑杆(滚动条)组件(slider)

使用者可使用鼠标拖曳滑杆中的方块,或点选滑杆左右两边的箭头,选取在指定范围内的值;滑杆水平放臵时,数值自左向右增加;垂直放臵时,数值由底向顶增加。

:slider

{ 属性="属性值" ;

}

属性 value 设定滑杆组件的初始值

big_increment 控制滑杆移动时的增量,默认值为整个范围值(min_value至max_value)的10份1

small_increment 控制滑杆移动时的增量,默认值为整个范围值(min_value至max_value)的100份1 max_value 设定滑杆组件范围值的最大值 min_value 设定滑杆组件范围值的最小值

layout 设定滑杆组件是水平放臵(horizontal)还是垂直放臵(vertical),预设为水平放臵其它属性 action alignment key mnemonic fixed_width fixed_height

width height label

第2节练习(Exercises)

建立新的对话框定义档PGON.DCL,存在C盘的根目录中,在对话框顶部有一编辑框,初始值为10;中间为一滑杆,范围值从1至20,下边有一消息正文显示滑杆的选取值。当移动滑杆时,上边编辑框的内容,及下边的讯息会跟随改变;在更改编辑框的内容后(按ENTER),滑杆及讯息亦会随之改变PGON:dialog

{ label="Polygon" ;

:edit_box //编辑框组件

{ label="Polygon edge :" ;

key="PGON_E" ;

edit_limit=2;

edit_width=2;

fixed_width=true;

value=10;

}

spacer; //空间组件

:slider //滑杆组件

{ key="PGON_S" ;

min_value=1;

max_value=20;

big_increment=2;

small_increment=1;

value=10;

width=25;

fixed_width=true

}

:concatenation //拼接组件

{ :text_part //文字组件

{ label="Drawn a" ;

}

:text_part //文字组件

{ label="10" ;

key="PGON_T" ;

}

:text_part //文字组件

{ label="edge polygon" ;

}

}

ok_only;

}

定义说明:○1定义对话框名称为PGON,以冒号开始dialog组件;○2dialog组件的开大括号;设定其

label属性(对话框标题列)为"Polygon";○3至○10设定一编辑框,其关键词为PGON_E,并以value属性设定其初始值为10 ;○11设定一空间组件spacer,以增加编辑框与下面的滑杆之垂直距离;○12以冒号开始,设定一滑杆组件slider ;○13滑杆组件的开大括号,设定滑杆属性key的操作关键词为PGON_S ;○14○15设定滑杆范围的最小值(属性min_value)为1,最大值(属性max_value)为20 ;○16○17设定滑杆的增量,大幅移动(属性big_increment)时为2,小量移动(属性small_increment)时为1 ;○18用属性value设定滑杆显示的初始值为10 ;○19○20设定滑杆的阔度(属性width),并以固定的阔度(属性fixed_width)显示;○21关大括号是对应第13行的开大括号,这对大括号同属于第12行的滑杆组件;○22以冒号开始,设定一拼接文字concatenation组件;○23属于拼接组件的开大括号;以冒号开始,设定第一个文字组件text_part ;○24属于第一个文字组件的开大括号;并以label属性设定组件所显示的文字讯息;○25关大括号是对应上一行的开大括号,这对大括号同属于第23行的文字组件;○26以冒号开始,设定第二个文字组件text_part ;○27属于第二个文字组件的开大括号;并以label属性设定组件所显示的初始文字讯息;○28用key属性设定此文字组件的操作关键词为PGON_T。注意:上一个及下一个文字组件,因为不需在程序中动态修改其内容,固不需设定其关键词;○29关大括号是对应第27行的开大括号,这对大括号同属于第26行的文字组件;○30以冒号开始,设定第三个文字组件text_part ;○31属于第三个文字组件的开大括号;并以label属性设定组件所显示的文字讯息;○32关大括号是对应上一行的开大括号,这对大括号同属于第30行的文字组件;○33关大括号是对应第23行的开大括号,这对大括号同属于第22行的拼接文字concatenation组件;○34定义一个确定钮;○35最后一行的关大括号是对应第2行的开大括号,这对大括号同属于第1行的dialog组件。

建立新的程序文件PGON.LSP,存在C盘的根目录;程序代码如下:

(DEFUN C:PGON() (SETQ DCL_ID (LOAD_DIALOG "C:/PGON.DCL"))

(NEW_DIALOG "PGON" DCL_ID)

(ACTION_TILE "PGON_E" "(SETQ TMP1 (GET_TILE \"PGON_E\"))

(SET_TILE \"PGON_S\" TMP1)(SET_TILE \"PGON_T\" TMP1)")

(ACTION_TILE "PGON_S" "(SETQ TMP1 (GET_TILE \"PGON_S\"))

(SET_TILE \"PGON_E\" TMP1)(SET_TILE \"PGON_T\" TMP1)")

(ACTION_TILE "accept" "(SETQ TMP (ATOI (GET_TILE \"PGON_S\")))(DONE_DIALOG)") (START_DIALOG)(UNLOAD_DIALOG)

(COMMAND "POYLGON" TMP)

(PRINC))

程序说明:○1用DEFUN函数设定程序名称;用LOAD_DIALOG函数加载对话框定义文件,并将传回的档案处理码存入变量DCL_ID;○2用NEW_DIALOG函数将定义文件(变量DCL_ID储存定义文件的处理码)中,指定的对话框(名称为PGON)显示;○3用ACTION_TILE函数,设定编辑框(关键词PGON_E)的动作(为字符串型态) :先以GET_TILE函数取得编辑框的输入值,再用SETQ函数将输入值存入变量TMP1里;○4为第3行ACTION_TILE 中,指定动作的延续,因字符串过长而要分行(亦可将此行连接于第3行的末端),使用SET_TILE函数,将变量TMP1(储存了编辑框的输入值),设定给滑杆(关键词PGON_S)及文字讯息(关键词PGON_T),以更新组件的当前值;○5用ACTION_TILE函数,设定滑杆(关键词PGON_S)的动作(为字符串型态) :先以GET_TILE函数取得滑杆的设定值,再用SETQ函数将设定值存入变量TMP1里;○6为第5行ACTION_TILE中,指定动作的延续,因字符串过长而要分行(亦可将此行连接于第5行的末端),使用SET_TILE函数,将变量TMP1(储存了滑杆的设定值),设定给编辑框(关键词PGON_E)及文字讯息(关键词PGON_T),以更新组件的当前值;○7使用ACTION_TILE函数设定关键词为accept的组件(预设为确定钮)的指定动作:先以GET_TILE函数取得滑杆(关键词PGON_S)的设定值,因为传回值为字符串型态,所以要用ATOI函数转为整数,再用SETQ函数将该数值存入变量TMP ;○8用START_DIALOG函数启动对话框并接受使用者输入;以UNLOAD_DIALOG函数结束对话框并释放内存;○9用COMMAND函数,执行POLYGON指令并以变量(滑杆的设定值,在第7行中取得)作为封闭多边形的边数;○10以一个不带参数的PRINC函数,抑制多余的传回值及显示;最右边的关括号,是对应第1行DEFUN函数左边的开括号。

注意:程序中并没有对编辑框的输入值进行检查,固可能会发生输入值超出滑杆的范围值(小于1或大于20,或有小数字等问题),而产生错误。

第七篇按钮及影像按钮元件

第1节

自订按钮巳在第4篇课程中介绍过,在这一篇课程将介绍对话框中,其它有特定功能的按钮组件如下,其属性亦与自订按钮类似。

确定钮(ok_button)(on_only) 在一个对话框中,应最少提供一个确定钮或取消钮,以结束对话框;如果在对话框中,没有规划预设按钮组件,则确定钮会自动成为对话框的预设按钮。

取消钮(cancel_button)在一个对话框中,应最少提供一个确定钮或取消钮,以结束对话框;此按钮亦可按ESCAPE键启动。

说明钮(help_button)是一种可按F1键启动的按钮,用以启动辅助说明;在执行指定动作后,对话框

亦不会关闭。

信息钮(info_button)一般用以启动版本及版权的说明,或作者数据等;在执行指定动作后,对话框亦不会关闭。

预设按钮(default_button)一般在预设的情况下,确定按钮即为对话框的预设按钮(在预设按钮上,会以虚线包围按钮的提示文字;要更改其它按钮为预设按钮,可以在定义文件中,设定该组件的属性is_default为true,要注意在一个对话框中,只能有一个组件为预设按钮。

确定钮 + 取消钮(ok_cancel)

确定钮 + 取消钮 + 说明钮(ok_cancel_help)

确定钮 + 取消钮 + 说明钮 + 信息(ok_cancel_help_info)

第2节练习(Exercises)

使用第1篇课程的RECT.DCL定义档,并使用第2篇课程的RECT.LSP程序文件启动,在定义档中,以上一课不同的按钮组件代替定义文件中的确定钮组件,即可显示不同形式按钮的对话框,如下各图:

第3节影像按钮组件(image_button)

特点是以影像代替按钮中的文字

:image_button //组件名称

{ 属性="属性值" ;

}

属性allow_accept 属性值可设定为true或false;若设定为true,当使用者按下接受键时,将自动选择预设按钮

aspect_ratio 固定图像的长阔比,其设定值为实数,没有默认值;若设定为0,则组件将依图像的尺寸显示;color 属性值为整数或保留字,默认值为white(颜色编号7);颜色的设定值如下:

dialog_line 目前对话框的线条颜色; dialog_foreground 目前对话框的前景颜色(文字)

dialog_background 目前对话框的背景颜色; graphics_background AutoCAD绘图屏幕目前颜色black 黑色(颜色编号0) red 红色(颜色编号1) yellow 黄色(颜色编号2)

green 绿色(颜色编号3) cyan 浅蓝色(颜色编号4) blue 蓝色(颜色编号5)

magenta 紫色(颜色编号6) white 白色(颜色编号7)

其它属性 action alignment is_enable label mnemonic fixed_width

fixed_height width height is_tab_stop key

第4节练习(Exercises)

建立新的对话框定义档,命名为IMG.DCL,存在C盘的根目录中;在里面定义两个不同颜色的影像按钮,及一个确定按钮。

IMG:dialog

{ label="Image" ;

:row //横列组件

{ :image_button //影像按钮组件

{ key="IMG1" ;

width=6;

height=3;

fixed_width=true;

fixed_height=true;

color=2;

allow_accept=true;

}

:image_button //影像按钮组件

{ key="IMG2" ;

width=6;

height=3;

fixed_width=true;

fixed_height=true;

color=2;

allow_accept=true;

}

}

ok_only

}

定义说明:○1定义对话框名称为IMG,以冒号开始设定dialog组件;○2开大括号属于第1行的dialog 组件;设定对话框的属性label(对话框的标题);○3以冒号开始,建立一横列row组件,使当中包含的两个影像按钮呈水平排列;○4开大括号属于上一行的横列组件;以冒号开始,建立一影像按钮image_button ;○5开大括号属于上一行的影像按钮组件;并设定其属性key(操作关键词)为IMG1 ;○6○7设定影像按钮的高度(属性height)及阔度(属性width);○8○9设定影像按钮以固定的高度(属性fixed_height)及固定的阔度(属性fixed_width)显示;○10设定影像按钮显示黄色(颜色编号2,属性color);○11设定属性allow_accept 为true,当使用者按下接受键时,等于选择了预设按钮;○12关大括号是对应第5行的开大括号,此对大括号同属于第4行的影像按钮组件;○13至○21与第一个影像按钮类似(9至12行),都是定义一个影像按钮;但其操作关键词(key属性)为IMG2,显示颜色为绿色(color属性,颜色编号3);○22关大括号是对应第4行的开大括号,此对大括号同属于第3行的横列row组件;○23设定一个确定按钮以结束对话框;○24关大括号是对应第2行的开大括号,此对大括号同属于第1行的dialog组件。

建立新的程序文件IMG.LSP,存在C盘的根目录中;当使用者选取了对话框中的颜色按钮后,使用COLOR 指令设定为使用者所选择的颜色。程序代码如下:

(DEFUN C:IMG( ) (SETQ DCL_ID (LOAD_DIALOG "C:/IMG.DCL") TMP 1)

(NEW_DIALOG "IMG" DCL_ID)

(ACTION_TILE "IMG1" "(SETQ TMP 1)")

(ACTION_TILE "IMG2" "(SETQ TMP 0)")

(START_DIALOG)(UNLOAD_DIALOG DCL_ID)

(IF (= TMP 1)(COMMAND "COLOR" "YELLOW")

(COMMAND "COLOR" "GREEN"))

(PRINC))

程序说明:○1以DEFUN函数定义程序的名称为IMG,使用LOAD_DIALOG函数将对话框定义文件IMG.DCL 载入;并将传回的档案处理码,用SETQ函数存入变量DCL_ID中;并设定变量TMP的初值为1 ;○2使用NEW_DIALOG函数显示定义文件中(变量DCL_ID储存了档案处理码),指定的对话框IMG ;○3使用ACTION_TILE 函数,设定第一个影像按钮组件(关键词IMG1)的执行动作:将变量TMP设定为1 ;○4使用ACTION_TILE 函数,设定第二个影像按钮组件(关键词IMG2)的执行动作:将变量TMP设定为0 ;○5使用START_DIALOG 函数,使对话框开始作用并接受使用者输入;使用UNLOAD_DIALOG函数以结束对话框并释放内存;○6○7使用IF函数判断变量TMP是否等于1;若是则以COMMAND函数,执行COLOR指令,设定目前使用的颜色为黄色,否则设定为绿色;○8用一个不带参数的PRINC函数,抑制多余的传回值及显示;最右边的关括号是对应第1行DEFUN函数左边的开括号。

第八篇清单选框

第1节清单选框组件(list_box)

因为对话框内的空间有限,当有很多同类的项目可供选取时,即可使用此组件;若选框内的项目多于选框的高度时,选框的右边会出现滚动条,使选框内的选项可以上下卷动。

:list_box //组件名称

{ 属性="属性值" ;

}

属性 label 其设定值为字符串,会显示在选框的左上角;

list 其设定值为字符串,其内容即为选框中的项目;字符串中每个项目需以\n换行符号分隔,例如:"幕墙\n梗窗\n趟窗\n趟门\n百页窗";选框中的项目,亦可使用AutoLISP程序动态设定,见本篇的范例multiples_select 可设定为true或false;若设定为true,则使用者可以同时在选框中选取多个项目;

value 设定选框显示时,预设选取项目的索引值(为字符串型态);选框中第一个选项,其索引值为0,其它依次递增。

其它属性 action alignment allow_accept key mnemonic width

height fixed_width fixed_heigth tabs is_enable is_tab_stop

第2节AutoLISP函数

开始处理清单选框或弹出式选框 (START_LIST "组件关键词" [选项 [索引值]])

例如: (START_LIST "LBOX_L" 3 0)

组件关键词是在组件定义中,以属性key设定的属性值;选项为一运作模式整数,其设定值如下:

1、变更指定索引值的项目

2、附加新的项目

3、删除旧的项目并建立新的项目(默认值);

指定后续ADD_LIST函数所变更的项目之索引值;索引值为整数,并从0(表示选框中第一个项目)开始;若不指定索引值,函数会拒绝处理变更项目的操作

结束选框的处理 (END_LIST) 不须提供任何参数;与上述的START_LIST函数一并使用

加入或修改选框中的项目 (ADD_LIST "字符串") 例如: (ADD_LIST "幕墙")

使用此函数之前,必须先以START_LIST函数开启所要操作的组件(关键词);函数会将字符串加入至指定的选框组件中。

第3节练习(Exercises)

这是一个较为复杂的对话框设计,但亦是一个非常实用的程序;在对话框定义文件中,有一个清单选框,会显示出指定档案的内容(全是中文字);当使用者选取清单中的项目时,该项目的中文字便会显示在下面的编辑框里(加在原有字符串的后面);当按下确定钮时,对话框结束,并使用TEXT指令将编辑框内的文字插入至绘图屏幕上。

注意:程序另须建立一纯文字文件(名称为TEXT1.TXT,存在C盘根目录),其内容可自订一些常用的中文字,每行文字不宜过长;而每行文字即成为选框中的一个项目;在插入中文字之前,必须先行设定中文字的样式。建立新的对话框定义档LBOX.DCL,存在C盘的根目录中,其定义如下:

LBOX:dialog

{ label="Create chinese" ;

:list_box //清单选框组件

{ label="中文字" ;

key="LBOX_L" ;

width=25;

height=8;

fixed_width=true;

fixed_height=true;

}

:edit_box //编辑框组件

{ label="中文字" ;

key="LOBX_E" ;

width=25;

fixed_width=true;

}

ok_cancel

}

定义说明:○1定义对话框名称为LBOX,以冒号开始设定dialog组件;○2开大括号属于上一行的dialog 组件,属性label的设定值会显示在对话框的标题列;○3以冒号开始,设定一个清单选框list_box组件;○4开大括号属于上一行的清单选框组件,其属性label的设定值会显示在选框的左上角;○5以key属性设定清单选框组件的操作关键词为LBOX_L ;○6○7设定清单选框组件的阔度(属性width)及高度(属性height);○8○9设定清单选框组件以固定的阔度(属性fixed_width)及固定的高度(属性fixed_height)显示;○10关大括号是对应第4行的开大括号,此对大括号同属于第3行的清单选框组件;○11以冒号开始,设定一个编辑框组件;○12开大括号属于上一行的编辑框组件,属性label的设定值会显示在编辑框的左边;○13以key属性设定编辑框组件的操作关键词为LBOX_E ;○14以width属性设定编辑框组件的阔度;○15将fixed_width属性设定为true,使编辑框以固定的阔度显示;○16关大括号是对应第12行的开大括号,此对大括号同属于第11行的编辑框组件;○17在对话框的底部设定一确定钮及取消钮,以结束对话框;○18关大括号是对应第2行的开大括号,此对大括号同属于第1行的dialog组件。

建立新的程序文件LBOX.LSP,存在C盘的根目录中,其中包含一个主程序和两个辅助程序。主程序的程序代码如下:

(DEFUN C:LBOX () (SETQ DCL_ID (LOAD_DIALOG "C:/LBOX.DCL") CHK 0)

(NEW_DIALOG "LBOX" DCL_ID)

(ADDL)

(ACTION_TILE "LBOX_L" "(SETQ TMP_R (ATOI (GET_TILE \"LBOX_L\")))(SETC)")

(ACTION_TILE "accept" "(SETQ CHK 1

TMP_S (GET_TILE \"LBOX_E\"))(DONE_DIALOG)")

(START_DIALOG) (UNLOAD_DIALOG DCL_ID)

(IF (= CHK 1)

(COMMAND "TEXT" (GETPOINT \"Select text insert point :") "0" TMP_S) )

(PRINC))

主程序(LBOX)说明:○1用DEFUN函数设定程序名称为LOBX;用LOAD_DIALOG函数加载指定的对话框定义档,并将传回的档案处理码存入变量DCL_ID;设定另一变量CHK为0,此变量用于决定使用者是否按下确定钮;○2用NEW_DIALOG函数,显示指定档案(变量DCL_ID储存定义文件的处理码)里的LBOX对话框;○3执行ADDL辅助程序(作用是开启并读取档案中的各行字符串,并加进清单选框中);○4用ACTION_TILE函数,设定选取清单选框组件(关键词LBOX_L)中项目的指定动作:先以GET_TILE函数取得清单中的选项之索引号(字

符串型态),用ATOI函数转为整数型态,再用SETQ函数存入变量TMP_R;最后执行SETC辅助程序(取得档案中对应行号的字符串,并显示在编辑框中);○5用ACTION_TILE函数,设定关键词"accept"的组件(预设为确定钮)的动作:先用SETQ函数,设定变量CHK为1(在结束对话框后建立文字);○6为第5行ACTION_TILE 函数的延续:用GET_TILE函数取得编辑框(关键词LBOX_E)的内容,存入变量TMP_S;再以DONE_DIALOG函数结束对话框;○7用START_DIALOG函数启动对话框并开始接受使用者输入;以UNLOAD_DIALOG函数结束对话框并释放内存;○8用IF函数检查变量CHK是否等于1(使用者按下确定钮,在第5行设定);若变量等于1,执行下一行的指令;○9用COMMAND函数,执行TEXT指令其插入点以GETPOINT函数取得;文字的角度为0,字符串为变量TMP_S(在第6行的确定按钮动作中取得);○10关括号是关闭第8行的IF函数;○11以一个不带参数的PRINC函数,抑制多余的传回值及显示;最右边的关括号,是对应第1行DEFUN函数左边的开括号。

辅助程序ADDL的程序代码如下:

(DEFUN ADDL() (SETQ F_ID (OPEN "C:/TEXT1.TXT" "r"))

(SETQ TMP_T (READ-LINE F_ID) TMP_L (LIST ""))

(WHILE (/= TMP_T NIL)

(SETQ TMP_L (APPEND TMP_L (LIST TMP_T)))

(SETQ TMP_L (READ-LINE F_ID))

)

(CLOSE F_ID)

(SETQ TMP_L (LIST (CDR TMP_L)))

(START_LIST "LBOX_L" 3 0)

(MAPCAR 'ADD_LIST (CAR TMP_L))

(END_LIST))

辅助程序(ADDL)说明:○1用DEFUN函数设定程序名称为ADDL;用OPEN函数开启指定的纯文字文件,开启模式为"r"(读取),将传回的档案处理码,用SETQ函数存入变量F_ID ;○2用READ-LINE函数读取档案(变量F_ID储存的档案处理码)里,第1行的字符串,存入变量TMP_T;再将一空的串行,存入变数TMP_L ;

○3以WHILE函数设定循环的开始;进入循环的条件为变量TMP_T(从档案中读取的字符串)不等于NIL(空值);○4将变量TMP_T(字符串),用APPEND函数,加在第2行所建立的空串行之后;将新串行存回变量TMP_L中,即以新串行(巳增加新的字符串元素)覆盖原有串行;○5使用READ-LINE函数,从档案中(变量F_ID)读取下一行的字符串,存入变量TMP_T中并覆盖原值;○6关括号是对应第3行WHILE函数左边的开括号,以封闭循环;循环会不断执行,直至读取档案中所有字符串;并将巳读取的字符串不断加进变量TMP_L的串行中;○7用CLOSE函数,将指定档案处理码(变量F_ID)的档案关闭;○8用CDR函数,删去串行(变量TMP_L)中第一个元素(空字符串);并将余下的元素存回变量TMP_L覆盖原值;○9用START_LIST函数开始处理指定选框组件(关键词LBOX_L);选项参数3表示删除旧选框中的项目并建立新的选框项目;最后的项目索引值为0,表示选框中第一个项目;○10使用MAPCAR函数,使串行(变量TMP_L)中逐个元素,代入ADD_LIST函数中,作为项目加入选框中;○11以END_LIST函数结束清单选框组件的处理;最右边的关括号是对应第1行DEFUN函数左边的开括号。

辅助程序SETC的程序代码如下:

(DEFUN SETC() (SETQ F_ID (OPEN "C:/TEXT1.TXT" "r"))

(IF (> TMP_R 0)

(REPEAT TMP_R (READ-LINE F_ID)))

(SETQ TMP_S (GET_TILE "LBOX_E"))

(SETQ TMP_S (STRCAT TMP_S (READ-LINE F_ID)))

(CLOSE F_ID)

(SET_TILE "LBOX_E" TMP_S))

辅助程序(SETC)说明:○1用DEFUN函数设定程序名称为SETC;用OPEN函数开启指定的纯文字文件,开启模式为"r"(读取),将传回的档案处理码,用SETQ函数存入变量F_ID ;○2用IF函数检查变量TMP_R是否大于0;若是(表示不是选取了第一个项目)则执行第3行的叙述。注意:变量TMP_R是在主程序第4行中取得的选框索引值,该值表示选取了选框中第几个项目,项目索引号0表示第一个项目,其它依次递增;

○3用REPEAT函数,使其后的READ-LINE函数重复执行TMP_R次,直至读取字符串至所选项目的对上一行 (因为项目索引号从0开始;例如选取第5个项目,REPEAT函数便会重复5次,读取档案中0至4行的字符串);○4使用GET_TILE函数,取得编辑框组件(关键词LBOX_E)目前的内容,存入变量TMP_S ;○5使用READ-LINE 函数,读取档案中的字符串(在第3行中,巳使用REPEAT函数,读取至所选项目的对上一行,再使用此函数读取下一行时,即为所选的项目),并用STRCAT函数与变量TMP_S(在上一行中取得的编辑框内容)合拼为新字符串,存回变量TMP_S中并覆盖原字符串;○5使用CLOSE函数,将指定的档案(变量F_ID为该档案的处理码)关闭;○6使用SET_TILE函数,更新编辑框(关键词LBOX_E)的内容为新合拼的字符串(在第5行中取得)。最右边的关括号,是对应第1行DEFUN函数左的开括号。

提示:如要在显示选框时,设定其中一个项目为预选项目(该项目会反白显示),即可在主程序第3及第4行中间,加入一行如下的叙述: (SET_TILE "LBOX_L" "索引号");此叙述使用SET_TILE函数,并设定组件(关键词)的索引号。注意索引号为字符串型态,要在前后加上双引号;选框中第1个项目其索引号为0,其它依次递增。

第九篇下拉(弹出)式清单选框

第1节下拉式(弹出式)清单选框组件(popup_list)

与上一篇课程的清单选框类似,但在一般情况下,只会显示选框中一个选项;若要显示巳隐藏的整个选框,只要将鼠标移至组件右边的"向下"箭头,并按鼠标左键,即会出现整个选框

:popup_list //组件名称

{ 属性="属性值" ;

}

属性 label 其设定值为字符串,会显示在选框的左上角;

list 其设定值为字符串,其内容即为选框中的项目;字符串中每个项目需以\n换行符号分隔,例如:"幕墙\n梗窗\n趟窗\n趟门\n百页窗";选框中的项目,亦可使用AutoLISP程序动态设定,见上一篇课程的函数介绍及练习

value 设定选框显示时,预设选取项目的索引值(为字符串型态);选框中第一个选项,其索引值为0,其它依次递增

其它属性 action alignment key mnemonic is_tab_stop width height

fixed_width fixed_heigth tabs is_enable edit_width

第2节练习(Exercises)

首先在C盘的根目录中,再增加一个纯文字文件TEXT2.TXT,并自订其内容。在上一篇课程练习的对话框顶部,增加一个下拉式清单选框;其中的选项为两个文字文件的主题,当使用者在选取了项目(档案的主题)后,下面原有的清单选框,即会显示该主题(档案)的选项。复制对话框定义档LBOX.DCL至LBOX1.DCL,在里面增加下拉式清单选框组件如下:

LBOX:dialog

{ label="Create chinese" ;

:popup_list //下拉式清单选框组件

{ label="中文主题" ;

key="LBOX_T" ;

width=25;

fixed_width=true;

list="玻璃门窗\n五金配件" ;

}

:list_box //清单选框组件

{ label="中文字" ;

key="LBOX_L" ;

width=25;

height=8;

fixed_width=true;

fixed_height=true;

}

:edit_box //编辑框组件

{ label="中文字" ;

key="LOBX_E" ;

width=25;

fixed_width=true;

}

ok_cancel

}

定义说明:○1定义对话框名称为LBOX,以冒号开始设定dialog组件;○2开大括号属于上一行的dialog 组件,属性label的设定值会显示在对话框的标题列;○3以冒号开始,设定一个下拉式清单选框popup_list 组件;○4开大括号属于上一行的下拉式清单选框组件,其属性label的设定值会显示在选框的左边;○5以key属性设定下拉式清单选框组件的操作关键词为LBOX_T ;○6○7设定下拉式清单选框组件的阔度(属性width)并以固定的阔度显示(属性fixed_width);○8以list属性设定组件中的各个选项;设定值为字符串型态,每个选项间要以换行符号\n分隔;○9关大括号是对应第4行的开大括号,此对大括号同属于第3行的下拉式清单选框组件。

其余各行为设定清单选框组件,编辑框组件及确定取消钮,与原有的定义相同,不再叙述。

将程序文件LBOX.LSP复制至LBOX1.LSP,其主程序代码如下:

(DEFUN C:LBOX () (SETQ DCL_ID (LOAD_DIALOG "C:/LBOX.DCL") CHK 0)

(NEW_DIALOG "LBOX" DCL_ID)

(ADDL)

(ACTION_TILE "LBOX_T" "(ADDL)") //新增的下拉式选框组件动作

(ACTION_TILE "LBOX_L" "(SETQ TMP_R (ATOI (GET_TILE \"LBOX_L\")))(SETC)") (ACTION_TILE "accept" "(SETQ CHK 1

TMP_S (GET_TILE \"LBOX_E\"))(DONE_DIALOG)")

(START_DIALOG) (UNLOAD_DIALOG DCL_ID)

(IF (= CHK 1)

(COMMAND "TEXT" (GETPOINT \"Select text insert point :") "0" TMP_S) )

(PRINC))

主程序(LBOX)说明:○1至○3设定程序名称,加载及显示对话框定义文件,执行辅助程序ADDL,以设定选框内的选项;因为变量CHK的初始值为0,所以会显示TEXT1.TXT档案的内容;○4在原程序第3第4行中间插入,以ACTION_TILE函数,设定下拉式选框组件(关键词LBOX_T)的动作:执行辅助程序ADDL,重新设定选框中的选项;○5至○7设定选框组件(关键词LBOX_L)及确定钮的动作;○8用START_DIALOG函数启动对话框并开始接受使用者输入;以UNLOAD_DIALOG函数结束对话框并释放内存;○9至○12当使用者按下确定钮时,便在绘图屏幕上插入巳选取的文字,结束程序。

辅助程序ADDL的程序代码如下:

(DEFUN ADDL( ) (IF (= (GET_TILE "LBOX_T") "0") ;检查选择了的主题

(SETQ F_ID (OPEN "C:/TEXT1.TXT" "r")) ;开启档案

(SETQ F_ID (OPEN "C:/TEXT2.TXT" "r"))) ;开启档案

(SETQ TMP_T (READ-LINE F_ID) TMP_L (LIST ""))

(WHILE (/= TMP_T NIL)

(SETQ TMP_L (APPEND TMP_L (LIST TMP_T)))

(SETQ TMP_L (READ-LINE F_ID))

)

(CLOSE F_ID)

(SETQ TMP_L (LIST (CDR TMP_L)))

(START_LIST "LBOX_L" 3 0)

(MAPCAR 'ADD_LIST (CAR TMP_L))

(END_LIST))

辅助程序(ADDL)说明:○1用DEFUN函数设定程序名称;使用GET_TILE函数取得下拉式选框的选取值(传回值为字符串型态),再用IF函数检查是否等于"0"(选择了第一个项目),若是则会执行第2行的叙述,否则执行第3行叙述,以开启不同的文字文件读取数据;○2用OPEN函数开启指定的纯文字文件,开启模式为"r"(读取),将传回的档案处理码,用SETQ函数存入变量F_ID中;○3若选取了第二个项目,则以OPEN函数开启另一档案,并将传回的档案处理码存入变量F_ID中;○4至○13与旧程序相同,主要是重复读取档案中的数据,合拼成一串行,再将串行逐个加入选框内成为选项。

辅助程序SETC的程序代码如下:

(DEFUN SETC() (IF (= (GET_TILE "LBOX_T") "0") ;检查选择了的主题

(SETQ F_ID (OPEN "C:/TEXT1.TXT" "r")) ;开启档案

(SETQ F_ID (OPEN "C:/TEXT2.TXT" "r"))) ;开启档案

(IF (> TMP_R 0)

(REPEAT TMP_R (READ-LINE F_ID)))

(SETQ TMP_S (GET_TILE "LBOX_E"))

(SETQ TMP_S (STRCAT TMP_S (READ-LINE F_ID)))

(CLOSE F_ID)

(SET_TILE "LBOX_E" TMP_S))

辅助程序(SETC)说明:○1至○3设定程序名称,取得下拉式选框的数据,因应使用者的选择而开启不同的档案(与ADDL辅助程序第1至3第行相同);○4至○9重复读取档案的数据,直至使用者选取的选项为止,并将取得的数据加在编辑框原有字符串的后面。

注意:○1在两个辅助程序中,取得下拉式选框的传回值,只有两个可能性,固以IF函数判断即可;但若有很多个可能的传回值(即要开启多个档案)时,应以COND函数作多重判断;○2因为范例中只开启2个纯文字文件,所以在下拉式选框组件的定义中,直接以属性设定其选项,比较直接及快捷;但若有很多的纯文字文件,或会动态增减档案的数量时,则应以清单选框组件同样的方式,以AutoLISP函数动态将选项加入选框;○3亦可以在主程序(LBOX)的开头,即先行读取两个档案中的数据,形成串行并存入不同的变量中,供辅助程序(ADDL)使用;这样就不须在辅助程序中,每次都开启档案,又重新再次读取数据形成串行。

第十篇选台钮元件

第1节

选台钮组件(radio_button) 此组件的特点是"多选一",即在同一组的选台钮中,使用者只能选取其中一个选项。

:radio_button //组件名称

{ 属性="属性值" ;

}

属性 label 显示在选台钮右边的提示文字

value 设定选台钮是否被选取(被选取设定值为1,否则为0);要注意在同一组的选台钮中,只可有一个选台钮被设为选取(设定为1)。

其它属性 action alignment is_enable is_tab_stop mnemonic width

height fixed_width fixed_heigth key

选台钮列(radio_row)选台钮行(radio_column)选台钮列会使包含在其中的一组选台钮呈水平排列,选台钮行中的选台钮则为垂直排列;其实这两个组件与横列组件(row,水平排列)及直行组件(column,垂直排列)相似,其属亦相同;请参阅第5篇课程的介绍;若有设定其label属性,则该组选台钮会以线框包围,而属性值则会显示在线框的左上角。

框选台钮列(boxed_radio_row)框选台钮行(boxed_radio_column)与选台钮行及选台钮列相似,但不论是否有设定其label属性,均以线框包围当中的一组选台钮;若有设定label属性,其设定值会显示在线框的左上角。

第2节练习(Exercises)

建立新的对话框,当中有三个选台钮及一个确定取消钮;当使用者选取不同的选取钮,便可以选择以不同的边数绘画封闭多边形。建立新的对话框定义档,命名为PGON1.DCL,存在C盘的根目录中,其定义如下:PGON:dialog

{ label="Polygon" ;

:radio_row //建立选台钮列组件

{ label="Polygon edge" ;

:radio_button //第一个选台钮

{ label="Tiangle" ;

key="PGON_1" ;

value=1;

}

:radio_button //第二个选台钮

{ label="Square" ;

key="PGON_2" ;

value=0;

}

:radio_button //第三个选台钮

{ label="Hexagonal" ;

key="PGON_3" ;

value=0;

}

} //结束选台钮列

spacer; //空间组件

ok_cancel; //确定取消钮

}

定义说明:○1定义对话框名称为PGON,以冒号开始设定一个dialog组件;○2开大括号属于上一行的dialog组件,属性label的设定值会显示在对话框的标题列;○3以冒号开始,建立一个选台钮列组件radio_row,使包含其中的选台钮以水平方向排列;○4开大括号属于上一行的选台钮列组件,属性label的设定值会显示在线框的左上角;○5以冒号开始,建立第一个选台钮组件radio_button ;○6开大括号属于上一行的选台钮组件,属性label的设定值会显示在选台钮的右边;○7用key属性,设定此选台钮的操作关键词为PGON_1 ;○8设定此选台钮的value属性为1;表示当对话框显示时,自动选取(预设)此选台钮;○9关大括号是对应第6行的开大括号,此对大括号同属于第5行的选台钮组件;○10至○14设定第二个选台钮,其操作关键词(属性key)为PGON_2,属性value为0(不选取);○15至○19设定第三个选台钮,其操作关键词(属性key)为PGON_3,属性value为0(不选取);○20关大括号是对应第4行的开大括号,此对大括号同属于第3

行的选台钮列组件;○21用一个空间组件spacer,使选台钮列与下面的按钮,增加垂直距离;○22建立一个确定及取消钮,以结束对话框;○23关大括号对应第2行的开大括号,此对大括号同属于第1行的dialog组件。

建立新的程序文件,名称为PGON1.LSP,存在C盘的根目录中,其程序代码如下:

(DEFUN C:PGON() (SETQ DCL_ID (LOAD_DIALOG "C:/PGON1.DCL") CHK 0)

(NEW_DIALOG "PGON" DCL_ID)

(ACTION_TILE "accept" "(SETQ CHK 1)(S_PGON)(DONE_DIALOG)")

(START_DIALOG)(UNLOAD_DIALOG)

(IF (= CHK 1) (COMMAND "POLYGON" TMP))

(PRINC))

(DEFUN S_PGON () (COND ((= (GET_TILE "PGON_1") "1") (SETQ TMP 3))

((= (GET_TILE "PGON_2") "1") (SETQ TMP 4))

((= (GET_TILE "PGON_3") "1") (SETQ TMP 6)))

)

主程序(PGON)说明:○1DEFUN函数设定程序名称;用LOAD_DIALOG函数将对话框定义文件载入,并将传回的档案处理码,以SETQ函数存入变量DCL_ID;设定另一变量CHK为0,当使用者按下确定钮时(第3行)即更改为1 ;○2用NEW_DIALOG函数,将指定档案中(变量DCL_ID)的PGON对话框显示;○3用ACTION_TILE 函数,设定当使用者按下确定钮(关键词accept)的动作:以SETQ函数将数数CHK设定为1,再执行S_PGON 辅助程序,最后以DONE_DIALOG函数结束对话框;○4用START_DIALOG函数启动对话框并开始接受使用者输入;以UNLOAD_DIALOG函数结束对话框并释放内存;○5用IF函数检查变量CHK是否等于1(按下确定钮);若是则以COMMAND函数执行POLYGON指令,绘画多边形,其边数以变量TMP(在辅助程序中取得)设定;○6以一个不带参数的PRINC函数,抑制多余的传回值及显示;最右边的关括号,是对应第1行DEFUN函数左边的开括号。

辅助程序(S_PGON)说明:○1以DEFUN函数设定程序名称;用GET_TILE函数取得第一个选台钮(关键词PGON_1)的设定值,并以多重检查COND函数,检查其传回值是否等于"1"(使用者选取了该钮),若是则以SETQ 函数,设定变量TMP为多边形的边数;○2○3检查其余两个选台钮的设定值,若其值为"1",则以SETQ函数,设定变量TMP为多边形的边数;○4关括号是对应第1行DEFUN函数左边的开括号。

第十一篇影像及影像框(影像区块)元件

第1节影像(image)及影像框(影像区块,image_block)组件

可以显示AutoCAD的幻灯片(扩展名为SLD),影像组件只为显示图形之用,使用者不能使用鼠标选取。

:image //组件名称

{ 属性="属性值" ;

}

属性 aspect_ratio 固定图像的长阔比,其设定值为实数,没有默认值;若设定为0,则组件将依图像的实际尺寸显示;

Color 属性为整数或保留字,默认值为while(颜色编号7);其它颜色的设定值请参阅第5篇课程;

其它属性 action alignment label key value width height

fixed_width fixed_heigth mnemonic is_enable is_tab_stop

第2节AutoLISP函数

在对话框中取得影像框的阔度 (DIMX_TILE "组件关键词") 例如: (DIMX_TILE "IMG_L") 组件关键词是在组件定义中,以属性key设定;函数的传回值可作为FILL_IMAGE及SLIDE_IMAGE函数的参数。

在对话框中取得影像框的高度 (DIMY_TILE "组件关键词") 例如: (DIMY_TILE "IMG_L") 请参阅DIMX_TILE函数的说明

开始在组件中建立影像 (START_IMAGE "组件关键词") 例如: (START_IMAGE "IMG_L")

在使用FILL_IMAGE,SLIDE_IMAGE及END_IMAGE等函数前,必须先执行此函数;如果函数成功的话,会传回指定的关键词,否则传回NIL;不要在SET_TILE函数中使用START_IMAGE及END_IMAGE函数。

结束元的影像建立 (END_IMAGE)

不须提供任何参数,必须与SLIDE_IMAGE函数配合使用;传回值永远是NIL

在影像框中绘制一个填满的矩形 (FILL_IMAGEX坐标 Y坐标阔度高度颜色)

例如: (FILL_IMAGE 0 0 阔度变量高度变量 -2)

X及Y坐标为矩形框的左上角位臵,必须为正值;如果函数成功的话,会传回指定的关键词,否则传回NIL 填满区域的阔度及高度,以像素为单位,并相对于X及Y坐标;阔度一般以DIMX_TILE函数取得,而高度则以DIMY_TILE函数取得;传回值为填满区域的颜色整数值;颜色可以是AutoCAD的颜色号码,或下列其中

AutoLISP-程序创建过程

AutoCAD开发VisualLISP程序 本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCAD中的加载和运行的方法。 首先来创建一个最简单的LISP程序—-“Hello.lsp”,在AutoCAD2002中加载并运行该程序,将会在命令行出现-“Hello,VisualLISP!”。 VisualLISP与AutoCAD的通信 用户可以直接在AutoCAD命令行中键入AutoLISP表达式。AutoCAD通过括号来确认AutoLISP表达式。AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。 注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。 此外,在AutoCAD中调用并执行AutoLISP程序。在AutoLISP程序中采用COMMAND函数来与AutoCAD命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。 实例:最简单的LISP程序——“Hello.lsp” Step1创建新文件 (1)运行AutoCAD2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vlisp”命令进入VisualLISP环境。

(2)单击“Standard(标准)”工具栏中的按钮,新建一个LISP文件。Step2输入代码并保存文件 (1)在编辑窗口中输入源文件“Hello.lsp”的代码。程序清单如下:;;;* Hello.lsp – Visual LISP文件实例 (prompt "Pick point:") ;指定运行时的提示信息 (setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量“ipt” (setq hgt 15) ;给变量“hgt”赋值 (Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!"); 调用“Commnad”函数与AutoCAD进行通信 (2)单击“Standard(标准)”工具栏中的按钮,以“Hello.lsp”为名保存该文件。 Step3运行LISP程序 (1)确认编辑窗口处于前台状态,选择菜单【Tools(工具)】→【LoadTextinEditor(加载编辑器中的文字)】,则该程序被加载并运行。系统将返回AutoCAD窗口,并提示用户选择一点,并以指定点为基点来绘制文字。结果如图36-4所示。 (2)如果用户退出VisualLISP环境并返回AutoCAD系统窗口,则需要对该程序进行加载后,才能运行。选择菜单【Tools(工具)】→【LoadAppcation…(加载应用程序)】,弹出“Load/UnloadApplications(加载/卸载应用程序)”对话框,如图

天正建筑设计常见问题及解决方法

天正建筑常见问题(2012.6) Q1.如何打印天正高版本的图形和向3.0用户传图? 许多设计单位在专门的机器上输出图纸,“天正插件”最适合于这样的机器,安装了“天正插件”后,该机器就可以阅读和打印用天正高版本绘制的图形。 有四种方法可以让其他专业的设计人员使用天正高版本绘制的建筑图形: 1.在其他专业设计人员的机器上安装“天正插件”; 2.执行【图形导出】命令,导出为T3格式的其他专业图形。 3.使用天正公司同版本的其他专业软件产品。 4.在“高级选项->系统->是否启用代理对象”中选“是”启用代理对象,此后保存的 图形就可以在其它机器上显示和打印,但文件大小会增加。 Q2.如何避免天正插件误把天正对象升级为高版本? 安装新版本“天正插件”后,进行了一些修改然后存图,但插件会把当前图形保存为天正插件新版本的天正建筑图,如果插件版本比原图的天正对象版本高,可能会导致原图作者无法打开。 因为天正插件也是随着对象版本升级的,在打开天正图形后插件会自动加载,它在ACAD 存图时默认按插件版本的天正对象格式保存图形,但天正插件也提供了保存低版本图形的命令,此时于命令行键入T91_TSA VEAS存图即可选择你要保存的天正对象版本。 Q3.为何图形导出后出现的填充和文字丢失? 一些设计单位在执行“图形导出”(以前叫“另存旧版”)命令后,把图形文件复制到其他机器,由天正3或者acad打开,出现丢失字体或者填充图案的问题。 原因是该机器的Acad系统没有天正建筑或者acad200X提供的字体或者图案文件,解决方法: 1.把天正sys下的GB*.shx字体复制到目标机器的天正3的sys目录下。 2.把天正sys下的acad*.pat图案文件复制到上面的同一个目录下。

AutoLisp极速入门视频教程笔录

大家好,您现在看到的是CAD高手网为大家奉献的CAD二次开发视频教程,尽管网站已经上传了一些lisp的视频教程,但是有很多新手朋友还是不得要领,这主要原因是因为我们的专业是设计而不是计算机编程。很荣幸,今天再次受CAD高手网站长剑王之邀,为大家制作本节lisp极速入门教程。 这节课的主要内容有: 一、认识CAD二次开发(lisp程序)及其作用 因为我们的专业是设计,为了真正达到极速入门的目的,这里我们不讲编辑语言的理论知识,理论知识可以到我们网站(https://www.wendangku.net/doc/f511043072.html,)的二次开发扫盲专题去详细了解,下面我们直接通过一个演示来对二次开发的作用做一个感性的认识。 二、lisp程序框架基本格式 (defun函数名称(变量声明)(……程序内容……)) 我们看到该框架以括号开始并以括号结束,这就是lisp语言最基本的语法规则之一,lisp程序的所有表达式都必须包括的括号以内,且左、右括号必须一一对称,成双成对。其中各部分的意义如下: defun内置功能函数,用于定义新的指令或新的功能函数。(我们甚至也可以将其看作是lisp语言的一个固定格式,因为这个函数比较特殊,我们无论是定义一个函数或是开发一个程序命令都将要用到它。) 函数名称新定义的函数名称,这完全取决于你的个人意愿可以是任何字符,如果该名称被定义为“c:”开头,则此函数即可做为CAD的一条新命令,反之则为一个功能函数,待下面实例详细讲解。 变量声明变量的声明分为全局变量或局部变量,可以省略但必须保留其在框架格式中的位置,即保留其位置的括号“()”,关于全局变量或局部变量将会在以后的课程中一一详解。 程序内容定义程序的所有表达式的集合,即该括号内可以嵌套任一多个括号(表达式) 三、lisp程序实例探密 1、利用lisp程序定义“左手键”(快捷键)

CAD lisp 实用小程序(源代码)

CAD lisp实用小程序(源代码) 一、圆自动同心 (defun c:TX(/qi aa ec center v_c) (vl-load-com) (princ"圆自动同心:") (setq aa(ssget));;获取圆的图元名 (setq center(getpoint"选取点位置:")); (setq center(vlax-3D-point center)); (setq qi0);初始序号 (repeat(sslength aa);对象个数 (setq ec(ssname aa qi));选择第一个图元 (setq v_c(vlax-ename->vla-object ec));将圆的图元名转换为VLA对象 (vla-put-center v_c center);更新圆中心点 (setq qi(+qi1)) );repeat (princ"修改成功:") );defun 二、图层快速修改 (princ"快速修改图层编程-TC") (defun C:TC(/) (vl-load-com) (setq SET_ZJTC(vla-get-Layer(vlax-ename->vla-object(car(entsel"\n选择基准图层:"))))) (WHILE(NOT SET_ZJTC)(setq SET_ZJTC(vla-get-Layer(vlax-ename->vla-object(car(entsel "\n基准图层为空,重新选择!:")))))) (setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car(entsel"\n选择修改图层:"))))) (WHILE(NOT SET_XGTC)(setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car (entsel"\n修改图层为空,重新选择!:")))))) (vlax-for VLA_MSP(vla-get-ModelSpace(vla-get-ActiveDocument(vlax-get-Acad-Object))) (IF(=(vla-get-Layer VLA_MSP)SET_XGTC)(vla-put-Layer VLA_MSP SET_ZJTC))) (princ"\n快速修改图层编程-TC:") (princ) );DEFUN 三、字高自动修改 (princ"快速修改字高编程-ZG") (defun C:ZG(/) (vl-load-com) (setq SET_ZTGD(vla-get-Height(vlax-ename->vla-object(car(entsel"\n选择基准字高:"))))) (WHILE(NOT SET_ZJTC)(setq SET_ZJTC(vla-get-Height(vlax-ename->vla-object(car (entsel"\n基准字高为空,重新选择!:")))))) (setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car(entsel"\n选择修改图层:"))))) (WHILE(NOT SET_XGTC)(setq SET_XGTC(vla-get-Layer(vlax-ename->vla-object(car (entsel"\n修改图层为空,重新选择!:"))))))

LISP 语言在CAD 道路设计中的各种应用

第三章LISP语言在CAD道路设计中的各种应用 3.1绘制平面任意函数曲线的AutoLISP程序设计 在各个工程设计领域中,经常要绘制一些曲线,特别是平面曲线,如水工结构的溢流曲线、机械设计的齿轮渐开曲线等。在AutoCAD绘图软件中,可以将曲线上的点先计算好,再用线、多义线、样条曲线等方法绘制,这种方法需要进行大量计算,工作量较大,如果用EXCEL软件来辅助计算,可以减轻工作量;另外,可以针对具体的曲线类型,用AutoCAD 内嵌的AutoLISP语言,实现边计算边绘制的功能。用这种方法绘制虽然快捷,但对于不同的曲线,则需编写同的AutoLISP程序,检查无误后才能运行,仍显繁琐。能否用统一的程序,来实现各种平面函数曲线的绘制,我们尝试利用AutoCAD中强大的表达式计算功能来实现这一目的。 3.1.1平面函数曲线的类型和绘制方法 平面函数曲线即是有简单函数表达式的曲线类型,可考虑经常遇到的4类: (1)直角坐标下形如y=f(x)的曲线; (2)直角坐标下的参数方程曲线; (3)极坐标下形如r=f(θ)的曲线; (4)极坐标下的参数方程曲线。 其中,只需增加一个平凡方程x=x,参数方程(2)就可以包括相应的直接表达形式(1),同样(4)可以包括(3)。同时,极坐标形式可以通过: x=rcosθ y=rsinθ 转换为直角坐标表达。因此从本质上说,4种类型都可以互相转换,把它们分类的目的是尽量采用函数的通常表达形式,以便于使用。绘制时,参照曲线的手工绘制方法,需要给出曲线上的多个点,然后将它们连接起来。若给出的点间隔很小,直接用折线段相连就可很好模拟该曲线,如果间隔较大,可以用样条曲线连接,使之比较光滑。假设我们计算出足够多的点,简单用折线连接即可,为使该曲线成为一个整体,可用多义线的方式连接。 关键的问题是,如何计算出曲线上点的坐标。由于曲线的函数表达式各种各样,不可能用统一的式子来表示。可以考虑从外部输入表达式,然后针对该表达式进行计算,给出相应结果,就能够解决点坐标的计算问题。但这个功能的实现比较困难,幸好AutoCAD为我们提供了CAL命令,可以对任意的表达式进行计算。该命令由函数库文件geomcal.arx提供,支持科学/工程计算器上的大多数标准函数,如三角函数、指数、对数等。若表达式中有变量,而该变量在程序中已设定了值,则按该值进行计算。由于该函数不是LISP内部函数,为使之可用,需要用ARXLOAD命令载入文件geomcal.arx,或者在命令行先输入CAL命令,由系统自动载入,这样,程序中就可以使用该函数了。总的程序定义为c:curve(),以便在AutoCAD命令行中与通常的命令一样使用。程序的总调用部分为: (arxload "geomcal.arx");载入提供表达式计算功能的ARX文件 (vl- arx- import 'c:cal);让命令c:cal能够使用 (princ "(1)直角坐标下曲线y=f(x).\n") (princ "(2)直角坐标下参数曲线x=f(i),y=g(i).\n") (princ "(3)极坐标下曲线r=f(theta).\n") (princ "(4)极坐标下参数曲线theta=f(i),r=g(i).\n") (setq ichoice (getint " 选择绘制曲线类型:"));选择曲线类型 (if (= ichoice 1) (curve1));调用曲线绘制类型1 (if (= ichoice 2) (curve2));调用曲线绘制类型2

lisp经典语句数值

设置默认数值 (if (= (setq th (getreal "输入墙厚度:(默认为0.25):")) nil) (setq th 0.25) ) 设置当前环境 (setvar "cmdecho" 0) ;不显示提示文字 (setvar "plinewid" 0.2 ) ;设置绘图线宽为0.2 (setvar "osmode" 0) ;设置当前捕捉为关闭状态 (command "undo" "be" "")恢复上一个命令 (command "text" "c" pt3 hgt ang1 txt1) 添加文字信息在意图面(command "text" "c" pt3 hgt ang1 txt1) (DEFUN C:szzt() (command "style" "细等线体" "方正细等线简体" "0" "1" "0" "n" "n" ) ;标注文字样式(command "style" "中等线体" "方正中等线简体" "0" "1" "0" "n" "n" ) ;文字样式(command "style" "宋体" "方正书宋_GBK" "0" "1" "0" "n" "n" ) ;标注文字样式(command "style" "黑体" "黑体" "0" "1" "0" "n" "n" ) ;标注文字样式 (command "style" "HZ" "txt,hztxt" "0" "0.8" "0" "n" "n" "n") (princ "\n文字样式已设定!")) (DEFUN C:tdc() (COMMAND "LAYER" "M" "HX" "C" "1" "" "") (COMMAND "LAYER" "M" "LH" "C" "3" "" "") (COMMAND "LAYER" "M" "ZX" "C" "2" "" "") (COMMAND "LAYER" "M" "绿化占地" "C" "3" "" "") (COMMAND "LAYER" "M" "道路占地" "C" "1" "" "") (COMMAND "LAYER" "M" "建设用地" "C" "7" "" "") (COMMAND "LAYER" "M" "解算" "C" "4" "" "") (COMMAND "LAYER" "M" "用地范围线" "C" "7" "" "") (COMMAND "LAYER" "M" "边界线" "C" "4" "" "") (COMMAND "LAYER" "M" "勘界线" "C" "6" "" "") (COMMAND "LAYER" "M" "利用" "C" "16" "" "") (COMMAND "LAYER" "M" "外业" "C" "5" "" "") (COMMAND "LAYER" "M" "图框" "C" "7" "" "") (COMMAND "LAYER" "M" "现状地形" "C" "5" "" "") (COMMAND "CLAYER" "解算"))

天正的问题

TArch8.5常见问题(2011.6) Q1.如何打印TArch8的图形和向3.0用户传图? 许多设计单位在专门的机器上输出图纸,“天正插件”最适合于这样的机器,安装了“天正插件”后,该机器就可以阅读和打印用TArch8绘制的图形。 有四种方法可以让其他专业的设计人员使用TArch8绘制的建筑图形: 1.在其他专业设计人员的机器上安装“天正插件”; 2.执行【图形导出】命令,导出为TArch3格式的其他专业图形。 3.使用天正公司同版本的其他专业软件产品。 4.在“高级选项->系统->是否启用代理对象”中选“是”启用代理对象,此后保存的 TArch8图形就可以在其它机器上显示和打印,但文件大小会增加。 Q2.如何避免天正插件误把天正对象升级为高版本? 安装新版本“天正插件”后,进行了一些修改然后存图,但插件会把当前图形保存为天正插件新版本的天正建筑图,比原来图形的版本高,导致原图作者无法打开。 因为天正插件也是随着对象版本升级的,它在ACAD存图时默认按插件版本的天正对象格式保存图形,但天正插件也提供了保存低版本图形的命令,在打开天正图形后插件会自动加载,此时于命令行键入T81_TSA VEAS存图即可选择你要保存的版本。 Q3.为何图形导出后出现的填充和文字丢失? 一些设计单位在执行“图形导出”(以前叫“另存旧版”)命令后,把图形文件复制到其他机器,由天正3或者acad打开,出现丢失字体或者填充图案的问题。 原因是该机器的Acad系统没有天正8或者acad200X提供的字体或者图案文件,解决方法: 1.把天正sys下的GB*.shx字体复制到目标机器的天正3的sys目录下。 2.把天正sys下的acad*.pat图案文件复制到上面的同一个目录下。 Q4.为何TArch8 的图另存3.0图,尺寸标注变了? 对于T8的图,使用过TArch3的标注功能,再图形导出可能有问题,纯粹8的图出问题的机会很少,主要出在T3和T8混合绘制的图。 (1) 文字样式的默认高度可能造成影响: T8的文字样式默认高度是基于图纸的,如果标注样式使用了有默认高度的

超经典CAD lisp程序集锦、CAD快捷键大全

超经典CAD lisp程序集锦 如果您使用 AutoCAD,下面的内容对您一定有帮助。在某些方面能大大提高 您的工作效率。下面的程序均以源程序方式给出,您可以使用、参考、修改它。 bg.lsp --- 表格自动生成 asc.lsp --- 将文本文件内容写入图中,字符是单个的 wf.lsp --- 将图中字符写入磁盘 exstr.lsp --- 将字符串分解成单字 pgtxt.lsp --- 将字符合成字符串 pb.lsp --- 通过给出长度将字符串分成两个串 cht.lsp --- 直接修改文字内容或块属性 ct.lsp --- 对数字串进行加减 chh.lsp --- 直接修改文字高度 chhw.lsp --- 直接修改文字高宽比(针对PKPM软件将字符定位点改为左下角) chst.lsp --- 直接修改文字字体 txt.shx --- 修改后的标准txt.shx文件。(kuozhan.sld为增强的内容幻灯片) tiao.lsp --- 配合修改过的标准字体文件,将中文字符调大 tiao1.lsp --- 配合修改过的标准字体文件,将英文字符调小 untiao.lsp --- 上两个程序的复原 sht.lsp --- 在图中查找字符串 zhuang.lsp --- 桩点及钎探号绘制(勘测图) dim.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:1) dimm.lsp --- 配合JT.DWG将尺寸标注调成适合建筑结构设计(1:100)

di1.lsp~di8.lsp --- 直接连续标注尺寸(用于1:1的图) di100.lsp~di800.lsp --- 直接连续标注尺寸(用于1:100的图) 详细内容及附件下载请浏览北纬服务论坛 https://www.wendangku.net/doc/f511043072.html,/thread-2724-1-1.html

第2讲 利用AutoLisp语言绘图

第2讲利用AutoLisp语言绘图 在AuotCAD绘制简单图形时,有三种主要方式:(1)图标菜单(2)下拉式菜单(3)命令行。事实上还有另外一种绘图方式,即通过lisp语言实现绘制图形。利用Lisp语言绘图的最大优点是可以实现批处理,降低劳动强度。 小知识: Lisp语言最大优势是和AutoCAD绘图结合的很好,这也 是该语言至今仍未被淘汰的最主要原因。 1、简单的绘图语句 几乎AuotCAD中所有的绘图及环境设置命令都可以通过程序调用!,利用Lisp语言编写绘图命令的窍门是首先在命令行下把绘图命令和对应的参数记住,然后用Lisp语言的格式书写出即可。 1.1 绘制直线 (command "line" "0,0" "1,1" "") 1.2 绘制圆 (command "circle" "0,0" 5) 1.3 绘制正多边形 (command "polygon" 5 "0,0" "i" 5) (command "polygon" "5" "0,0" "i" "5")都正确 1.4 新建图层 (command "la yer" "m" "道路" "c" 2 "" "") 请同学自己编写高度为2,起点位置在“0,0”,文字内容是“理工大”的程序2、用多条绘图语句表示复杂图形 正常情况下图形都比较复杂,需要用多条语句编写,例如测绘中的下水井、路灯等符号。 例1、下水井的绘制 (defun c:xsj() (command "circle" "0,0" 0.5) (command "line" "-0.5,0" "0.5,0" "") (command "line" "0,-0.5" "0,0.5" "") ) 3、循环控制语句 例2、绘制同心圆

CADLISP程序

1.计算所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度) (defun c:LL () (setvar "cmdecho" 1) (setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE")))) (setq i 0) (setq ll 0) (repeat (sslength en) ? (setq ss (ssname en i)) ? (setq endata (entget ss)) ? (command "lengthen" ss "") ? (setq dd (getvar "perimeter")) (setq ll (+ dd ll)) ? (setq i (1+ i)) ) ? (princ "所选线条总长为:")(princ ll)(princ) ) 2.标注所有线段(加载后只需框选所有线段便可得标注这些线段) (defun c:LLL () (COMMAND "UCS" "") (setvar "cmdecho" 1) (SETVAR "OSMODE" 0) (setq ? ?AcadObject ? (vlax-get-acad-object) ? ?AcadDocument (vla-get-ActiveDocument Acadobject) ? ?mSpace ? ? ? (vla-get-ModelSpace Acaddocument) ) ;;选取需要测量的样条曲线、圆弧、直线、椭圆 (setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE")))) (setq i 0)

LISP语言教程

LISP语言教程 作者:牛魔王 — 上次修改时间: 2007-03-22 13:13 Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。Scheme 语言概要 Author:宋国伟吉林省德惠市信息中心 Date:2003 年12 月01 日 Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。 作为Lisp 变体,Scheme 是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具。本文分为上、下两部分来介绍scheme 语言。一.Scheme语言的特点

Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。 它是一个小巧而又强大的语言,作为一个多用途的编程语言,它可以作为脚本语言使用,也可以作为应用软件的扩展语言来使用,它具有元语言特性,还有很多独到的特色,以致于它被称为编程语言中的"皇后"。 下面是洪峰对Scheme语言的编程特色的归纳: ?词法定界(Lexical Scoping) ?动态类型(Dynamic Typing) ?良好的可扩展性 ?尾递归(Tail Recursive) ?函数可以作为值返回 ?支持一流的计算连续 ?传值调用(passing-by-value) 术运对 ?算算相独立 本文的目的是让有编程基础(那怕是一点点)的朋友能尽快的掌握Scheme语言语规则读发现经Scheme语言了,那么我的的法,如果您在完本文后,自己已会用 目的就达到了。

在AutoCAD中基于LISP程序简易标注粗糙度

在AutoCAD中基于AutoLISP程序简易标注粗糙度 陕西关中工具制造有限公司(陕西凤翔 721400)张科岐王建卫 对经常使用AutoCAD绘制二维机械图的用户来说,标注表面粗糙度是一件烦琐的事情。常用的方法是先画好粗糙度的符号,再将粗糙度值定义为属性,最后将符号和粗糙度定义为块。标注时插入这个块,按提示输入粗糙度值完成。笔者结合自己在工作中的实际经验,利用AutoCAD提供的AutoLISP程序二次开发功能编写了一个粗糙度标注程序。使用该程序标注粗糙度,操作简单、快捷、准确、美观。现将程序内容及使用方法介绍如下,供大家参考。 程序全文如下: (defun rad->deg(rad) (/ (* rad 180.0) pi) ) (defun Deg->Rad(Deg) (* pi (/ Deg 180.0)) ) (defun rgh() (setvar "CMDECHO" 1) (setq svar_old (getvar "osmode" )) (setq svar_new 0) (setvar "osmode" svar_new) (setq pos_pt (getpoint"\n标注位置:")) (setq sym_dir (getpoint"\n符号方向:")) (setq sym_hgt (getreal"\n符号高度<5>:")) (setq txt (getstring"\n数值大小<3.2>:")) (if (= txt "") (setq txt "3.2") ) (setq txt_hgt(getreal"\n字符高度<2.5>:")) (if (= txt_hgt nil) (setq txt_hgt 2.5) ) (if (= sym_hgt nil) (setq sym_hgt 5.0) ) (setq sym_lgt (/ sym_hgt (cos (/ pi 6.0)))) (setq sym_angle (angle pos_pt sym_dir)) (setq sym_pt1 (polar pos_pt (+ (/ pi 3.0) sym_angle) (* 0.5 sym_lgt)))

探索者版本升级后钢筋符号显示错误等问题的解决方案

绘图常见问题解决方案——探索者版本升级后钢筋符号显示错误等问题的解决方案汇总 一.遇到的问题: 1.由探索者低版本换到高版本后,打开以前的图纸,钢筋符号显 示问号。 2.探索者绘制的图,发给别人时,别人打开钢筋符号等显示问号。 3.在本人电脑上显示正常,在打印后,图纸上显示问号。 4.该院有自己的文字样式要求,不使用探索者字体。装上探索者 后,会将文字样式设定为院自己的,故生成的图纸,符号是问 号。 二.解决问题的方法: 1.用tssd06版或者10版编辑的文字,在升级到2011、2012版 本后,由于字体编码进行重新编写,用新版打开以前版本编辑 的图形时,可能会出现钢筋及特殊文字符号显示出现问号或者 圆圈等问题,当然,新版程序会自动的进行识别,将旧版的符 号尽量正常显示。如果实在有问号的情况,我们提出如下解决 方法。如果从新版转到旧版则执行相反操作即可。 点击【工具】下拉菜单中的【版本转换】,弹出如下对话框:

这样可以解决安装新版后打开以前的图显示问号或者圆圈的问题。 执行相反的操作。 可以解决用新版绘制的图形,拷给别人或者打印时显示问号的问题。图形绘制完成后执行该命令即可。但是这种方式会导致≥、≤、Ⅰ~Ⅹ、①~⑩、型钢等字符显示不正确,当然可以通过查找替换的方式进行修改。 2.对于第2个和第3个问题,最好的方法是通过【图形打包】命 令将图中的字体与图形进行关联,打开图形时自动调用旁边的 字体。 弹出对话框,找到要打包的图纸,选择存放位置,即可生成一个压缩

文件,解压后打开该图形时,便可以正常显示各种探索者新版所写的特殊符号了。 3.对于第4个问题,我们可以通过定制院标解决。 首先我们希望院里统一使用探索者字体,如果院里一定要用院里自己的字体,我们建议进行定制,通过定制后,使字体正常显示。 4.网上也有一些解决字体问题的小插件或者LISP程序,不过这 些程序也只能对钢筋符号适用,对于≥、≤、Ⅰ~Ⅹ、①~⑩、 型钢等特殊符号,也不能解决。【wt探索者2011钢筋修改】 这是其中一个lisp程序的工具,可以将新版探索者的钢筋符 号,变成原来的%%形式。加载后,输入“WT”即可。

养成良好的AutoLISP书写习惯

养成良好的AutoLISP书写习惯 众所周知,Lisp是一种表结构语言,括号必须成对出现,在调试时往往为遗漏了一个括号大费周折,所以,养成一个好的编程习惯是学好Lisp所必须的。 ⑴选择一个较好的编辑器,这是一个基本条件,建议使用Visual Lisp编辑器或Lisplink 等专用编辑器,此类编辑器可以对函数突出显示。 ⑵按Lisp(DCL)专有格式书写,并经常对程序进行“格式化”,及时发现语法错误,并有利于调试是查找错误。 ⑶使用自定义函数,并辅助以适当得注释,在较大程序中按功能使用自定义函数可以使得程序条理化。 autolisp的入门教程+autolisp函数! Lisp是一门历史悠久的语言,全名叫LISt Processor,也就是“表处理语言”,它是由John McCarthy于1958年就开始设计的一门语言。和Lisp同时期甚至更晚出现的许多语言如Algo 等如今大多已经消亡,又或者仅仅在一些特定的场合有一些微不足道的用途,到现在还广为人知的恐怕只剩下了Fortran和COBOL。但唯独Lisp,不但没有随着时间而衰退,反倒是一次又一次的焕发出了青春,从Lisp分支出来的Scheme、ML等语言在很多场合的火爆程度甚至超过了许多老牌明星。那么这颗常青树永葆青春的奥秘究竟在哪里呢? 如果你只接触过C/C++、Pascal这些“过程式语言”的话,Lisp可能会让你觉得十分不同寻常,首先吸引你眼球(或者说让你觉得混乱的)一定是Lisp程序中异常多的括号,当然从现在的角度来讲,这种设计的确对程序员不大友好,不过考虑到五六十年代的计算机处理能力,简化语言本身的设计在那时算得上是当务之急了。 Lisp的基本语法很简单,它甚至没有保留字(有些语言学家可能对这一点有异议,别怕,我听你们的),它只有两种基本的数据,仅有一种基本的语法结构就是表达式,而这些表达式同时也就是程序结构,但是正如规则最简单的围棋却有着最为复杂的变化一样,Lisp使用最基本的语言结构定义却可以完成其它语言难于实现的、最复杂的功能。 废话少说,现在我们就来看看Lisp语言中的基本元素。 Lisp的表达式是一个原子(atom)或表(list),原子(atom)是一个字母序列,如abc;表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如: abc () (abc xyz) (a b (c) d) 最后一个表是由四个元素构成的,其中第三个元素本身也是一个表。 正如算数表达式1+1有值2一样,Lisp中的表达式也有值,如果表达式e得出值v,我们说e返回v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。

AUTOLISP 程序命令(精校版本)

1.+ (加)返回所有数的和 2.– (减)将第一个数减去其他数的和并返回差值 3.* (乘)返回所有数的乘积 4./ (除)将第一个数除以其他数的乘积并返回商 5.= (等于)比较参数是否相等 6./= (不等于)比较参数是否值不相等 7.< (小于)如果每个参数值都小于它右边的参数则返回 T,否则返回 nil 8.<= (小于或等于)如果每个参数值都小于或等于它右边的参数则返回 T, 否则返回 nil 9.> (大于)如果每个参数值都大于它右边的参数则返回 T,否则返回 nil 10.>= (大于或等于)如果每个参数值都大于或等于它右边的参数则返回 T, 否则返回 nil 11.~ (按位非)返回参数的按位非(即 1 的补码) 12.1+ (增1)将参数加 1 13.1– (减1)将参数减 1 14.abs返回参数的绝对值 15.acad_colordlg显示标准的 AutoCAD 颜色选择对话框 16.acad_helpdlg启动帮助工具(已废弃) 17.acad-pop-dbmod恢复 DBMOD 系统变量的值到最近用 acad-push-dbmod 保存的值 18.acad-push-dbmod储存 DBMOD 系统变量的当前值 19.acad_strlsort以ASCII码字母顺序对字符串表进行排序 20.acad_truecolorcli从命令行中选择 AutoCAD 真彩色 21.acad_truecolordlg显示 AutoCAD 真彩色选择对话框 22.acdimenableupdate控制关联标注的自动更新 23.acet-layerp-mode查询和设置 LAYERPMODE 配置 24.acet-layerp-mark放置图层先前记录的开始和结束标记 25.acet-laytrans转换图形中的图层为其它图形或标准文件中所定义的标 准 26.acet-ms-to-ps从模型空间单位转换实数值到图纸空间单位 27.acet-ps-to-ms从图纸空间单位转换实数值到模型空间单位 28.action_tile为某一对话框控件指定一个动作表达式,用户在对话框中选 中这个控件时,就会执行该动作表达式 29.add_list在当前激活的对话框的列表框中增加一个字符串或修改其中的 一个字符串 30.alert显示一个警告框,其中显示一条出错或警告信息 31.alloc设置段长度以供 expand 函数使用 32.and返回表达式的逻辑与 (AND) 运算结果 33.angle以弧度为单位返回两点之间连线与当前 UCS 下 X 轴之间的夹角 34.angtof将表示角度的字符串转换为实数(浮点数)形式的弧度值 35.angtos将一个以弧度为单位的角度值转换成字符串 36.append将任意多个表组合成一个表 37.apply将参数表传给指定的函数

LISP语言教程

LISP语言教程 作者:牛魔王—上次修改时间: 2007-03-22 13:13 Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。 Scheme 语言概要 Author: 宋国伟吉林省德惠市信息中心 Date: 2003 年 12 月 01 日 Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。 作为Lisp 变体,Scheme 是一门非常简洁的计算语言,使用它的编程人员可以摆脱语言本身的复杂性,把注意力集中到更重要的问题上,从而使语言真正成为解决问题的工具。本文分为上、下两部分来介绍 scheme 语言。 一.Scheme语言的特点 Scheme 语言是LISP语言的一个方言(或说成变种),它诞生于1975年的MIT,对于这个有近三十年历史的编程语言来说,它并没有象C++,java,C#那样受到商业领域的青睐,在国内更是显为人知。但它在国外的计算机教育领域内却是有着广泛应用的,有很多人学的第一门计算机语言就是Scheme语言。 它是一个小巧而又强大的语言,作为一个多用途的编程语言,它可以作为脚本语言使用,也可以作为应用软件的扩展语言来使用,它具有元语言特性,还有很多独到的特色,以致于它被称为编程语言中的"皇后"。 下面是洪峰对Scheme语言的编程特色的归纳: ?词法定界(Lexical Scoping) ?动态类型(Dynamic Typing) ?良好的可扩展性 ?尾递归(Tail Recursive) ?函数可以作为值返回 ?支持一流的计算连续

CAD导入SU一次成面的办法

[菜谱]C A D图导入S U中一次成面的方法来源: 规划图从CAD导入Sketchup后,曲线相交的地方经常会出现断点,描线很麻烦,该怎么办? 因为Sketchup会把CAD的曲线拟合成多段直线,所以相交出会出现一点点的误差。要想闭合就必须手工把这一点点误差补上或删掉,确实很麻烦。如果用找线头的插件,就可以看到在直线和曲线相交的地方有很多断开的区域,所以即使用自动封面也不能很好的生成面。设想一下,一个几千平方米的规划图,上百上千个面,一个一个去描的话,不死也要脱层皮了,呵呵。 左图是未处理的CAD导入Sketchup后,运行找断线插件和自动封面插件的结果。可以看到很多断头,封面也不正确。 右图是经过处理的CAD导入Sketchup后,运行找断线插件和自动封面插件的结果。可以看到没有断头,封面基本正确。 2010-5-1012:11:08上传 对这个问题,我想了很多种办法。以前我是在CAD里对复杂区域就做成闭合面域导入Sketchup,但是也很麻烦。后来想到,如果在CAD里手动把相交的地方打断,那么两边就是单独两条曲线,这样导入Sketchup后相交点的坐标就不会变动,也就不会出现细小的误差了。 经过实验,这个方法可行。但是那么多的相交点,一个一个的去处理会非常麻烦。所以我在网上搜索能一次性把所有相交点都打断的程序。还真找到了!!经过测试,效果非常好,除了对闭合的圆和椭圆不能起作用外,对PLINE,LINE,ARC,SPLINE都能正确打断。处理后的图形再导入Sk etchup,就没有断头了。封面的效果也很不错,对于局部椭圆之类的对象,再简单描一下就可以了。 ------------------------------------------------------------- 好,接下来我们看看具体的做法吧,以AUTOCAD2006为例: 第一步:下载LISP程序,下载地址:

用AutoLISP程序提高绘图效率的几个实例

2007.12 科技广场 254

工程中经常要绘制各种弹簧和螺纹连接件,在AutoCAD中没有专门绘制弹簧和螺纹的命令,弹簧和螺纹在AutoCAD中都可用平面图形通过相应螺旋线拉伸而成,所以绘制螺旋线就是解决问题的关键。如果用常规的3dpoly命令绘制三维螺旋线,需要输入大量精确数据,才能一点一点地画出螺旋线,做法非常麻烦。现在提供AutoLISP程序,即可解决绘制螺旋线的问题。然后通过相应平面图形的拉伸,就可以完成弹簧、螺纹等零件的绘制。 根据圆台螺旋线的形成原理(一动点M绕圆台的母线AB作等速直线运动,而该母线AB又绕圆台的轴线O1O2作等角速旋转时,点M的运动轨迹即为圆台的螺旋线,如图二所示。圆柱螺旋线是圆台螺旋线的特例,故可通过圆台螺旋线程序做相应的变动,即可得到),动点M(x,y,z)的参数方程如下: 图二园台螺旋线 X=[r0+hg *α/(2π)]*cosα Y=[r0+hg *α/(2π)] *sinα Z=±vg *α/(2π) 其中,r0为圆台下面的半径,α为螺旋线角,vg为导程(单线螺旋线螺距(弹簧的节距)等于导程),hg为点M沿水平半径方向上增加的距离(hg=|(r1-r0)m|求得,m为螺旋线的圈数)。 下面提供圆台螺旋线的AutoLISP程序清单: (defun c:luoxc(/) (setq b1 (getpoint" 指定基点:")) (setq r1 (getreal "指定初始半径:")) (setq disp (getreal "指定节距:")) (setq angtg (getreal "输入锥形角:")) (setq m (getint"输入圈数:")) (setq n (getint"输入每圈细化段数<36>:")) (cond ((null n )(setq n 36))) (setq delta (/ (* 2.0 pi ) n)) (setq j (/ disp n)) (setq bb (caddr b1)) (setq tg (*(/ angtg 180) pi)) (setq ang 0) (setq k 0) (command "ucs" "o" b1) (command "3dpoly" (list r1 0 0)) (repeat (* m n) (setq k(+ k 1)) (setq ang(+ delta ang)) (setq r (- r1 (* (+ 0(* j k))(/ (sin tg )(costg))))) (setq pt2 (list (* r(cos ang))(* r(sin ang))(+ 0(* j k)))) (command pt2) ) (command "") ) 根据圆台螺旋线的形成原理,如果圆锥角为0度时,即可形成圆柱螺旋线。圆柱螺旋线程序清单如下: (defun c:luoxc(/) (setq b1 (getpoint" 指定基点:")) (setq r (getreal "指定初始半径:")) (setq vg (getreal "指定节距:")) (setq m (getint"输入圈数:")) (setq n (getint"输入每圈细化段数<36>:")) (cond ((null n )(setq n 36))) (setq delta (/ (* 2.0 pi ) n)) (setq j (/ disp n)) (setq bb (caddr b1)) (setq ang 0) (setq k 0) (command "ucs" "o" b1) (command "3dpoly" (list r 0 0)) 255

相关文档