1.defun函数! U6 v2 E! {& [8 L2 A" O
defun函数用于在AutoLISP程序中定义函数,其格式为:
$ t$ e1 c7 M( q, z6 Z# b- @& ? u (defun name[argument])
! e1 T2 t- F9 G2 C* U' ^ 其中name………………函数名# z; O1 I# U& F3 N
argument…………参数列表
7 I! d' w. l3 l& n5 V) G: n 示例:
1 q- y$ ~, R$ V(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。. w4 r7 Y7 d; i; Q0 _
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。; |. t9 I9 s& T: G
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。6 Z6 U# D. Z8 G
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
$ @( ]) ?# a; s注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
/ s; d7 t0 x- H" }* T$ LAbs ads alloc and angle angtos append apply atom ascii assoc atan
8 o3 e) @7 {3 | H! XAtof atoi distance equal fix float if length list load member nil9 ]- g5 _8 L# u' t; [0 W
Open or pi read repeat reverse set type while
# H4 [' n; S* y5 i2.setq函数
# ~; x3 T. Q; D Q setq函数用于给变量赋值,其格式如下:
# x/ ~& b; |3 z! Q (setq name value[Name value]…)
+ \) G1 Q: N6 l! X 其中Name…………………变量名
5 L) \7 h7 z3 h3 V3 y0 u6 e& f6 l value…………………赋予变量的值4 X Z' W6 Z; ?. e p, b6 z1 R; g
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。4 e6 {4 V0 u0 a, v% A' n
Command:(setq x 12) i) ]1 i4 [- V- b7 L! i+ q
Command:(setq x 6.5)1 K2 ]4 u! j+ M
Command:(setq x 8.5 y 12)9 x8 |! a) L, D8 f3 X' z
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。: I' D* F3 ?) w- o2 S+ m1 ?* `+ Y
Command:(setq answer“YES”)) b) M* l G& x3 }
这个表达式中,字符串值“YES”被赋给变量answer。4 H( u d% N9 X$ Y. x; U# b3 b
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
! e0 Z: f! m0 }/ f8 N3 |$ z (setq pt1((getPoint“Enter start Point:))3 M' P2 e, ]4 d. z4 u( p% S
(setq angl(getangle“Enter Included angle:”))
( I7 }8 G/ @* d% r+ W% p4 X7 X* F8 v (setq answer(geststring“Enter YES or NO:”))
! o' z: J1 p4 T# h: x6 k, t1 ^注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。# |, c; Q5 K: z# F' `7 l- E
(setq Pi 3.0)7 n+ O- g- u2 i( f; ?
(setq angle…)& @% n. ~" B. P$ i( X/ _. q9 ]
3.getpoint函数
& z, C" x, A7 Q% e+ O' j8 ogetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:' a% e8 f1 l& w0 [1 d
(getPoint[Point][Prompt])+ G( c0 u6 p5 R% A$ w
其中point…………………输入一个点,或选择一个点. F+ e4 i& U$ g3 j4 ~" A
prompt…………………将显示在屏幕上的提示7 s0 m# V k) O$ H* ?# m& z
示例:5 z1 o, R8 L) s1 E! f
(setq Pt1(getpoint))7 J7 M: M2 q8 b3 E
(setq Pt1(getPoint“Enter starting Point》
7 g. z9 W6 t" d: h" w/ N8 h8 T( u" j 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。) C+ R2 j+ O: h5 g- O2 v) a
4.Command函数' {1 ]3 X2 p1 }5 C4 i6 @0 Y
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:% p- ^5 i- S+ f* g
(Command “Commandname”)$ a6 n& I: v9 d: F
其中Command…………………AutoLISP函数0 o8 s% \2 g: P5 m2 B
Commandname……………AutoCAD命令. O1 j4 N* C) `. |4 G# M! H
示例:
) r4 H/ e3 e' S(Command“line” Pt1 Pt2“”)
- g6 A; @2 o, z7 h# \) k5 I& N“line” ……………AutoCAD LINE命令
% B0 \6 p6 @3 h5 tPt1……………………第一点& J* L+ s c* T) @
Pt2……………………第二点# u. g) n" H2 b
“”…………………用于返回
0 \/ J, `: {( h; ~. ^7 N u6 S# _ 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。. P5 I! J5 H6 ^
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
' n! o/ e: b7 ]$ N6 O不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
; L* |( t/ Q; b; b1 w& u. d6 I例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
( m5 y0 A X0 m& ~( d 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
( T6 ? ~2 e2 b* ^+ ^2 t( T 编写程序前,必须确认这三部分。
1 b2 R- e, N' ?3 `: W 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。) l+ r/ Q" L& W: ^2 N4 v3 R
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。9 x: u, d# l5 T; R' |7 m" g$ ?( m
输入 输出5 }2 t0 Q% ]9 w
P1点的位置+ i2 ]/ Y8 @1 W1 A) s5 u
P2点的位置 三角形P1,P2,P3& i: _6 M: S2 ?6 v$ J' H- T
P3点的位置$ [, E' N& D0 G+ i1 }0 ^# [8 ]
处理过程) c% n4 }6 @# j( H0 S3 N: Z
从P1到P2画线
4 H8 }0 `, c! D0 \$ j. V 从P2到P3画线) z2 S! P" q0 N9 Y F
从P3到P1画线. r1 a. X! ^2 W' q. O. V1 a1 V
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
5 f' N( ^; v8 ?) m. Y. ?5 l;this program will prompt you to enter three points 1
- T- |( N" } U9 D/ [1 M;of a triangle from the keyboard ,or select three points 2
) I% y+ I; a. i! z# m5 q2 K. P( S;by using the screen cursor .P1,P2,P3 are triangle corners. 3( V: H$ k8 s. O' D, [0 ~: w
4" p- S l9 d: `. l' [* [
(defun: C:triang1() 5- t8 k7 ^; L2 J f' z0 f5 p% T
(setq P1(getPoint“\n Enter first Point of triangle:”)) 62 S; c* X* \- [' }. z: Y7 F
(setq P2(getPoint“\n Enter second Point of triangle:” 7* p) X$ P; b! \" Y! L! o
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
$ M7 n5 ?' z! L8 I, ~; _ (Command“line” P1 P2 P3“C”) 9
$ m- o# t4 Y1 N H8 r0 h! X4 c) 109 M! f. i1 ?" W- Z# ~4 i9 j, K9 {
说明9 c+ q1 J4 z$ S$ E/ z/ F
第1-3行
- l7 l+ r; g: J4 \( k. V- u前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
- T1 i& a6 T* o- Q第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
. V m3 H: W0 m5 E/ `+ X9 p第5行:(defun C: triang1(); H9 Y' p2 E; B7 j6 C. i* r
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)3 L2 o+ a+ Y' h' E# T* S! }1 b
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
# }/ E! k0 w' \1 o Q% _本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)) q! e8 L/ z: k$ {: ?7 h C
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
/ G/ R; ^/ s& ~. G; N这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。( a( A$ u$ C( A8 ]1 l
第9行:(Command“line” P1 P2 P3“C”)
' s1 A6 ]" Q9 c. E( X本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。$ v4 D! T* |# U+ Z$ u
第10行
' ^( D2 ~% }* z# {9 }本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |