1.defun函数( ~, H7 }: c+ K
defun函数用于在AutoLISP程序中定义函数,其格式为: l- p+ |+ j4 F7 `; w: [3 C
(defun name[argument])2 d: _& g9 J: e5 ~6 Z6 `
其中name………………函数名
$ {0 Z4 L w+ G2 M, L( W argument…………参数列表8 _ k3 {* }) C7 ^1 K" K- r
示例:
1 F9 d) I; D" C0 I `(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
" R- d% A" F, `6 E* n(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
9 y" n* \# |( n6 ~! A7 s(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
; S) k7 n* f C8 e/ n8 K(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。/ c. {1 q6 h; u1 e
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。/ J1 H. y& o0 M6 z
Abs ads alloc and angle angtos append apply atom ascii assoc atan
: d* _2 o: H [$ F& D8 l$ WAtof atoi distance equal fix float if length list load member nil0 D" K2 n) t @5 ]( D5 J
Open or pi read repeat reverse set type while( D5 s% q; K9 Z/ V) S/ Q+ Y
2.setq函数
$ F1 b1 v. M6 b. }0 C, R# o& B3 t: v7 o setq函数用于给变量赋值,其格式如下:. X1 }9 q7 V( ]: E: {
(setq name value[Name value]…)
; w7 U8 l9 z+ C5 y/ H5 h) E; h 其中Name…………………变量名
L6 l- w2 c' Z7 e$ V value…………………赋予变量的值
- f; s. ] x0 ~5 x# c 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。9 Q7 f: O* m8 w5 H0 \
Command:(setq x 12)
6 m @* S. y; C$ c( q+ R9 \% F5 d& | Command:(setq x 6.5)
5 P' F! a0 m. u. ], U1 I Command:(setq x 8.5 y 12)6 T) e8 r; c6 d h' n' E2 \2 _, n9 ?
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
' I" ]6 t5 N2 u; }5 k Command:(setq answer“YES”)% e" Z4 C q" L% g5 r5 r) Z( R
这个表达式中,字符串值“YES”被赋给变量answer。- c. o2 A. r- b
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
0 b) ]3 }6 @/ `7 _, Q4 f( ? (setq pt1((getPoint“Enter start Point:))9 `2 i5 k6 u6 g. h! Q, ~, Q
(setq angl(getangle“Enter Included angle:”)), i7 U; r8 P/ _% b
(setq answer(geststring“Enter YES or NO:”))
, U/ H7 N$ ?: I4 L0 D; a注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
8 _4 P1 s% y) ~ (setq Pi 3.0)* h7 |1 T2 y ]3 v1 ?
(setq angle…)4 T+ Y; C! P1 `9 S/ e$ o: z0 G/ [( i+ ~
3.getpoint函数: E7 ~9 A" i5 d' k
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:$ [: ]" V. n/ _0 L
(getPoint[Point][Prompt])1 m6 O' q( ~& s; x+ _
其中point…………………输入一个点,或选择一个点, n9 s( L L6 u0 H# J: m: B
prompt…………………将显示在屏幕上的提示: n$ V) h" n T) K# W/ x" x6 \
示例:
2 w9 v7 H3 p4 h9 V0 W (setq Pt1(getpoint))8 D5 B( H0 A( g' ~+ I. ?- d
(setq Pt1(getPoint“Enter starting Point》
* n+ y G# ]1 T 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
3 \; G9 A; G3 q& {* C, {+ e( p/ C# i4.Command函数* t& @, N) C- q: S% L, c% p2 C% o
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
, X, v& ~. Y1 q/ |# \2 {+ y. T (Command “Commandname”)/ v9 n( d8 f! y" {1 Z) _
其中Command…………………AutoLISP函数
% y% z. I e2 J8 _$ I! UCommandname……………AutoCAD命令
7 G/ Y- V; F& D$ Q' L9 j4 ]$ I* w示例:1 q/ Z3 l/ \5 u! ^9 a% C$ k
(Command“line” Pt1 Pt2“”)) T: ^8 ^! O" N$ q
“line” ……………AutoCAD LINE命令' C% B) m [/ E% {2 U- r1 ?
Pt1……………………第一点
. p) H( _* ]" W' N# JPt2……………………第二点6 `4 y+ X5 v7 J# A) Y# G
“”…………………用于返回# }! `# C% U: y$ J; C
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
" N9 f7 _' L, s! O, }: O( W5 zCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。' C) |+ V: S7 a/ O/ |
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。# j2 J0 [' y& m/ r2 M
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
0 Y: T0 E, n" Q" ?/ Q) ? 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
+ s, q7 `6 x. b8 N" I 编写程序前,必须确认这三部分。 J5 L. C2 ]( k9 l
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。, d* i' ]& }6 {1 N3 w
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。2 B, E8 y- l, k# F7 g
输入 输出1 ~1 t. Z! s7 a3 q8 @# O
P1点的位置
) O. q5 i* M* M% [) u P2点的位置 三角形P1,P2,P34 s2 {9 i5 E. Y- d3 c5 A2 I( y
P3点的位置
, z! S7 H; Q5 Q: V 处理过程& c4 E# ^8 h# U z2 m6 J
从P1到P2画线% t& v: p* b( f1 H1 n( I0 X* c! K
从P2到P3画线) q. x$ L2 U$ t$ p
从P3到P1画线$ M/ v- ]( H- P s! h
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。2 k3 j' M2 q; V. i- L, p8 ?
;this program will prompt you to enter three points 1& K& m$ s) T) ^* n
;of a triangle from the keyboard ,or select three points 2
4 O8 y1 [3 D3 V" F, ];by using the screen cursor .P1,P2,P3 are triangle corners. 3
/ `$ l! A+ G, U) F6 e! e 41 r/ F/ d X% Y P. M1 G
(defun: C:triang1() 5
1 W/ \- Z+ m* p& h: d0 K (setq P1(getPoint“\n Enter first Point of triangle:”)) 6# ~; y( g" Z4 W W( R
(setq P2(getPoint“\n Enter second Point of triangle:” 75 x2 l& z3 Z2 U" \* L, i8 J
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8& o: k ~, [6 h& n$ k- k
(Command“line” P1 P2 P3“C”) 94 R, N9 i0 E D8 C' i
) 10
. ^9 Z! Y3 r% i* }说明; W, B. |, u; s5 B' d1 S
第1-3行
% z! |. i) k* P+ X前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。! S% ?& P7 o4 ~9 A* u
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
+ ?, V" s$ \2 J# m1 E" M' `# w0 U4 v第5行:(defun C: triang1()/ t# W# D; S# \+ C0 p
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
- r: n8 k+ j# y: ~. _' A _% y第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
( u" s7 e5 j8 m4 \本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
0 T% D: g r$ m t- o0 q第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
0 ?1 d8 Q0 N1 G. J这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。$ \' {: i2 p% s$ a
第9行:(Command“line” P1 P2 P3“C”)
! V5 G; a/ c/ Z: q+ x% A本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。/ K, U8 o" p+ g7 @& H/ {
第10行
8 k- c8 j5 t' B6 \: s! n1 n& R本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |