1.defun函数
! W8 L5 \' O. L% o: C) ~# bdefun函数用于在AutoLISP程序中定义函数,其格式为:
) M o7 T/ |% p# {! s4 j (defun name[argument])0 h- \% j$ l# d9 J' t: x7 ~, k) C
其中name………………函数名6 s- X0 K) I8 U
argument…………参数列表
" x; S' W3 b2 r) u/ D$ @ 示例:
9 m. r2 _2 w! ~' \* P6 T(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。( [8 |, X; V3 J
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。) j7 Y- D- O/ x! p
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。2 f" g c9 ]* z
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。+ U) y3 y, g! f, w+ ?6 e" s
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。8 w, |) b% }( x. I3 `
Abs ads alloc and angle angtos append apply atom ascii assoc atan: f' U- ^5 W; f' V6 G' J
Atof atoi distance equal fix float if length list load member nil+ Y+ p+ F! M7 L) C4 `
Open or pi read repeat reverse set type while
9 S) ]* J, `/ `/ X' x+ ]) L$ {2.setq函数
& Q, a& o* X, r setq函数用于给变量赋值,其格式如下:' Q+ P: z7 [+ ~5 q( H- i
(setq name value[Name value]…)
$ T0 u @" G% F 其中Name…………………变量名" S- V# x, e3 }! s. ]4 T+ @
value…………………赋予变量的值
. ~* X& t0 C% R5 \* g 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
& J9 Z# G! d( ?1 T/ [) b$ | Command:(setq x 12)& Z. T$ }6 w* n( Y! g
Command:(setq x 6.5)
8 t- ?5 f( `5 X Command:(setq x 8.5 y 12)
" ?) v" j2 g: G2 i, D 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
+ r S! t* E* z D' r* Y+ o Command:(setq answer“YES”). M" x* v$ b* f" g; ?
这个表达式中,字符串值“YES”被赋给变量answer。* J& e* c1 D" E/ E
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
' }1 u5 E" _1 G% ~ (setq pt1((getPoint“Enter start Point:))
) x p! A* o B' l (setq angl(getangle“Enter Included angle:”))0 m3 _3 R1 f+ N+ M0 F; s! H2 s; H/ t
(setq answer(geststring“Enter YES or NO:”))) j z5 P0 P; ~$ n
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。9 B2 E& ?4 G: D
(setq Pi 3.0)
! R$ S- c' |" [3 R k" s* g (setq angle…)
/ P( t) |$ x& T3 T, U: u& k3.getpoint函数+ m) x' X& e* N: s3 X' h+ ]. @8 B7 Q
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:5 N- w2 E; M9 |) j3 V/ {4 m
(getPoint[Point][Prompt])- ~2 a& U; l; e" g4 ^2 l
其中point…………………输入一个点,或选择一个点
$ ~+ p! z! l1 ]" a; z3 j prompt…………………将显示在屏幕上的提示
8 D; B1 W3 |3 ?6 v9 @( V 示例:; }6 d% O. `6 q' `7 N! r9 q
(setq Pt1(getpoint))7 w8 Z1 x5 S" \" X: H
(setq Pt1(getPoint“Enter starting Point》& }' V, _ \. [5 _
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
0 K" F# ^4 t- ~( N' Y4.Command函数
7 l6 J6 S6 A" z$ LCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:9 N2 C8 ^! i g/ b0 s; x8 v
(Command “Commandname”)5 \# W+ y4 Q& C" p( [) N8 A0 @! J
其中Command…………………AutoLISP函数4 T0 k9 f0 R3 F5 ^; ~* }& t9 _
Commandname……………AutoCAD命令
2 d7 v! b7 U% V; V3 M1 i% |' d示例:) ?* f# U: q% _. B G& a! P
(Command“line” Pt1 Pt2“”)
# j' [% W2 o R" E* L1 S“line” ……………AutoCAD LINE命令! t w7 o4 y# x5 z6 |1 E
Pt1……………………第一点
* g: H) ?: T* T; {5 K% {& ZPt2……………………第二点4 x: D* i/ t# n& T- Z
“”…………………用于返回, Y5 B. m6 @; F# \
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。% K; N6 }" b% `
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
$ _9 K7 e1 J6 `" {不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。: {# J" c9 _4 V% Y: t
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
4 s" R& t* h% G j6 i S 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
# h( g+ W2 R. n4 K 编写程序前,必须确认这三部分。
! u0 T' E: i2 R& w 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
9 ~# Z8 j' a- D. @1 f4 u4 ~ 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。3 h, ^$ K6 @4 L7 @
输入 输出
5 X6 z" K; {) d" o, ` P1点的位置
; [3 Z' h# G/ g P2点的位置 三角形P1,P2,P3* U# c7 c Y! @
P3点的位置2 p+ i; H Q2 m5 t9 E% K; b
处理过程
* R/ H, {6 c; C8 ? 从P1到P2画线
/ G7 `9 K4 i% _1 L 从P2到P3画线
- O* a& H3 h, j! ^" B3 t 从P3到P1画线) Z3 K- Z4 U$ Y! C" O2 ^3 z
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
$ P& f2 a2 ?* l6 C$ B;this program will prompt you to enter three points 15 P2 a+ z" ^3 X! r6 O- h9 c' I% i
;of a triangle from the keyboard ,or select three points 2
: Z1 x, n- ?) f% X;by using the screen cursor .P1,P2,P3 are triangle corners. 3
$ _7 T' }3 h- h* h 4
& d8 ^( ~1 A9 ~' z1 H/ f(defun: C:triang1() 5
7 b K ~9 _( r2 ~8 n: | (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
4 e( a0 J! m- o% ]1 I& x (setq P2(getPoint“\n Enter second Point of triangle:” 7
: w# |: \- _7 }- N, W8 | (setq P3(getPoint“\n Enter third Point of triangle:”)) 8" ^8 o: L. {/ U0 E2 t" b& F
(Command“line” P1 P2 P3“C”) 9
7 I1 b. y: Q# `) 10
) M1 e6 ~5 S4 @8 j( I说明1 J, M8 R8 M0 z/ }
第1-3行8 q+ q: z! G: c3 w5 E
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。% N9 a4 B' D" F$ |0 i9 G
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
; h- Z% _% Q1 [+ |第5行:(defun C: triang1(); T$ V: e) V% M8 X5 f! B
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)/ m2 C9 R6 k& q+ |+ q, M& s+ N( i3 U
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))) i* W$ w: m/ `) w; Z0 c
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
# a+ q& R/ c# C _第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
( N: n3 h& R1 Y这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
% Y. D' w$ r; p) t" [3 z第9行:(Command“line” P1 P2 P3“C”)
0 y2 i E' e' j本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。6 ] ~, R |6 T! H5 `
第10行
* }5 x! y9 Z6 ~! i本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |