1.defun函数* n3 t% [ @# E* {* U, T, s- ^; z
defun函数用于在AutoLISP程序中定义函数,其格式为:
+ O! a; y( K4 Q# Y (defun name[argument])7 u. ~# M0 C7 v; j% n2 @
其中name………………函数名1 i* W7 G' E' s
argument…………参数列表9 A; c7 F% M2 T' v( Z3 y* `+ Q4 p4 U0 V
示例:
6 s% G0 Z# ~; N3 |( u+ n* L(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
( Y" f3 d% l s. q6 i% G(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
! Y q6 A$ ?3 g3 t6 f# p(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。3 r$ f, f; }: j$ Q0 Q7 i" n/ A0 e
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。4 m' D5 Q9 f5 M) J8 |
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。; B& K: M+ I; K; {; R! {- l
Abs ads alloc and angle angtos append apply atom ascii assoc atan
1 |: u: I& S5 T+ G$ y2 F" iAtof atoi distance equal fix float if length list load member nil
! J. \$ J% P6 ?( R) k4 _, L" R% HOpen or pi read repeat reverse set type while
1 t' |' Y# v1 r# |1 A2.setq函数) R% A$ i- ~! V9 E7 ~
setq函数用于给变量赋值,其格式如下:
$ n( s' }9 r0 { (setq name value[Name value]…)
2 ^8 H9 k3 Y5 C6 \& E! C 其中Name…………………变量名. L5 s; e* T( A
value…………………赋予变量的值" l" E2 F. W% u, @8 [2 B
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。# Z7 I/ ^: k" H& z1 p# P* l
Command:(setq x 12)
! e \+ G: t8 O3 l2 ^ Command:(setq x 6.5)
* N5 O1 Z- ]+ w' j Command:(setq x 8.5 y 12)
, o# R' T) M$ I. p; {7 [ 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
E2 A% @' c: l3 V Command:(setq answer“YES”)6 p% ^3 A+ z/ F c2 z2 m- p
这个表达式中,字符串值“YES”被赋给变量answer。
N3 `5 H5 G3 y, P0 O1 t3 @ setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。2 d8 `' c& s5 f; o
(setq pt1((getPoint“Enter start Point:))
& }+ a! M) v+ D& u, j0 R: y (setq angl(getangle“Enter Included angle:”))
1 t6 M4 f9 G% C6 s (setq answer(geststring“Enter YES or NO:”))4 u Q5 V# J4 I4 s0 |3 C# p. I
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
% i! a$ d2 I) B (setq Pi 3.0)) D0 q7 H2 L" a N& }& i8 C
(setq angle…)
" I D( P4 Z s3 D- M; B6 w3.getpoint函数
1 `8 z" `: o& _4 M' a$ r% W0 Tgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:" y: `. [6 V5 d) G
(getPoint[Point][Prompt])
* e, B; N- h/ g! t/ B9 @ 其中point…………………输入一个点,或选择一个点
2 A8 V% y" `) b5 I- n* A prompt…………………将显示在屏幕上的提示
% e. r% g0 Y3 ]9 @" U 示例:
( T1 a& q. O* p3 {# Z (setq Pt1(getpoint))- \, X8 x% q* r' Z+ f" [
(setq Pt1(getPoint“Enter starting Point》
+ F/ |/ x+ |8 e 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
8 D- f& S0 y1 X4.Command函数
! S, @3 J( a/ M2 W- R2 qCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
- X2 }8 T& Y/ M4 H! {" O2 Z (Command “Commandname”)# \& x8 r) n0 @
其中Command…………………AutoLISP函数" q- E" G. S. Y- o
Commandname……………AutoCAD命令
g0 T+ P! ?1 @* `* b示例:) L) }, W0 R/ J% r: B
(Command“line” Pt1 Pt2“”)$ _5 D, A" @3 e! K- k
“line” ……………AutoCAD LINE命令
; \1 q/ q0 ]2 }9 cPt1……………………第一点
( |8 v7 |* @! P3 ~1 r; JPt2……………………第二点0 `. d' p3 T% ]1 m
“”…………………用于返回2 f7 u. \3 q, B* @
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
2 V' ~# M; [5 RCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。* v+ N: G; f/ C" a# H$ g) h
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。5 n4 ?. R. n, f }
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
$ N3 h' o1 j- }+ j) L 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
) [' U' X0 E' w 编写程序前,必须确认这三部分。
( o, U$ u; V4 ^+ D" n$ K$ j; U 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
) U2 g/ g- d5 c6 A: U0 D 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
) ^& X. N1 Y9 {7 Z 输入 输出
- V& @' z* d# H# ~7 U6 a7 | P1点的位置
6 A+ i9 A- o4 ]8 C P2点的位置 三角形P1,P2,P3
7 J# A- t0 R5 V' q7 m3 i9 M7 a+ b P3点的位置+ J' q: q$ z; k( O, w! D# \) V/ k7 q+ H
处理过程1 {2 Q$ r# v8 i4 h9 P( n
从P1到P2画线* m7 J; u# H7 e9 {0 J
从P2到P3画线
( ]2 Z/ G |1 r/ ]9 W+ u. x$ ~% m 从P3到P1画线
+ Q$ b7 j, C" n* r( \下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。! b( ^. `/ ^, [6 X/ n; w/ k/ P
;this program will prompt you to enter three points 1
6 C3 l: D# A* V: e;of a triangle from the keyboard ,or select three points 29 o5 V1 e0 Z) ? e) v
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
0 j8 V3 E! x4 |0 [ 4
f* D3 `, H8 }( q(defun: C:triang1() 56 h+ r$ _3 p& d: B
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
0 k7 z" |+ }1 ?' a" G% j4 C (setq P2(getPoint“\n Enter second Point of triangle:” 7
- c1 J9 v! E# U$ U9 m (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
2 h% ]4 }. Y6 X/ S: `2 F (Command“line” P1 P2 P3“C”) 97 O! b, n+ f2 v
) 10
3 G* c7 R" k. V0 G3 {说明
q1 T, w4 p" {9 r8 q# \0 Y: t第1-3行, B$ f i8 G; b) [
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
5 o8 G( v3 {- K# N第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。7 }0 z7 a8 [% N4 k
第5行:(defun C: triang1()! w$ |0 k8 ]( Q5 _% ^1 N) k0 p
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)) O6 |7 {2 \* _) m9 \
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))) b( @5 q) l. K0 U( V9 x, X
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)0 y1 g8 w e9 Z2 p/ }; E2 y% w
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
. y( X! y* @# P) h8 G% j2 e$ ?# w' d这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。9 A' O4 B9 k7 `0 w4 M; @; N
第9行:(Command“line” P1 P2 P3“C”)
: j% v$ {; p9 |7 f6 t本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
' b2 Q) }2 L( [& @第10行
, a9 J# ^( X( Q& o本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |