1.defun函数
. T3 i- A/ H8 t5 k5 m* i- Odefun函数用于在AutoLISP程序中定义函数,其格式为:
* S1 C* `1 d6 S P$ Y+ e5 Y1 o (defun name[argument])' N- I1 |8 n0 t
其中name………………函数名; S0 O& X5 k4 h1 P" o
argument…………参数列表5 G( i) q3 u ?9 k& O) x% \0 o6 k
示例:
% y+ s; h# w& q- S7 `0 S* Y5 y1 B(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
9 U% E. J/ ^* w: v, c(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
; V+ l& c; G& B l: j& x0 k' t3 ~(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
8 E& Y& T5 u/ F# `! {(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。) r* s" i# i+ `/ Y& J
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
4 U5 x! y n' ?( UAbs ads alloc and angle angtos append apply atom ascii assoc atan7 i) b) }& J3 d7 ] ^
Atof atoi distance equal fix float if length list load member nil) s! N r! F) f) G4 N
Open or pi read repeat reverse set type while
% _- ^9 J7 [! D/ }% q {: A2.setq函数
) f4 ?, M9 z, j$ ?9 c setq函数用于给变量赋值,其格式如下:
, r) e# M% R: {% S! `; X }. B: p& e, Z (setq name value[Name value]…)
. Y- p$ J: L4 p3 T! l! R 其中Name…………………变量名, R, |$ Y% }3 R% w/ F( ?
value…………………赋予变量的值
/ W6 Z, h+ H1 n+ U9 J0 y) M 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。* }" A0 D# H" v! S2 [6 \ m! @: o
Command:(setq x 12)
( I9 m+ E9 e/ m$ h# h Command:(setq x 6.5)
# i4 O9 |* v9 P4 j. N3 c N% @ Command:(setq x 8.5 y 12)
$ F0 U9 \; B" N+ h 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。7 ^. t( H% H+ i5 r a9 `& N8 P
Command:(setq answer“YES”)
/ L& G: B, ^$ X, |1 T: d" X" o 这个表达式中,字符串值“YES”被赋给变量answer。
5 g1 E0 l6 v* G, G2 V setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。4 F: ?) T2 P( Y
(setq pt1((getPoint“Enter start Point:))
, `7 u9 ] c$ J/ V (setq angl(getangle“Enter Included angle:”)); e) n# Z$ m7 J, R
(setq answer(geststring“Enter YES or NO:”))
2 }* {. Q" m8 ?! h注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。7 y' V6 F( r9 H# o4 N- R" w* L
(setq Pi 3.0)
7 F* \# @7 A; N% j4 h (setq angle…)
& \/ E. l" ]- ]- L! @2 I/ @3 R3.getpoint函数
7 ^" h2 r1 n# q& b$ A6 Q) Kgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:/ l9 v- t# h- l I- N6 L5 q
(getPoint[Point][Prompt])2 M* e8 ~. R& X. K/ B) \
其中point…………………输入一个点,或选择一个点" P4 p. w( E7 m
prompt…………………将显示在屏幕上的提示
- W5 f+ Y" ? b" P2 }# M; o1 P 示例:. v" }1 P7 W: ?% i3 g+ K% t8 y
(setq Pt1(getpoint))' R1 v! {! V+ {2 D& R
(setq Pt1(getPoint“Enter starting Point》. Q/ u5 ^2 ]9 s
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
% b/ m0 x0 Z' T- `4 G4.Command函数
( r/ E* K1 p5 m9 n" r9 F Y# _Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:4 M$ d& W, x0 h" E. d" O
(Command “Commandname”)
5 \$ |4 p7 b2 e, n# k! d 其中Command…………………AutoLISP函数3 d2 R2 L" h* I- |
Commandname……………AutoCAD命令7 R, N6 T6 \; }
示例:2 ?, g9 d( z- E7 {; S- G
(Command“line” Pt1 Pt2“”)
" V/ \# M# d1 L+ s" T“line” ……………AutoCAD LINE命令
5 M6 s* Q: }6 \. s1 g" QPt1……………………第一点; s l, b' _. \: p# N
Pt2……………………第二点
; P, M/ F; T" I+ {“”…………………用于返回
4 S$ R! F' T/ }) V2 i 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
# Q8 B" D# O/ i3 y: i4 i# i8 m- VCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
& o5 C" u% Y) w3 I! a7 o" D不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。, S; C, A f; D) }* ?" S
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。3 L8 T0 V- O3 d# Q% g/ V5 I/ k0 i
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
4 ]; C5 N8 Y$ P2 c/ P: b 编写程序前,必须确认这三部分。
) k6 j& W- c$ B7 a7 T4 L 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
' g$ u2 K3 w) V3 ^) P1 |5 o 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
! }5 f& s- g% S 输入 输出& I5 h- m% T8 h9 T
P1点的位置0 E0 \# P* Y3 B- o% m! K' N4 }: @
P2点的位置 三角形P1,P2,P3: H5 K6 R1 x6 k9 V" K2 m" B
P3点的位置6 V/ J+ ?! u: y L3 b
处理过程
' s' \% a3 X. E7 S/ H 从P1到P2画线
$ ~1 w2 C, y: G 从P2到P3画线
9 W, M2 r$ }8 a6 B3 _9 M* M2 R M2 S 从P3到P1画线& l+ P9 w- v: w/ W* S
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。+ B$ E/ z! q% p: e
;this program will prompt you to enter three points 1. o. U1 O: i8 T& E* b. B5 N
;of a triangle from the keyboard ,or select three points 2% I+ ~! e P4 Z
;by using the screen cursor .P1,P2,P3 are triangle corners. 3( O( J6 j) ^; n" r' q/ @, o
49 g) t" @" ~+ ? q3 C2 p' b
(defun: C:triang1() 5! o0 b: a. D9 Y4 a7 a' p9 s* M7 r
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
3 K/ b D, t' k& M' E (setq P2(getPoint“\n Enter second Point of triangle:” 7; m3 d6 ]; u5 Z) ]( S) _
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8; E% S( i1 c8 j) k& b
(Command“line” P1 P2 P3“C”) 9
; N! a2 I) U6 |" |! ~4 U) 108 q! H/ K! {4 g7 F; C# g
说明 O' S9 I& }6 n( I# K
第1-3行
2 q+ N. f8 O2 G- N前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。: C2 T8 ]4 N4 I/ l8 o" c1 L- t
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。& [$ b& k+ r4 [6 C" K' m
第5行:(defun C: triang1()
( {5 ~8 L% d% }- t/ {本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)% o9 z. @2 L' a; m8 D
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”)), }$ Q9 y3 z) f8 ]9 R& B
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)* ]9 [. |8 X+ R; I: c, W. e/ O( H
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”)): ?7 b9 M* N" d! s; M% R! D; t" }- z% m8 u
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
4 K; c# m) d! `' l, Y4 {, g% q第9行:(Command“line” P1 P2 P3“C”)' w' v6 V# I, F0 e
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。% i+ r; b* ?+ B2 h' _+ w
第10行
# L$ m( ~! {8 @+ X% T: R7 z. j本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |