1.defun函数
/ M$ F, i: l# s6 \defun函数用于在AutoLISP程序中定义函数,其格式为:
% O7 ^. v/ Z# M. ^, Q {2 M (defun name[argument])
+ g) Q$ n# m% |# A+ y 其中name………………函数名
" w5 K, V8 Z% K3 f% k8 T" q, W argument…………参数列表- ^- y& J! Z2 k- ^- f/ e
示例:1 X" P/ d9 |( [9 U5 B% A
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
9 E2 Q6 N+ ~0 ?/ T/ O4 K& V: J(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。" r, h9 O" w' T& v6 _) |
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。8 b5 w" @- h# {. `0 D
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。1 _* ^, l# S/ g3 Y+ G# ~+ e1 V
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。# g: o s2 ^' | f8 V' [
Abs ads alloc and angle angtos append apply atom ascii assoc atan
( } u& i$ c7 q# D5 {! A! J7 jAtof atoi distance equal fix float if length list load member nil' {6 L+ O/ |" ^0 {+ H) ?) v
Open or pi read repeat reverse set type while" J# e/ x1 f9 q2 s! ?( a" N, s W
2.setq函数
1 g0 d8 m: Z3 _3 Q setq函数用于给变量赋值,其格式如下:
7 s! @! j# y. f5 |7 _* ~$ `! o! I (setq name value[Name value]…)
3 i& X5 u- ^( ]# @4 J$ P 其中Name…………………变量名. P q1 N: X1 ^
value…………………赋予变量的值) x1 Y1 N% ]" @) q+ {
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。. W9 x9 i$ x- z1 r4 F
Command:(setq x 12); D' i1 u4 F5 d5 H- r+ E
Command:(setq x 6.5)
$ J! H7 r6 a0 [* G Command:(setq x 8.5 y 12)
, Y0 q9 N' b; i& L 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
! e6 X+ K& u, x: y) _ Command:(setq answer“YES”)
* u8 z- F* b- b( k* O- y8 H 这个表达式中,字符串值“YES”被赋给变量answer。
0 A& c9 J7 Y8 k: E4 h6 {' D" ]; o: i setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
# p; j- q" u+ P0 @9 N (setq pt1((getPoint“Enter start Point:))
1 J* _1 s/ \( p3 A2 J+ x) ?( ^ (setq angl(getangle“Enter Included angle:”))
4 [: `0 [( V; B: D: R (setq answer(geststring“Enter YES or NO:”)); M5 l4 a7 l& S* w
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。8 |3 H9 K, W5 c1 F2 G7 g ]
(setq Pi 3.0), J g# L& [8 n2 ~
(setq angle…)" I; K7 c) s: r' k% J* |1 N
3.getpoint函数' P [: F, _7 W! X; r, I
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
! Y2 |* b. ~2 R5 \3 j1 J$ S(getPoint[Point][Prompt])
6 E1 ]2 T/ \% O9 n3 U! H 其中point…………………输入一个点,或选择一个点8 t* z+ U& m2 }# H: b% I
prompt…………………将显示在屏幕上的提示
& [8 q K* R q: d 示例:
4 ]; _# z! \$ ^1 x& l (setq Pt1(getpoint))& F- k9 H7 V) z" [4 ^# P3 \
(setq Pt1(getPoint“Enter starting Point》' m# T: x0 Q" s
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
: _( z% Y8 U2 H6 r! K4.Command函数
, d# f9 }) ^; ?; ]# e: ACommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
- F$ W x: \: F9 I, p7 j/ T2 u (Command “Commandname”)" ~& T; s0 p8 o
其中Command…………………AutoLISP函数, _+ `* G9 ]! w7 m5 S5 l! X) Q
Commandname……………AutoCAD命令
! D5 A! m& z4 U1 b) {, o示例:; z# |6 f# Q# P/ k2 @
(Command“line” Pt1 Pt2“”). j' d. W6 H1 Z, y8 L5 y
“line” ……………AutoCAD LINE命令! O5 }$ s$ H4 G! H/ k; ~3 N
Pt1……………………第一点/ n4 \* t4 e1 ], t
Pt2……………………第二点
c$ [+ M7 L% y2 t% \9 |; @“”…………………用于返回
9 ?: T( w7 u& y& N 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
. M/ O' A5 ]: z$ k" }4 Q5 z, gCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
7 O) Q: f7 Y, U# j( J8 I. ]不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。! j6 i0 H; [7 k% b/ D0 Z
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
+ Y& _9 o* R9 B 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
8 p4 K; v" l4 B) \' w1 u* N7 v 编写程序前,必须确认这三部分。
8 I ~4 E3 G; z; V: J* u 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。: v+ o/ J' x) J/ {! H4 `
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。- T6 |# n' |( G) T; ~
输入 输出7 g+ \: P" _8 k1 x! j7 G7 u; W- |' k
P1点的位置! _( w0 [5 j" d9 X( }4 [
P2点的位置 三角形P1,P2,P3
4 N+ {" j8 R4 D; d; c* { P3点的位置# p2 [) o% l. i7 X- ~) c
处理过程
" Z7 v3 ?, e" W, x$ K 从P1到P2画线' R$ R# ] \+ V& c6 W* V! L
从P2到P3画线! ]7 ]" a( _% K1 L1 e
从P3到P1画线+ [& m" m. j# O8 P; l F8 n0 r4 H
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
8 b" C+ z( w9 }1 a% {& D2 \;this program will prompt you to enter three points 1! @) X E* Z6 W. m
;of a triangle from the keyboard ,or select three points 2
: t. r1 f: g2 `;by using the screen cursor .P1,P2,P3 are triangle corners. 30 g6 ]$ Z5 g+ k! d8 u. {8 [
4# P, Q0 k% c3 b" e
(defun: C:triang1() 5, S6 ?& x2 H: m3 ~, I/ x
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6! ~1 }8 m; k o
(setq P2(getPoint“\n Enter second Point of triangle:” 7/ p) I2 l6 z3 V, N) n8 ^( [. D: w
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
% @! j" o0 Z7 Z; t8 s (Command“line” P1 P2 P3“C”) 9
0 s! p2 ~( h$ _, u& s2 ]4 ~) 10
8 [7 G% k$ M9 L+ _. o! [说明
5 y. @5 s( e: u2 Z/ C第1-3行
% _& l- f/ k+ C前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
$ P; U: Y1 G& v, v& [/ I7 I1 x第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
" q" G% F& k2 I# Z第5行:(defun C: triang1()
8 u" j6 S: _- K8 v/ A本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)% _3 ^% ?; D! g; q% d+ U% H+ @& Z
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))/ v( Z w0 P" a- o1 i
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
H( S& ~/ p/ G. Z9 p- R第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
% r% U, G/ M4 G( t这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
$ t8 c4 k- p( d- F第9行:(Command“line” P1 P2 P3“C”)% }% _8 X9 ]: w! q& Q- ]
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。0 Z& c2 ~3 `0 u4 v2 ]) q' i
第10行- c" Z1 ` y! u( f. W
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |