1.defun函数8 C" v3 z) O+ U! n1 D" w
defun函数用于在AutoLISP程序中定义函数,其格式为:
( e( n; W) E0 D8 T (defun name[argument])
4 ?' ^' L' }" ^- |* P: d$ m6 a( F 其中name………………函数名
0 x3 W' L& k9 h argument…………参数列表
, R5 I; u+ Y2 o8 J4 U 示例:
( s- |( t0 X ]' \ o8 c(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
- u& s* @# M2 D(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
. T0 a* W+ y9 y7 T5 y; H+ e(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。. M5 M: G3 e+ x: ?. _4 }& D7 h: @
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
0 Z7 T0 Q" D9 @0 S V* r0 G# O# V注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。' c; F& v, a- ^3 s3 T3 q
Abs ads alloc and angle angtos append apply atom ascii assoc atan
4 i9 |6 l' `% U( P( {Atof atoi distance equal fix float if length list load member nil
0 ^/ P0 E* D1 L6 \2 N# g8 aOpen or pi read repeat reverse set type while
1 e7 v- F6 _0 o2 ^2 ?9 |. |( r* u2.setq函数) c0 ^5 v3 X' {) e9 Z
setq函数用于给变量赋值,其格式如下:6 T" J/ X+ N3 }( y
(setq name value[Name value]…)7 z4 [7 \% b! f7 N* M7 S4 K. S0 W
其中Name…………………变量名
; J/ J7 C: o- b value…………………赋予变量的值4 X# T4 S% s9 \/ V
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。: ^$ x' W, j+ j! p
Command:(setq x 12)6 E% B% _9 C$ I8 [/ q' I/ j! t
Command:(setq x 6.5)+ H0 V* J2 F: Q5 g+ O! w* |# B
Command:(setq x 8.5 y 12)
: E! G: H E+ |* V 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
4 J+ X, }' Z1 q4 p( i Command:(setq answer“YES”)5 M2 _0 e6 f6 G/ d d
这个表达式中,字符串值“YES”被赋给变量answer。4 A, B1 }0 _2 ~
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
1 {2 r& G% l8 O5 L5 O- Q (setq pt1((getPoint“Enter start Point:))" z" l5 K2 Q' ~6 r6 t4 o. U
(setq angl(getangle“Enter Included angle:”))& g" [" L0 [2 v0 R7 |
(setq answer(geststring“Enter YES or NO:”))
# `$ {, E( b" Z9 m+ C v注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
7 q. {8 t# g& \6 K$ p+ q (setq Pi 3.0): \$ [/ P* W" C9 N
(setq angle…)4 K G- X/ a! v4 {5 D/ `
3.getpoint函数' `& W. l: |' U8 ^' J
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
( | T/ w) \3 E9 L* d' n(getPoint[Point][Prompt])
/ k( l" h/ R$ a4 \9 u* i 其中point…………………输入一个点,或选择一个点% w' f2 ]! ^4 [+ n/ O) j
prompt…………………将显示在屏幕上的提示
) k" j7 N, W: R! t 示例:
( z( r) t, g9 U" X% R( m (setq Pt1(getpoint))/ i4 I8 B+ Q3 i' @5 I; d% I4 r% y
(setq Pt1(getPoint“Enter starting Point》
; U0 c5 c( M6 I& D, T4 K/ } 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
* |6 f4 g P$ g4 h! B2 F4.Command函数
0 q4 J) d, V" [Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
0 ~# P8 p/ E+ Q& ^4 q; C4 D" l (Command “Commandname”)
6 ~ @) N2 A3 u 其中Command…………………AutoLISP函数
4 Q, t5 X C. m) a, iCommandname……………AutoCAD命令
8 g; y! S3 l# M" H; h示例:0 @# M- w3 b. I5 y
(Command“line” Pt1 Pt2“”)9 R& _3 O* F0 h; b K2 o! t
“line” ……………AutoCAD LINE命令
* M) w) T5 R- z1 A" LPt1……………………第一点
4 _( M+ W% V$ j# \# l0 d2 C$ O9 h& YPt2……………………第二点
V- E( I+ w. b/ C“”…………………用于返回
2 t7 N5 M$ @1 N8 b X) C( i 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
: O6 i+ r- L: A6 }5 C+ }Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。0 o( g0 A- _* a) q9 |
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。# W, K ~$ J2 g6 s# `7 e, p! \
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
5 C0 G+ E! y( k' G! s' R1 r7 ]1 t 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。4 W/ ]0 M& J: {% v9 K0 q" T
编写程序前,必须确认这三部分。
6 m( c" A0 J# M( { 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
3 |8 A6 A# s' Q0 G3 _ 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
. _4 E/ q5 Y$ a# Z3 N8 j 输入 输出0 o3 q. |" n+ u( _* d
P1点的位置( r7 F5 s7 k( o6 O; L
P2点的位置 三角形P1,P2,P3
0 Q' M1 L1 v( p5 R. h! G, p P3点的位置; p: i( P$ n8 }- H. L
处理过程
+ s9 ~1 E( c1 K4 p1 u 从P1到P2画线
' t% {: b' ^6 E% o# e* f$ ^5 ] 从P2到P3画线+ `; m( O! O. G3 }
从P3到P1画线- z+ B" T6 J& s) G' A" F6 z# P
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。6 c6 {0 j% J0 p. d3 m$ [! Y
;this program will prompt you to enter three points 1
0 W6 f* y" y; ~;of a triangle from the keyboard ,or select three points 2
! {8 z$ L' r$ @. \;by using the screen cursor .P1,P2,P3 are triangle corners. 3% w) k$ x9 N; j5 S' L5 A3 `0 F
4
) H$ I! a/ {5 U! k3 [, \(defun: C:triang1() 5
3 M, L' A; Z! p' o# s/ _/ o" a2 O, Z (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
' J0 B, \0 F7 R7 m (setq P2(getPoint“\n Enter second Point of triangle:” 7. ^+ L2 {+ c6 q
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
4 s) K5 J9 P$ G$ I3 y1 k (Command“line” P1 P2 P3“C”) 9! {% G3 ]% z1 K7 S) p
) 10" t8 h' y8 i" g* p8 c9 y& V
说明- @+ B$ s& V( L
第1-3行
; T( C* \) h( B前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。0 z" c2 z1 P9 \8 E' H5 o2 N: n
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
9 p& s- t! o, u3 _2 m& S" Y第5行:(defun C: triang1()
+ B* a7 p8 W- _/ S9 o% P本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)( x- J5 B0 p: {# b* Z
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
9 x' Q T0 J8 T2 B) Q* n本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)1 W D2 _( f1 V( U$ @
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))% K& E8 e3 _; P0 B2 t% ^. M
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
u% z8 D. [& m第9行:(Command“line” P1 P2 P3“C”)
9 |: l" P% k4 r( W* m6 d本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。- X p/ @! c5 M: E
第10行( q. Q5 ? w' k! p4 ]- c+ g
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |