1.defun函数
0 C4 }# O, c9 p. J+ a3 }' J2 Tdefun函数用于在AutoLISP程序中定义函数,其格式为:
3 i. s1 a3 `7 X( V b2 n% e6 I* f (defun name[argument])1 T# H% ?: c! f/ o A
其中name………………函数名! O+ Q) A" Z( B: E o0 a
argument…………参数列表
6 V8 S; A1 D; f1 r5 j 示例:
4 [. @1 W: ?$ a! v(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。# u5 y; p3 O5 E5 N+ a' i! a# L% z
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。4 P* B6 R5 R" }7 ?) }
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
+ A) I3 H& R9 _" L(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
. q: j; |$ l4 p注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。; |! z r5 ^1 @: \4 L5 k$ r
Abs ads alloc and angle angtos append apply atom ascii assoc atan' W2 J2 h/ n5 C
Atof atoi distance equal fix float if length list load member nil
& l0 A4 Y# D3 B- V( BOpen or pi read repeat reverse set type while
, F' R- F# B+ k4 r2.setq函数
# h w2 T" x) ]$ z% Y setq函数用于给变量赋值,其格式如下:" B- R5 s( r- h9 ]8 g
(setq name value[Name value]…)5 Z1 ^9 e, O+ l; s
其中Name…………………变量名( M# j2 A) U- i
value…………………赋予变量的值5 w9 h) C; k/ b; e7 J0 U
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
5 s) u. G' K. I3 ~+ } Command:(setq x 12)9 G4 n$ H" V# W- S5 a$ ^
Command:(setq x 6.5)
$ t, d: G+ ~+ j1 E- X; M Command:(setq x 8.5 y 12)
" L* H( E: B% ]0 m' o6 t 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
6 c; h: j6 G! T, ?& u' Q7 v Command:(setq answer“YES”)
8 }4 i4 w- m$ H/ N0 M 这个表达式中,字符串值“YES”被赋给变量answer。8 b& H+ |3 x2 ?& T" ?
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
- }# C9 Q6 p+ K% ?. M8 c$ ` (setq pt1((getPoint“Enter start Point:)): `; \- j. ]' k3 o
(setq angl(getangle“Enter Included angle:”))
: O$ Z: n6 A* K (setq answer(geststring“Enter YES or NO:”))/ ]6 a3 O( _( K" ^/ w( A1 v8 [0 {
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
' i* s+ r: u' e, g! R (setq Pi 3.0)
9 \! ~- t+ J8 D5 ? o( ] \ (setq angle…)
5 z+ h% h' @1 w! h2 X1 `* |3.getpoint函数6 x$ S4 F. O# D' [- B
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:1 Z: X7 }/ z* H6 z* w7 H
(getPoint[Point][Prompt])
4 f$ g& T% j( s7 e% M( q# c4 M3 E 其中point…………………输入一个点,或选择一个点 I& H, ?& m3 F0 ?/ C
prompt…………………将显示在屏幕上的提示
& e3 D6 T" }3 j% | 示例:
% p0 y" ]) z4 [" z \ (setq Pt1(getpoint))
: ^/ Q+ `+ {+ ^; z+ p* ?+ K$ D (setq Pt1(getPoint“Enter starting Point》
; g; F2 R! t9 M& m; U 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
+ V2 t6 r& v% f3 a) A4.Command函数3 A/ ]' F' L; { H& J
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:0 a1 v5 H& F% Z. y
(Command “Commandname”)4 t: ^; z: ^. [
其中Command…………………AutoLISP函数
" @* i7 S- w) n! BCommandname……………AutoCAD命令7 }2 A! i7 _. z( M6 V1 b5 m
示例:0 s3 b6 z+ H8 b0 S7 A/ i0 S
(Command“line” Pt1 Pt2“”)
) I2 B) U" }1 ~- f2 t“line” ……………AutoCAD LINE命令
- X% o6 t) l, ZPt1……………………第一点# B, Z& P8 _& J
Pt2……………………第二点
, [- f G+ `- }) C“”…………………用于返回: S7 o' K/ ?. b9 d# \* s
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。, l/ r, W8 x0 H2 N( x* Z& H7 z8 K6 t
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。% [% F; K* p- t4 }3 |
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。5 P; j& k; S9 \- ^
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。 |$ z6 }% \0 {/ v6 J; o
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
9 B9 k& @: L0 X. q5 w 编写程序前,必须确认这三部分。
\/ Z6 m# `3 T( d& S- v' M 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
* @& @: o6 v; w C. h 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
/ R/ P0 G; ?+ f 输入 输出
1 N3 w8 u0 s1 w0 P! H0 N0 v P1点的位置
& |" ^6 x; O4 K P2点的位置 三角形P1,P2,P3
+ g- w* J- B" h t b4 q5 m P3点的位置4 Q+ G0 I, N. ]$ m
处理过程
$ L1 h, C) z- [, }8 M. e 从P1到P2画线; W: Y9 j* j0 ~" q
从P2到P3画线
. W5 D) b) K A: p/ F 从P3到P1画线
+ h4 f' p% p) L S9 f0 p2 u' F. r下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。9 i- S- c, M: x7 y- u
;this program will prompt you to enter three points 1" s- C/ v. |5 y
;of a triangle from the keyboard ,or select three points 2: b: |3 w5 b2 z) T* k9 T- O
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
4 H! O2 u8 [3 Z3 j0 s 4
: q( ^' X5 i. O' H. C(defun: C:triang1() 5
- {. M8 t' N( x* N( o (setq P1(getPoint“\n Enter first Point of triangle:”)) 68 \; E$ |7 w) s' n. r. z
(setq P2(getPoint“\n Enter second Point of triangle:” 7
3 M3 q2 t' [- K) ~* p+ U7 `& h (setq P3(getPoint“\n Enter third Point of triangle:”)) 89 ~8 |6 d) ]% e3 O# |
(Command“line” P1 P2 P3“C”) 93 E8 N4 F! Z3 A) m! m) ?1 @
) 10
/ m v3 N, e. K0 m+ T6 H5 `7 Z0 G说明4 z5 {: R& ?. N/ P, H4 [/ X
第1-3行+ {: w+ _" F5 u) s* h/ t }5 W
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
* p0 ]/ v5 ]+ d( y! ^/ n- [第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
. x9 a1 q/ B* S0 R0 F; Q第5行:(defun C: triang1()8 ~! r' k0 E6 B7 Y7 v' v
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
: O8 R1 G% E1 a9 \+ y: b5 S第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))+ Q, i9 t1 c: M
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
|7 j2 ?6 C' f5 b0 \第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))& f2 w( D) N: j4 X* \3 K
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
6 W- g4 O* Y" T; U% h7 N第9行:(Command“line” P1 P2 P3“C”): J' h$ ^" t) V) Y: c! H
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
. K' a' S3 o+ ~; c& {( w第10行
! y; T3 U9 ~5 [. {' g3 Y本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |