1.defun函数
0 K! U) k3 z/ Q; |5 Hdefun函数用于在AutoLISP程序中定义函数,其格式为:
1 | X6 }. o9 V+ T; e (defun name[argument])$ s& F" d" B5 i' h+ |) r
其中name………………函数名+ j5 n' w6 R: H. o
argument…………参数列表
' v0 ^, H; ^& x' X 示例:- c6 w- E1 m5 x. L% u3 F
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
# P* C1 O: N( n$ a* i: H) `0 f! D5 S(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。% C+ [3 x5 u: W# [: R, }
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。3 S+ r* J$ U4 Q; U6 \5 Y
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
( J" F$ m3 V' o! N* ]注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。, J. y# D' \$ K- G4 p9 F
Abs ads alloc and angle angtos append apply atom ascii assoc atan
6 Q: K$ f6 A) ~! y) P: g( iAtof atoi distance equal fix float if length list load member nil
( Z$ W; {( A% J7 r6 sOpen or pi read repeat reverse set type while3 m* @9 ^0 r' }
2.setq函数4 t1 q+ p+ Z3 x- g
setq函数用于给变量赋值,其格式如下:; u1 \6 o- x, \, L3 m- J+ V
(setq name value[Name value]…)2 s9 ^* Z/ |3 v. ]1 O' w
其中Name…………………变量名
5 f# n' J" A$ S) z- \ value…………………赋予变量的值
, M( X! o* }; J: @+ P4 s 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。6 j9 w$ A1 b, ]; M/ I( e' V7 b
Command:(setq x 12)
6 ~/ b: k- r8 m8 ~# d Command:(setq x 6.5). L6 |8 i6 p3 u' Q! c4 @2 @( Z
Command:(setq x 8.5 y 12)
! O& X' S% Q- u& q$ o' g 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
1 }; {6 Z8 T/ `$ L2 k Command:(setq answer“YES”)* c5 V+ _+ G9 G" @. c- R# z
这个表达式中,字符串值“YES”被赋给变量answer。) k3 r- T% \) a+ l' |6 a$ A! d
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。8 o+ K7 P4 t8 B1 G- O0 ]
(setq pt1((getPoint“Enter start Point:))
4 [2 q% y. }& s (setq angl(getangle“Enter Included angle:”))8 z* S Q5 [6 }- v% _! Z
(setq answer(geststring“Enter YES or NO:”))8 N. e8 ?0 V/ \: H( l T
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
0 O$ I# M8 f7 q" z1 t9 ` (setq Pi 3.0): Y* D* y0 O' R# g
(setq angle…)
( }9 W% d8 N3 \4 j& Z* R3.getpoint函数
* _, p3 ]7 R1 e1 F- u! ^2 mgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:3 w# L( a+ [- S( B; l
(getPoint[Point][Prompt])
( A4 _2 e [9 M0 j 其中point…………………输入一个点,或选择一个点' E, D1 W' d, J, e& q; } R& e8 T: Y
prompt…………………将显示在屏幕上的提示" ?6 N6 ?/ N3 o5 h( ^
示例:
& o2 s; @( T0 O/ \) \4 s/ o0 \ (setq Pt1(getpoint))
1 w v7 I: ~% Q! R5 M (setq Pt1(getPoint“Enter starting Point》1 r5 U/ S a: }) l
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
; V k- T* |& f M4.Command函数% q) _7 ]! N5 e( d# S2 ^
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
$ n: ^- f1 S8 [; [+ F7 Z (Command “Commandname”)$ f* `+ w% r8 X- k
其中Command…………………AutoLISP函数* U4 {' A1 C% k' b& r
Commandname……………AutoCAD命令
" f/ t5 z& S5 `: N+ ?: L. `示例:0 Y3 A8 v b" z' d
(Command“line” Pt1 Pt2“”)
: a0 p' s& i4 \“line” ……………AutoCAD LINE命令8 v; T8 N# h8 {7 n0 B# j1 M
Pt1……………………第一点
% H1 t' u% y, o* s0 nPt2……………………第二点
1 W. O# O- i( G! T6 V: U1 J1 `) I“”…………………用于返回* t8 k0 N* M6 g8 y# J4 b
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。9 s0 X: M: B3 {7 L* E
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。, t C8 A$ S& J1 @: j E$ z
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。- e7 p) W8 ~; `& [' Z
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。. e4 |6 Q4 r3 U& y2 w/ v6 J0 o
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
A6 H$ m$ C4 c6 _/ y/ {" T 编写程序前,必须确认这三部分。2 J; Q X/ a6 l- O
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
4 `2 Z1 }* a" h/ n5 N# g6 x4 ~ 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
/ l2 H! p9 _' D7 I9 f% Q 输入 输出8 {- `. \. u) }8 {. s3 Y( h( G
P1点的位置
2 b; l( M; ]4 g! i8 f P2点的位置 三角形P1,P2,P3
4 o+ c0 |6 ?+ E9 L P3点的位置( V! O( f. O( a, T: F5 w
处理过程* u4 ?# [3 E2 W' ]
从P1到P2画线
% J, R# M* F8 l: J& } 从P2到P3画线
( U9 v- v# t1 Y/ P# }2 J 从P3到P1画线" h1 O' x3 i$ ^2 L% N4 j
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
, f0 R: L- ]6 Z# ^8 J2 ~4 n;this program will prompt you to enter three points 1; V3 U: D5 J; G, |/ ]* Z: Z a
;of a triangle from the keyboard ,or select three points 2
p/ Z! s7 [& ~;by using the screen cursor .P1,P2,P3 are triangle corners. 3. y; j3 v/ Z3 E; O: i
4
7 S, v f3 h- F% x* F(defun: C:triang1() 5
: `5 L n* q- u( l (setq P1(getPoint“\n Enter first Point of triangle:”)) 6/ U/ a" E6 y% e8 c2 v9 e
(setq P2(getPoint“\n Enter second Point of triangle:” 7
- V4 O% p' I1 {" ~* X# A. { (setq P3(getPoint“\n Enter third Point of triangle:”)) 89 x9 \! I) X1 _+ v3 g$ ?: w
(Command“line” P1 P2 P3“C”) 9
" c i) x M# |/ Y- U. s* w) 10
$ ?& M9 D; }" K# r( w; K说明
5 t5 }5 {8 U) W% _& I) @第1-3行! s ?5 S: |- ~* O. o" |2 z6 l5 |
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。4 T% H# c. n1 {0 c8 `; I, l, L, r
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。+ b& x, t; g8 o: x' _2 e5 C
第5行:(defun C: triang1()/ t+ l6 H/ D D2 y9 }
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
, | i9 E) N& a* Y; \. q# N第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))* S- J% O$ _) l+ V# |
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”): U# y, A& T6 S& o. L% P
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
' n( g6 k% R0 e: k4 w, U6 \这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
7 G- @* t) ?2 C1 \! B第9行:(Command“line” P1 P2 P3“C”)
5 a x4 f" F, B5 c2 c( k/ _+ N本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
5 ^8 w1 h8 R% J* q2 d第10行5 q3 M' A' Y% o; R! a2 a
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |