1.defun函数
, Y* Y) ]& l1 \* U0 U) ~defun函数用于在AutoLISP程序中定义函数,其格式为:
! V* s' H% r, t7 m, X; z/ M" D (defun name[argument])
) I* x9 {$ D o% \/ Z S/ m 其中name………………函数名
+ i) b: O% ?, H7 b* o8 v argument…………参数列表
6 M$ A1 I0 E% A9 b) c B 示例:
( A- _4 T( ^% N; t(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。) t6 M, D3 V ~* u# {& o6 H
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。 d4 S3 a# B$ l( i o+ ~
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。- G: D' v/ t" q
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
# F/ N4 \' M9 z8 k注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。2 [5 w, m# u# ?2 u
Abs ads alloc and angle angtos append apply atom ascii assoc atan9 ] X6 V( g- B
Atof atoi distance equal fix float if length list load member nil
( S& W: j/ f7 O8 C! mOpen or pi read repeat reverse set type while
, J X: s7 G! n0 m2.setq函数
9 W! [, `$ U! ]$ A5 H: Q setq函数用于给变量赋值,其格式如下:
* m2 J; T! m$ P (setq name value[Name value]…)3 m- d- F3 e" E6 p
其中Name…………………变量名4 J0 t+ S$ j; e; ]- @
value…………………赋予变量的值# }( E9 H6 d7 F [/ h; a$ D
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
9 S& n9 d! s% {& X Command:(setq x 12)
/ S9 |- b& I6 s4 D4 H# o Command:(setq x 6.5)
! i) |8 k& e' y; H+ \ Command:(setq x 8.5 y 12)
- E9 }: D. k* D7 g0 } 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
% u! C; `7 H: y6 l9 z Command:(setq answer“YES”)$ Q+ h- u* x8 D, T
这个表达式中,字符串值“YES”被赋给变量answer。. z n& w* F& V$ a9 T8 J& S' O3 i
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。2 X& ~/ @& H; v4 |. f
(setq pt1((getPoint“Enter start Point:))
$ V6 f" ^* [ n (setq angl(getangle“Enter Included angle:”))& }8 f4 B# r& |
(setq answer(geststring“Enter YES or NO:”))
5 Y* C6 L0 k `注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。& G0 ?. C& P8 Z, y& u$ q
(setq Pi 3.0)) @2 E. H! f: \9 i- G9 ]
(setq angle…)9 }4 F: D5 Z. c* A
3.getpoint函数
0 z, W% `! N! }7 J& i/ Mgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:4 z3 ]! z1 [$ a( k
(getPoint[Point][Prompt])
9 y' c" u) ?* ^" |5 O, v# ]! \9 ^! d 其中point…………………输入一个点,或选择一个点
3 t. u' C3 j/ `* |2 J prompt…………………将显示在屏幕上的提示6 E- j1 ]8 F2 d8 ~% {4 _+ ]! I
示例:
2 F! s6 [$ U6 h3 J( y. d (setq Pt1(getpoint))
1 r3 d2 x7 F+ w (setq Pt1(getPoint“Enter starting Point》9 s! C1 R8 F; c4 [4 U0 K
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。, z) ?9 X7 K# N. j& P" w. |; j
4.Command函数) B: @& Y# m2 C# a1 X2 g7 y% {& _
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:( q* k2 }9 q/ ]- o+ [+ o
(Command “Commandname”)
9 ], @. q+ W4 z, M 其中Command…………………AutoLISP函数6 H$ N7 F. Q+ b
Commandname……………AutoCAD命令
' O/ G$ a5 S! W/ z6 O8 C: T. s, S示例:
' `6 C$ X) B; S6 Y" @( ~$ f9 {6 A(Command“line” Pt1 Pt2“”); p1 }" o, k! J8 f: R; ]
“line” ……………AutoCAD LINE命令6 {, f7 j! a; x1 o9 m. g+ B& i, {
Pt1……………………第一点( L5 X. K3 C0 ]- {7 n
Pt2……………………第二点
) Q2 z1 U7 D6 i, Y) p! w“”…………………用于返回
7 O) e. x2 G4 t+ @. z 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
( C4 S7 I9 u* c5 L9 x' qCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
# F. j" a6 O# Q! ?+ c+ F不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
# X6 N1 {. I! [例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
- _) n7 ^) k3 _" \3 G+ \ 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
. s U7 R; o7 Q. ]6 N 编写程序前,必须确认这三部分。1 x1 o; I0 d) N* S: e
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。; P+ L4 `$ }6 i% G3 v+ V
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
! I3 l2 @" H" y 输入 输出. ~5 |3 B6 S& Z- D: |
P1点的位置
, w& C% s7 e3 \5 F P2点的位置 三角形P1,P2,P3
1 {0 I; i6 f4 {: H P3点的位置+ J! t/ ]( j5 _# f# n/ d7 C
处理过程
4 [1 j* h3 J- q' @9 @ 从P1到P2画线
( y; S' O) F D, o 从P2到P3画线
" b2 W/ |' [# H. n, {) S8 u 从P3到P1画线
6 R/ K1 q- |8 X! v) e5 d0 }, \" O下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
1 Q2 u4 Q* Y- x; O;this program will prompt you to enter three points 1
% I6 ^8 H3 ?8 l1 [;of a triangle from the keyboard ,or select three points 2
0 M3 p) K0 \3 Z;by using the screen cursor .P1,P2,P3 are triangle corners. 3
" Q2 f8 L1 N+ P 4( [6 u/ R& L) m# I# \! y7 O9 \
(defun: C:triang1() 54 z$ m' W" u, J: R( }
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
[ Y4 t5 F8 W% @5 Q (setq P2(getPoint“\n Enter second Point of triangle:” 7 i4 i% L$ L5 z( O3 R* C
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8' _7 A- T q9 P5 a
(Command“line” P1 P2 P3“C”) 9$ l6 I+ K/ F4 b8 K! t E
) 10! ^2 c" X. h1 c. T7 c. }
说明
8 E. j& _ n" d( P7 c7 k3 ~第1-3行
5 }, C" r, G) k; I! v) | B% n# w& w) b2 g- Q前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。! C0 ^7 O8 B9 H. _" X& m3 D& N9 S
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
4 O' b) f5 r0 d# p/ @8 H第5行:(defun C: triang1()* Y$ W% r, e Q) O" r3 W
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)0 f6 n; o, N+ A' x
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))+ w7 O1 t4 U% O
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
5 a/ N" S- G v. Q. F0 E0 s) O" g# H第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
4 q5 v1 i c( J _9 r2 U这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。4 h; z2 }$ ?* a
第9行:(Command“line” P1 P2 P3“C”)8 H( N8 X* G x! K' u, k! M
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。' ?3 C6 ]" d2 w: U+ h
第10行( N* A9 R1 \0 r/ d9 b# p- a6 \1 f* F
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |