AutoLISP详细讲解
关于AutoLISPAutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。
除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP却生下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。
AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。
现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。
在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。
数学运算
任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。1.加法
格式(+ num1 num2 num3…)
此函数(+)计算加号(+)右边所有数字的和(+ num1 num2 num3…)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是整数。在第三个例子中,一个是实数(50.0),故结果为实数。
示例:
Command:(+2 5)返回 7
Command:(+2 30 4 50)返回86
Command:(+2 30 4 50.0)返回 86.0
2. 减法
格式(- num1 num2 num3…)
此函数(-)从第一个数中减去第二个数(num1-num2)。如果多于两个数,就用第一个数字减去其后所有数字的和[num1-(num2+num3…)]。在下面的第一个例子中,28减去14后返回14。因为两个数均为整数,结果亦为整数。在第三个例子中20与10.0相加,并用50减去两数的和(30.0),返回一个实数20.0。
示例:
Command:(- 28 14) 返回14
Command:(- 25 7 11)返回7
Command:(- 50 20 10.0)返回20.0
Command:(- 20 30)返回河0
Command:(- 20.0 30.0)返回-10.0
3.乘法
格式(* num1num2 num3…)
此函数(*)计算乘号右边所有数字的乘积( num1×num2×num3…)。若均为整数,它们的乘积亦为整数;若其中含有一个实数,乘积即为实数。
示例:
Command:(* 2 5) 返回10
Command:(* 2 5 3) 返回30
Command:(* 25 3 2.0) 返回60.0
Command: (* 2 -5.5) 返回-11.0
Command: (* 2.0 -5.5 -2) 返回22.0
4.除法
格式( / num1num2 num3…)
此函数(/)用第一个数除以第二个数。如果多于两个数,就用第一个数除以其后所有数的乘积[num1/(num2 × num3 ×…)]。在下面的第四个例子中,用200除以5.0与4的乘积[200/(5.0×4)]。
示例:
Command:(/ 30)返回 30
Command:(/ 3 2)返回1
Command:(/3.0 2) 返回 1.5
Command:(/ 200.0 5.0 4)返回 10.0
Command:(/ 200 -5)返回-40
Command:(/ -200 -5.0)返回40.0
增量、减量与绝对数字
1.增量数字格式(1+ number)
此函数(l+)使数字与1(整数)相加,返回一个增加1的数。在下面的第二个例子中,1与-10.5相加返回-9.5。
示例:
(1+ 20)返回 21
(1+ -10.5)返回-9.5
2.减量数字
格式(1- number)
此函数(1-)从数字中减去1(整数),并返回一个减去1的数。在下面的第二个例子中-10.5减去1返回-11.5。
示例:
(1- 10)返回9
(1- 10.5)返回-11.5
3.绝对数字
格式(abs num)
abs函数返回一个数的绝对值。该数可以是整数或者实数。在下面的第二个例子中,由于-20的绝对值为20,故函数返回20。
(abs 20)返回 20
(abs -20)返回20
(abs -20.5)返回20.5
三角函数
1.sin函数格式( sin angle)
sin函数计算一个角(以弧度表示)的正弦值。在下面的第二个例子中,sin函数计算Pi(180度)的正弦值并返回0。
示例:
Command:(sin 0)返回0.0
Command:(sin Pi)返回0.0
Command:(sin 1.0472)返回0.866027
2.cos函数
格式(cos angle)
cos函数计算一个角(以弧度表示)的余弦值。在下面的第三个例子中,cos函数计算Pi(180度)的余弦值并返回-1.0。
示例:
Command:(cos 0)返回l.0
Command:(cos 0.0)返回1.0
Command:(cos Pi)返回-1.0
Command:(cos 1.0)返回0.540302
3.atan函数
格式( atan num1)
atan函数计算数的反正切值,返回角度以弧度表示。下面的第二个atan函数计算1.0的反正切值并返回0.785398(弧度)。
示例:
Command:(atan 0.5)返回0.463648
Command:(atan 1.0)返回0.785398
Command:(atan -1.0)返回-0.785398
4.具有两个参数的atan函数
格式( atannum1num2)
还可以在atan函数中再指定一个数。若指定了第二个数,函数将以弧度形式返回(num1/num2)的反正切值。在下面的第一个例子中,第一个数(0.5)除以第二个数(1.0),atan函数计算商(0.5/1=0.5)的反正切值。
示例:
Command:(atan 0.5 1.0)返回0.463648弧度
Command:(atan 20 3.0)返回0.588003弧度
Command:(atan 2.0 -3.0)返回2.55359弧度
Command:(atan -2.0 3.00)返回-0.5880033弧度
Command:(atan -2.0 -3.0)返回-2.55359弧度
Command:(atan 1.0 0.0)返回1.5708弧度
Command:(atan -0.5 0.0)返回-1.5708弧度
5.angtos函数
格式(angtos angle[made[precision]])
angtos函数以字符串格式返回以弧度表示的角度值。字符串格式由made和 precision的设置决定。
示例:
Command:(angtos 0.588003 0 4)返回“33.6901”
Command:(angtos 2.55359 0 4)返回“145.3099”
Command:(angtos 1.5708 0 4)返回“90.0000”
Command:(angtos -1.5708 0 2)返回“270.00”
注意 在(angtos angle[mode[precision]])中:
angle是以弧度表示的角度值。
mode是与AutoCAD系统变量AUNITS相对应的angtos模式。
AutoCAD中可用模式如下:
ANGTOS模式 编辑格式
0 十进制角度
1 度/分/秒
2 梯度
3 弧度
4 测量单位
precision是一个整数,用于控制小数的位数,与AutoCAD系统变量AUPREC相对应。 其最小值为0,最大值为4。
在上面的第一个例子中,angle为0.588003弧度,mode为0(十进制角度),precision为4(小数点后有四位)。函数返回33.6901。
关系表达式
在程序中,通常都需要测试某些特定的条件。若条件为真,程序执行某些功能,若不为真,执行另外一些功能。例如,条件表达式(if(< X 5)),若变量x的值小于5,测试结果为真。编程过程中经常要用到这种类型的测试条件。本节讨论在AutoLISP编程中要用到的各种关系表达式。1.等于
格式(= atom1 atom2…)
该函数(=)检查两个元素是否相等。若相等,条件为真,函数返回T。同样,若指定的元素不相等,条件为假,函数返回nil。
示例:
(= 5 5)返回T
(= 549)返回nil
(= 5.5 5.5 5.5)返回T
(= “yes”“yes”)返回T
(=“yes” “yes” “no”)返回nil
2.不等于
格式(/= atom1 atom2…)
该函数(/=)检查两个元素是否不相等。若不相等,条件为真,函数返回T。同样,若指定的元素相等,条件为假,函数返回nil。
示例:
(/=50 4)返回T
(/= 5050)返回nil
(/= 50 -50)返回T
(/= “yes” “no”)返回T
3.小于
格式(<atom1 atom2…)
该函数(<)检查第一个元素(atoml)是否小于第H个元素(atomZ)。若为真,函数返回T,否则返回nil。
示例:
(< 3 5)返回T
(< 5 3 4)返回nil
(< “x” “y”)返回T
4.小于等于
格式(<= atom1 atom2…)
该函数(<=)检查第一个元素(atom1)是否小于等于第二个元素(atom2),若是,函数返回T,否则返回nil。
示例:
(<= 10 15)返回T
(<=“c”“b”)返回nil
(<= 2.00)返回T
5.大于
格式(> atom1 atom2…)
该函数(>)检查第一个元素(atom1) 是否大于第二个元素(atom2)。若是,函数返回T,否则返回nil。在下面第一个例子中,15大于10,因此,关系表达式为真,且函数返回T。在第二个例子中,10大于9,但9并不大于其后的9,因此函数返回nil。
示例:
(> 15 10)返回T
(>10 9 9)返回nil
(>“c”“b”)返回T
6.大于等于
格式(>=atom1 atom2…)
该函数(>=)检查第一个元素(atom1)的值是否大于等于第二个元素(atom2)。若是,函数返回T,否则返回nil。在下面第一个例子中,78大于但木等于50,因此,函数返回T。
示例:
(>= 78 50) 返回T
(>= “x”“y”) 返回nil
defun、setq、getpoint与Command函数
1.defun函数defun函数用于在AutoLISP程序中定义函数,其格式为:
(defun name[argument])
其中name………………函数名
argument…………参数列表
示例:
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
(defunADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
(defunC:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
注意AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
Absadsallocandangleangtosappendapplyatomasciiassocatan
Atofatoidistanceequalfixfloatiflengthlistloadmembernil
Open or pi read repeat reverse set type while
2.setq函数
setq函数用于给变量赋值,其格式如下:
(setq name value[Name value]…)
其中Name…………………变量名
value…………………赋予变量的值
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
Command:(setq x 12)
Command:(setq x 6.5)
Command:(setq x 8.5 y 12)
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
Command:(setq answer“YES”)
这个表达式中,字符串值“YES”被赋给变量answer。
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
(setq pt1((getPoint“Enter start Point:))
(setqangl(getangle“Enter Included angle:”))
(setqanswer(geststring“Enter YES or NO:”))
注意不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
(setq Pi 3.0)
(setq angle…)
3.getpoint函数
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
(getPoint[Point][Prompt])
其中point…………………输入一个点,或选择一个点
prompt…………………将显示在屏幕上的提示
示例:
(setq Pt1(getpoint))
(setq Pt1(getPoint“Enter starting Point》
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
4.Command函数
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
(Command “Commandname”)
其中Command…………………AutoLISP函数
Commandname……………AutoCAD命令
示例:
(Command“line” Pt1 Pt2“”)
“line” ……………AutoCAD LINE命令
Pt1……………………第一点
Pt2……………………第二点
“”…………………用于返回
注意在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
例1编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
编写程序前,必须确认这三部分。
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
输入 输出
P1点的位置
P2点的位置 三角形P1,P2,P3
P3点的位置
处理过程
从P1到P2画线
从P2到P3画线
从P3到P1画线
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
;this program will prompt you to enter three points 1
;of a triangle from the keyboard ,or select three points 2
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
4
(defun: C:triang1() 5
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
(setq P2(getPoint“\n Enter second Point of triangle:” 7
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
(Command“line” P1 P2 P3“C”) 9
) 10
说明
第1-3行
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
第5行:(defun C: triang1()
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter firstPointoftriangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
第7行和第8行:(setqP2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
第9行:(Command“line”P1 P2 P3“C”)
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
第10行
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。
装入一个AutoLISP程序
一般来说与一个AutoLISP程序相关的名称有两个:程序文件名和函数名。例如,TRIANG1.LSP是一个文件名,而不是函数名。所有的AutoLISP文件名均以.LSP为扩展名。一个AutoLISP文件可以包含一个或多个函数定义。例如,例1中的TRIANG1是一个函数名。要执行一个函数,必须装入定义该函数的AutoLISP程序文件。在图形编辑器中使用如下命令装入一个AutoLISP文件。Command:(load“[path]filename”)
其中Command…………………AutoCAD命令提示行
load……………………装入一个AutoLISP程序文件
filename……………AutoLISP程序文件的路径及名称
AutoLISP文件名及可选的路径名必须置于双引号内。load及filename必须放在括号中。若没有括号,AutoCAD将试图装人一个图形或文本字体文件,而不是AutoLISP文件。load同filename间的空格也可省略。如果AutoCAD成功的装入了该文件,函数名将会显示在屏幕的Command提示区内。要执行该程序,在AutoCAD的Command:提示行中键人函数的名称,并按下Enter键,(Command:TRIANG1)。如果程序中函数名前没有C:,可以通过将函数名置于括号中的形式运行该程序:
Command:TRIANG1或Command:(TRIANG1)
注意定义待装入的AutoLISP程序的路径时应使用斜杠。例如,如果AutoLISP文件 triang 存放在C驱动器的LISP子目录中,使用如下命令装入该文件。还可以使用双反斜 杠(\\)代替斜杠。command:(load“c:/lisp/triang”)或command:(load“c:\\lisp\\triang”)
还可以通过使用标准的windows拖放技术装人一个应用程序。要装人一个LISP程序,一种方法是在Windows的资源管理器中选中该文件,并拖放到AutoCAD的图形窗口中,选中的程序将自动装入。还有一种装入AutoLISP程序的方法,就是使用load /unload application对话框。
该对话框可通过在tools菜单中选择load applications或在AutoCAD命令提示行中输入appload将其显示。
load/unload application对话框
可使用load/unload application对话框(见图12习)装入LSP、 VLX、 FAS. VBA、DBX及ObjectARX应用程序。 VBA、DBX及ObjectARX文件被选中时会立即装入;LSP、VLX及FAS文件在load/unload application对话框关闭时装人。该对话框的顶部列出了选中目录中的文件。文件的类型可以通过在file of type编辑框中输入(.lsp)或通过在下拉列表框中选择来改变。选择一个文件并点击LOAD按钮可以装入该文件。以下为load/unload application对话框其他特性的描述:
1.load
Load按钮可用于装人或重新装入选中的文件,文件可以从文件列表框, Load Application标签或 History List标签中选取。 ObjectARX文件不能重新装入,必须先卸载该ObjectARX文件,然后再次装入。
2.Load Application标签
选择Load Application标签后, AutoCAD会显示出当前已装人的应用程序。可以向该列表中添加文件,方法是从文件列表框中拖动文件名到Load Applications列表中。
History List标签
选择History List标签后,AutoCAD会显示出以前通过选中Add to History复选框装入的文件列表。如果未选中该复选框,拖放History List中的文件会装入该文件,但木将其添加到History List中。
3.add to History
选中Add to History复选框后,拖放History List中的文件会使其自动添加到History List中。
4.unload
Unload按钮在选中Loaded Applications标签时出现。要卸载一个应用程序,在Loaded Applications文件列表中选中该文件名,然后选择unload按钮。未注册卸载的lisp文件及ObjectARX文件不能卸载。
5. Remove
Remove按钮在选中History List标签时出现。要从HistoryList中移除一个文件,选中该文件并选择Remove按钮。
6. Startup Suite
每次AutoCAD启动时都会自动装人Startup Suite中的文件。选中Startup Suite后, AutoCAD会显示出包含一个文件列表的Startup Suite对话框。可以选择Add按钮向该列表中添加文件,还可以从文件列表框中拖放文件到Startup suit1中。要从History List中添加文件,右去该文件。
练习1
编写一个在两点间画线的AutoLISP程序(见图12-4)。该程序必须提示用户输入两点的X、Y坐标。 不错,可全是书上面的哦 好象楼主也没有说是原创的吧? 我支持楼主的精神,谢谢楼主。我可是全COPY下来上班时看的哦!