1.defun函数* ~( t$ b' x7 m
defun函数用于在AutoLISP程序中定义函数,其格式为:1 N. Q* A3 n0 A% g- z2 u$ y0 o
(defun name[argument])8 Y6 ]+ B/ U( _3 o; J4 r
其中name………………函数名+ I/ h+ Q* f* r- s) f0 u4 x9 g
argument…………参数列表
) M+ ]( _$ J9 q/ X+ c 示例:& ^* J' z: w$ g5 p
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。; @8 t. K; D& G3 F7 T, [
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
0 I; G3 O" U4 [6 @(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。8 w! Q+ f1 W6 C$ e8 J( N
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。- ^* p+ L3 c1 ^6 |0 g( U1 m' ?7 x
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
, @7 E2 F! H) N% y7 N4 TAbs ads alloc and angle angtos append apply atom ascii assoc atan. ]9 d- ~- r2 N" j! W( k
Atof atoi distance equal fix float if length list load member nil7 S. Z! @% G/ j& q" Z& R* Q
Open or pi read repeat reverse set type while1 T/ `% }5 W. i( i, F' I0 w: k
2.setq函数( X$ n, X) y1 F' ?0 z4 W! |
setq函数用于给变量赋值,其格式如下:
5 A3 Q3 q- M/ S, | (setq name value[Name value]…)
9 |- g# A& D% z, ?3 _; Z 其中Name…………………变量名
& @# y0 G/ w3 I value…………………赋予变量的值+ D4 M( P2 J- J9 ~6 a
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。* ^) w- k3 D; F! R$ N
Command:(setq x 12)$ Q, q( X+ i) j* X( O. D" q
Command:(setq x 6.5)
3 V! @9 M/ ]2 {4 k7 n4 m Command:(setq x 8.5 y 12)
7 e0 J F8 G% _+ C" V% }3 G1 E 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。. R; D) }' R0 B- Y; k, P) J
Command:(setq answer“YES”)/ n0 ?9 f8 \# z! T/ Z
这个表达式中,字符串值“YES”被赋给变量answer。
2 S, s3 P4 E7 `2 S- B- D setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。6 c$ R% x" W* s3 s i# s
(setq pt1((getPoint“Enter start Point:))- i4 _$ Z: O) e( {
(setq angl(getangle“Enter Included angle:”))
+ }: l8 H9 P% @$ n) c (setq answer(geststring“Enter YES or NO:”))
) b. N8 M5 f4 U* @2 O; w; w注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
; f1 l2 ] Q7 z; [9 C (setq Pi 3.0)4 U! G w# M. l; ~
(setq angle…)
; Z; L, }( F; |! j2 Y9 S- q3.getpoint函数
1 h9 v D: f k1 A/ b! fgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
5 B# N- M [5 U! K' w; ^; H k(getPoint[Point][Prompt])
3 e! X* k, w3 C 其中point…………………输入一个点,或选择一个点) w/ g1 h7 M8 \! L
prompt…………………将显示在屏幕上的提示
2 c4 u/ ]. E: g4 R* I9 V1 y- ` 示例:
{& k) u+ w {9 C" J: o* K' l (setq Pt1(getpoint))& b: m) d( ~$ B7 I4 Q
(setq Pt1(getPoint“Enter starting Point》
( @! }( L5 a9 w e( ~ 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。# A# z. f% E. D( d# i
4.Command函数
! E( l$ d+ @ R, \, lCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
. i2 v4 B" N, h (Command “Commandname”)6 {* h, g* ?3 H/ i$ n6 J3 \
其中Command…………………AutoLISP函数
7 p1 t+ F* y3 \$ S7 C1 ]Commandname……………AutoCAD命令0 z+ K5 ~: d! B) _
示例:" l% \6 v9 m# w1 z! M
(Command“line” Pt1 Pt2“”). `! G, p3 J* } J
“line” ……………AutoCAD LINE命令5 W# f+ A7 v, F0 x2 J
Pt1……………………第一点
1 t- s8 P) w2 t( GPt2……………………第二点
3 B( D2 ?4 B2 @* N& i3 X& A7 d7 L“”…………………用于返回
0 H$ N3 B) Y, H 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。& G# Y9 F* n! u1 s; r. H
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
! j5 Q6 x" G% L4 X& g不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
8 N4 o3 `- g c( z# G2 v例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
2 q1 _$ i4 F' ]5 @0 g# V 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
+ ~! ~: P" l3 m) Q0 z, |% n 编写程序前,必须确认这三部分。
. q# e& j4 p% i m) M) K# F4 x 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。, W+ _3 q7 a w% n) i+ Q/ C, U
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。% Z# o Q" E: s% O6 K2 k; \" {
输入 输出
: d) z4 R* u. D: L7 K3 x P1点的位置
' I6 t, d0 u+ h. d" o P2点的位置 三角形P1,P2,P3
: M# o; t, i4 H! d! V P3点的位置 p" u( j, M3 K' w1 C7 y& E9 R
处理过程
; G' r! L4 ?" E0 n 从P1到P2画线- c) t! D w5 N8 ?, c2 f
从P2到P3画线2 e- d* [3 c2 S6 d7 h5 \" m; c
从P3到P1画线
x- P3 B; N Y: w下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。; p/ k+ W- y0 ]9 s3 Y; s& p
;this program will prompt you to enter three points 1, _& M8 S' D2 T0 V0 V* m: i3 d! `
;of a triangle from the keyboard ,or select three points 2
; c/ I0 `' H8 X6 }- t4 ?% [;by using the screen cursor .P1,P2,P3 are triangle corners. 3( r" g9 ?( O2 H5 |2 v3 R
4% j( e# s! ]' P" e2 f1 N% j
(defun: C:triang1() 5/ I' G# }6 r- Z# u' u! O
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
! [6 a: \1 S# Y (setq P2(getPoint“\n Enter second Point of triangle:” 7
+ r* M- J* _" f+ R. X (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
# r' w) Y& I2 ]# d (Command“line” P1 P2 P3“C”) 9! E/ j; ]! I4 e9 m8 Q
) 10, S Y/ G! u$ H H/ o# E0 w* N
说明3 A' j' n3 ~- U' m! {9 `
第1-3行
3 {8 e* p3 K$ g2 o前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
2 @7 ~% U# _# |1 R) y- v第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
# U2 T4 R- i" w# k1 i. A第5行:(defun C: triang1()/ D& w! D$ n( m; o
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)) R/ ?( D0 V9 r- E2 E8 u
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
; `2 S: j, y- P5 V1 p1 k本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)5 F Q6 `2 Y) Y8 A+ A
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
c# o1 T! u# H/ z0 }5 i这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
- A& c4 R L/ g4 v7 g2 s9 z* g第9行:(Command“line” P1 P2 P3“C”)( E, i/ r5 i! Y, u3 c
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。: C3 Q( r2 X) n& ^# y% F( V. C
第10行
3 D0 X7 ]0 Q1 d0 f6 u3 \, M本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |