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从程序外部获取它们的值。
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序执行期间保留其值,而且只能在它所在的程序中使用。
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
Abs ads alloc and angle angtos append apply atom ascii assoc atan
Atof atoi distance equal fix float if length list load member nil
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”)
这个表达式中,字符串值“YrS”被赋给变量answer。
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
(setq pt1((getPoint“Enter start Point:))
(setq angl(getangle“Enter Included angle:”))
(setq answer(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函数。二维b三维的点应考虑定义在当前用户坐标系统(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各画一条直线。弄清这三部分就会使编程过程更清晰。
处理过程2于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明2,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
输入 输出
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 first Point of triangle显示在屏幕的提闱内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline")
第7行和第8行:(setq P2(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定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定A已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。