1.defun函数
% \1 e5 {% O( ldefun函数用于在AutoLISP程序中定义函数,其格式为:% y1 ^/ e) `8 s7 G- _6 p
(defun name[argument])3 h0 n2 G# y5 k
其中name………………函数名! M# Z8 _# |- I- G! z
argument…………参数列表. l! I% a" C4 i4 ~3 Q9 h0 W: V5 C9 ~
示例:
7 t, ^- G. F% d3 o, W(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
; Q6 c& w& ^: v7 p$ q(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
+ P$ c4 F& g& Q(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
1 Y% O& P5 ?4 O1 o) f1 O(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
/ }! L7 O5 W! g& j0 m L注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。& L2 M. S. {( f! c( P, d
Abs ads alloc and angle angtos append apply atom ascii assoc atan0 ]* V. Q. c( ]+ E4 k
Atof atoi distance equal fix float if length list load member nil
- u2 C2 f. E6 O7 g2 b' r" X" w1 j- lOpen or pi read repeat reverse set type while; N. k5 ?- p9 X4 n
2.setq函数' y3 p4 z+ O" Z+ G2 l) Z& Q; c* |
setq函数用于给变量赋值,其格式如下:
) D7 u! z ]2 L& |" y (setq name value[Name value]…)3 h% v* c! V* Z6 I) ?( `5 C
其中Name…………………变量名
* Q8 @2 T- f" U' c value…………………赋予变量的值 J! i$ ^- ~8 b. V
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。' b' [1 k k$ {. O+ V7 D
Command:(setq x 12)) e1 y! \0 d, J* B8 I
Command:(setq x 6.5)
2 R$ }/ m2 x c6 S- n0 M5 e& ~* X Command:(setq x 8.5 y 12)9 |( G* n, V4 E) v* e, h+ ]
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。+ _! X: ^* O( R% y9 y8 S+ Q
Command:(setq answer“YES”)
7 B) R, z/ m0 K 这个表达式中,字符串值“YES”被赋给变量answer。( J# H3 {; \0 R
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。( i% t/ q$ v1 B, a9 r2 y4 S/ F
(setq pt1((getPoint“Enter start Point:))
5 i+ u1 `( i7 J, z. J. ^ (setq angl(getangle“Enter Included angle:”))
2 j( ]+ v* h8 W$ ] (setq answer(geststring“Enter YES or NO:”)); r) [- }+ N1 y B( r( f6 j, i; M
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
+ M( P5 C" d" [: I( O# R. L (setq Pi 3.0)
& ~! z9 }" ]8 {' Q& r (setq angle…)
/ M4 p2 J2 }. ? U: O3.getpoint函数+ v+ _5 y! N6 {# a, M
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
0 s% t' q: N* A(getPoint[Point][Prompt])
/ u9 y7 N7 w& Y7 I# x 其中point…………………输入一个点,或选择一个点0 X' d+ k& ?9 A$ U0 Y0 S3 ~
prompt…………………将显示在屏幕上的提示
5 o8 f$ X8 ` s: i$ U1 ], x 示例:
* p2 t1 z4 H& z. q6 x' }5 y2 ^, k3 D (setq Pt1(getpoint))* v) c7 Y: ?$ v# |
(setq Pt1(getPoint“Enter starting Point》
: p3 p. m/ R. [) Z0 {" y) a: u" h 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。5 |1 N2 l0 x @! P& I( P2 _8 @
4.Command函数 I! k3 @- U, X1 u- |% g' \
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
9 d [$ m. Q9 ~) E: i- p (Command “Commandname”)! \2 P5 x3 ?+ {
其中Command…………………AutoLISP函数
0 d: w+ ]7 g% R- I- }7 HCommandname……………AutoCAD命令
! S8 w5 X) w4 `) r$ ?5 C; l示例:, ?( I& w* ]3 K6 W7 ~1 p# x8 s% j( K! D
(Command“line” Pt1 Pt2“”)
: [9 v8 }' i7 T“line” ……………AutoCAD LINE命令
. e* T+ G* Y0 u F/ zPt1……………………第一点
( D4 G+ z9 N0 G7 h4 j; X% hPt2……………………第二点, K, i: ?! K2 C+ u) I3 E; T
“”…………………用于返回
0 Q) Q- q7 |* k 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
8 w' x- A( B9 v- |Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。5 s ?( L' \. _! y& I
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
( B% M* @; ~5 W# T例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。* Q3 b4 _5 g9 d6 A& Z; Z6 a, [
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
; m( ?, |7 I# O, @, f 编写程序前,必须确认这三部分。
1 e% g" L5 j5 z 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。8 \6 J' N$ {. j: Z7 W' \( S2 i
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。6 e0 ]* D" a% x/ N: [6 |4 V/ V2 Y
输入 输出
1 Q1 e( L. l$ E7 Q P1点的位置. d0 d7 J& o6 s. @9 F
P2点的位置 三角形P1,P2,P36 X- S, @( @3 C4 d' G4 Q! Z
P3点的位置1 z, N8 G- j9 F1 ~/ ~: r6 b7 ~
处理过程" p9 E. S% O3 _& o) D
从P1到P2画线
4 w, P+ Y1 q2 R 从P2到P3画线
, F, K) a' T) H$ \) B 从P3到P1画线
, D1 p4 m1 ` u2 p% }% J L下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。. ^0 j( V$ \. J& ~/ w
;this program will prompt you to enter three points 1
5 \7 f. q g" m1 w;of a triangle from the keyboard ,or select three points 2
! X- `9 l* x" w& p;by using the screen cursor .P1,P2,P3 are triangle corners. 3$ z n( \5 `* V1 r: q9 [$ k) C( ]
4
( V3 E$ ^& t* A1 j! { h& ](defun: C:triang1() 56 ^; f: d6 E2 A/ g7 N& F7 D
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
9 s. h2 w8 L: }# n (setq P2(getPoint“\n Enter second Point of triangle:” 7
9 x* l( U* W' `0 D# J' M (setq P3(getPoint“\n Enter third Point of triangle:”)) 81 V# M6 D" M) x6 U4 c o2 S
(Command“line” P1 P2 P3“C”) 9
. q' M( Z4 `0 u) 10) J }# G# a9 T8 |" |* I D
说明! V; Z" q) N# H" h
第1-3行* @3 }9 V, X, V) `
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。+ w. ?7 ^. h' P9 n2 N1 `1 [
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。0 O+ K( k0 i% |1 i1 V, Q
第5行:(defun C: triang1()
. X7 @% k5 q4 { o! x本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
& I( ~* n }2 g第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))# W8 O. } P6 r! E, R" u8 W% M' F
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)4 }* P# d1 t( e; u
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
- |) _+ n' A! ^+ I5 F这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
7 n( z5 C+ K% s# @+ v, Q3 |第9行:(Command“line” P1 P2 P3“C”)% j+ g2 ]8 Q$ j2 B# J& d+ C
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
) S7 |) e/ Q3 `# l" F) U第10行$ u: s( O2 w5 x% R; h8 @7 ?
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |