一、学好AutoLISP的关键、基本结构与语法:1.AutoLISP程式语言的特质A.语法简单B.功能函数强大C.撰写的环境不挑剃D.直译式程式,『即写即测、即测即用』E.横跨AutoCAD各作业平台,悠然自得(注:以上五点,读者可以参考上一章的剖析!!!)2.学好AutoLISP的关键:充份掌握『语法结构』&『功能函数』的搭配!!!3.重要的AutoLISP的基本语法结构规则1:以括弧组成运算式,、相对称左右括弧数一定要成双成对规则2:运算式型态:(运算元运算子运算子运算子)1.1运算元包括『功能函数』&『自定函式』1.2运算子(引数)包括:A.整数(Integer)如8,-17,500,9999.....B.实数(Real)如8.5,-17.456.....C.字串(String)如AutoCAD,123D.串列(List)如(abc),(xy)E.图元名称代码如entityname:6000f262F.档案代码如file:#12438.....G.选择群集代码如Selectionset:1规则3:运算式中的『运算子』,可以是另一『运算式』或『副程式』规则4:多重的括弧运算式,运算的先后顺序是『由内而外、由左而右』规则5:以档案型态存在的AutoLISP程式(ASCII档案),其副档名必须是.lsp规则6:撰写的环境,只要是一般的文书编辑软体、记事本,可编辑ASCII档案者都适用规则7:以defun功能函数定义新的指令或新的功能函式规则8:新定义的功能函式名称,若为『C:函式名』,则此函式可为AutoCAD新指令规则9:载入AutoLISP程式的作法:=指令:后直接键入(loadLISP主档名)规则10:AutoLISP程式中,在『分号;』后的内容均为注解,程式不处理,适时的增加注解,将使程式更具可看性、学习性及完整性规则11:AutoLISP最常用的变数型态是『整数』、『实数』、『字串』、『点串列』四种,变数的型态依据设定值而自动定义,变数会一直储存该值,直到被重新设定值或绘图结束自动消失规则12:以setq功能函数设定变数值(setq变数名称设定值)规则13:欲在AutoCAD的环境中,查看一变数值,指令:下键入『!变数名』即可规则14:以(defunC:函式名(引数/变数)........)程式中,程式中的变数若在『/』右边变数内,则称为『区域变数』,否则为『整体变数』二、学好AutoLISP的关键:充份掌握『语法结构』&『功能函数』的搭配!!!其时这个关键亦是学习其它程式语言的关键.『语法结构』AutoLISP的语法结构规定的并不多,变数不用事先定义及宣告,读者可熟记下一单元有关重要的AutoLISP基本语法结构,十四条设计上要求的『规则』『功能函数』AutoLISP之所以能功能如此强大,都有赖功能函数,其成员共约200个:1.一般性函数170个2.ADS定义特殊函数9个3.配合DCL交谈框设计函数22个各功能函数在使用上要求配合的运算子(引数)型态,均有其规定,当然,您可不能乱给!例如:指令:(+123ABC)传回:error:badargumenttype(引数型态错误)因为『+』函数不接受字串,而abc正是字串指令:(rtosabc)传回:error:badargumenttype(引数型态错误)因为『rtos』函数只接受实数转字串详细内容可参考下一章『快速浏览AutoLISP功能函数』至于各功能函数详细的语法与实例应用,读者请参阅本书『第三篇AutoLISP功能函数详解』三、重要的AutoLISP的基本语法结构:规则1:以括弧组成运算式,左右括弧数一定要成双成对、相对称请依序在『指令:』列(或指令:)后面直接键入以下运算式指令:(+12345)传回加总和15指令:(max14.58.935)传回最大值35指令:(menucmdp1=*)显示拉下POP1指令:(getintEnterReal:)传回EnterReal:要求输入一个实数指令:(setqa(*12.54))传回相乘值50,同时设定给『变数a』指令:!a回应50(注:!号可用来查询变数值)指令:(min75a63)回应最小值50(因为变数值a代表50)错误的范例:指令:(setqa(*12.54)1传回1表示少了一个括弧1)此时,只要再补上一个)即可指令:(setqa(*12.542传回2表示少了二个括弧2))此时,只要再补上二个)即可规则2:运算式型态(运算元运算子运算子运算子...)或(函数(式)引数引数引数...)或(函数(式)元素元素元素...)1.1运算元包括『功能函数』&『自定函式』功能函数:如上练习中的+、max、menucmd、getint、setq、*、min,详细内容可参考下一章『快速浏览AutoLISP功能函数』&『第三篇AutoLISP功能函数详解』自定函式:由设计者自行定义的新函式或副程式1.2运算子(又称引数或元素)包括:A.整数(Integer):如8,-17,500,9999…正常范围:2的16次方,介于-32768与+32767之间特殊范围:若以float函数将其转为实数,则范围2的32次方,介于-2147483648与+2147483647之间B.实数(Real):如8.5,-17.456…正常范围:带有小数点的数,精度可达14位有效数字C.字串(String):如AutoCAD,123,EnterReal:,7.5,…正常范围:以双引号内夹『字元』为认定,字元数不受限制D.串列(List):如(abc),(xy),(xyz),(a83.5),....正常范围:以左右括号内夹『元素』为认定,元素型态非常弹性使用频率:在AutoLISP程式设计中应用非常高范例说明:(a83.5kk(12))表示此串列内有五个元素a表示字串a、8表示整数8、3.5表示实数3.5、kk表示变数kk、(12)表示串列(12)2D点座标(xy)表示法=以二实数形成串列3D点座标(xyz)表示法=以三实数形成串列E.图元名称代码:如entityname:6000f262...使用范围:AutoCAD会自动赋予图元指向代码,透过此代码可找到图元的资料库记录范例说明:(setqen(entlast))传回entityname:60000062(entgeten)可找到图元的资料库串列F.档案代码:如file:#12438…使用范围:开启(open)档案作读档(r)、写档(w)使用时,所产生的代码,如下:范例说明:(setqffr(opentest.txtr))回应file:#24138(setqffw(openabc.txtw))回应file:#34812G.选择群集代码:如Selectionset:1、Selectionset:1…使用范围:一个或数个图元所形成的选择集范例说明:(setqss(ssget))选取物件:(可选择物体)选取物件:(可选择物体)选取物件:(按[ENTER]键)回应Selectionset:1规则3:运算式中的『运算子』,可以是另一『运算式』或『副程式』功能函数使用语法:(strcat字串1字串2字串3....)字串结合功能函数(getstring提示)要求键入一个字串(rtos实数)将实数转换成字串范例说明1:(strcatabc123LISP)传回:abc123LISP范例说明2:(strcatabc(getstringEnterString:)(rtos123.45))执行结果:EnterString:键入任一字串,假设是键入*HELLO*回应abc*HELLO*123.45本例中的strcat函数在语法中要求的『运算子』必须是『字串』型态『运算子1』=abc是正常的字串运算子『运算子2』=运算式(getstringEnterString:)传回结果是一字串*HELLO*『运算子3』=运算式(rtos123.45)传回结果是一字串123.45规则4:多重的括弧运算式,运算的先后顺序是『由内而外、由左而右』范例说明:请将10.25+17-13.2/7的结果,设定给变数kk,并转换成AutoLISP的运算式解法技巧A:1:运用『二分法、加括号』:(10.25+17)-(13.2/7)2:运算元往前提:kk=(-(10.25+17)(13.2/7))3:运算元再往前提:kk=(-(+10.2517)(/13.27))4:转换完成:(setqkk(-(+10.2517)(/13.27)))解法技巧B:1:运用『二分法、加括号』:(10.25+(17-(13.2/7)))2:运算元往前提:kk=(+10.25(17-(13.2/7)))3:运算元再往前提:kk=(+10.25(-17(/13.27)))4:转换完成:(setqkk(+10.25(-17(/13.27))))规则5:以档案型态存在的AutoLISP程式(ASCII档案),其副档名必须是.LSP规则6:撰写的环境,只要是一般的文书编辑软体,可编辑ASCII档案者都适用如:PE2、PE3、DW3、书中仙、汉书、EDIT、记事本....等规则7:以defun功能函数定义新的指令或新的功能函式(注:引数及区域变数可省略)程式结构型态:(defun函式名称(引数/区域变数)::::程式内容::)规则8:新定义的功能函式名称,若为『C:函式名』,则此函式可为AutoCAD新指令(注:引数及区域变数可省略)程式结构型态:(defunC:KK(引数/区域变数)::程式内容::::)则载入此LISP程式后,可在指令:后直接键入新定义的KK指令规则9:载入AutoLISP程式的作法:指令:后直接键入(loadLISP主档名)注:load与字串间的空格,可有可无注:load与双引号间的空格,可有可无(loadLISP主档名)范例:在c:\lsptools目录下有一LISP程式tt.lsp,而您目前的工作目录在c:\dwg下若『环境设定』之『支援档案搜寻路径』有指定到c:\lsptools目录,则欲使用载入tt.lspà指令:后键入(loadtt)即可若『环境设定』之『支援档案搜寻路径』无指定到c:\lsptools目录,则键入(loadtt)后,会出现错误讯息如下:无法开启「tt.lsp」做输入错误:载入失败(LOADtt)*取消*此时您可键入:指令:(loadc:\\lsptools\\tt)或指令:(loadc:/lsptools/tt)不可键入:(loadc:\lsptools\tt)因为『\』在AutoLISP结构语法中已经用于『跳脱码控制』了规则10:AutoLISP程式中,在『分号;』后的内容均为注解,程式不处理,适时的增加注解,将使程式更具可看性、学习性及完整性范例:pp.lsp内容如下:;本程式功能可快速画门、窗;设计者:QQ博士;版权所有,欢迎使用(defunc:pp()::;以下为画门副程式::;以下为画窗副程式,::::)规则11:AutoLISP最常用的变数型态是『整数』、『实数』、『字串』、『点串列』四种,变数的型态依据设定值而自动定义,变数会一直储存该值,直到被重新设定值或绘图结束自动消失规则12:以setq功能函数设定变数值(setq变数名称设定值)范例:(setqa100);变数a值设定成整数100(setqb123.56);变数b值设定成实数123.56(setqcGoodmorning!!!);变数c值设定成字串(setqpt1(getpointEnterPOINT:));变数pt1值设定成点串列(setqpt2(listab));此时,a值是100,b值是123.56变数pt2值设定成点串列(100123.56)(setqpt3'(297210));变数pt3值设定成点串列(297210)注意:直接设定成点串列时,不能省略单引号『'』否则会被误认(297210)又是一个运算式,297是运算元而出错!规则13:欲在AutoCAD的环境中,查看一变数值,指令