1.defun函数* A0 ^& e" [' u+ y; f F& W
defun函数用于在AutoLISP程序中定义函数,其格式为:' u2 S1 j) q0 g7 ~
(defun name[argument])
6 k6 ]' J" L2 ^8 B6 Y0 e) T, Y 其中name………………函数名$ W5 y( o+ w$ _ \* D, I( S5 k
argument…………参数列表+ X$ [4 X2 r0 e, x% ?
示例:
. A; w' ?0 c& ?$ h- M(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。% i2 U% y# \, ~: U9 u) k
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
) |2 U" w- P4 m6 F, l" q(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
! s- G5 w6 z, `3 w _4 C8 p( Z(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。" W+ w: @9 A3 S7 q4 X1 O
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
" X U4 B/ `% _8 ?1 u$ OAbs ads alloc and angle angtos append apply atom ascii assoc atan
/ [4 l2 M2 J% q( ?% }Atof atoi distance equal fix float if length list load member nil/ b" o; P4 p' k2 L( h; g
Open or pi read repeat reverse set type while
`+ i& b* X% `: U* X2.setq函数
* V0 Q1 j! J: X% D setq函数用于给变量赋值,其格式如下:
& I* e( F; C9 L9 O0 e (setq name value[Name value]…)
; [2 G, x1 j. \3 k" _2 }1 W 其中Name…………………变量名5 F# |$ ~- m! r
value…………………赋予变量的值3 c6 z8 s( s+ r5 G o k
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
% E8 t8 L/ w( i; f) f7 B$ x Command:(setq x 12)" o2 u& z3 u. r0 R4 M, [6 j
Command:(setq x 6.5)
% {; o1 j( v2 x$ N/ U Command:(setq x 8.5 y 12)
+ X4 i5 @# z) Y! P O I 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。. J4 O; L& G0 Q% y# ?" x/ }0 d1 B# k
Command:(setq answer“YES”)
7 M. t4 V, f1 J* V9 G7 y/ r 这个表达式中,字符串值“YES”被赋给变量answer。8 x8 h7 v6 u, j% y8 N
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。5 |5 K2 b0 }- E: I, Y/ T3 G
(setq pt1((getPoint“Enter start Point:))9 K( X. I5 g: i5 `. J9 w2 O
(setq angl(getangle“Enter Included angle:”))! \2 _4 h; S9 I6 A( g; a8 S* o$ X% o; ~* r
(setq answer(geststring“Enter YES or NO:”))
$ c* I; l- _ R I& i; S注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
2 F$ W* I5 @7 N, c (setq Pi 3.0)
- [3 M L( Q5 r# v% q$ O5 a! E7 U1 r (setq angle…)
9 n5 j4 Q0 v4 p9 |9 p" T5 p9 ?3.getpoint函数
3 G( ^, d" R$ l# rgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:7 r0 J8 T9 ~9 ? I- a# g; C) v+ d* Z
(getPoint[Point][Prompt])
' Q% k" R V* m 其中point…………………输入一个点,或选择一个点5 ^! o v, H9 Q2 h% y- Q
prompt…………………将显示在屏幕上的提示- f% d) @' t* f3 c' x- A, {% a' [" R
示例:
. U3 K; _! ~3 P8 G5 V (setq Pt1(getpoint))
: b0 W5 x6 h2 i% u, [# V9 {7 y (setq Pt1(getPoint“Enter starting Point》
7 x: ]/ G9 ]; e8 @ 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
* C9 T) W3 ~5 D& h+ N2 C/ Y4.Command函数
3 @$ Y2 C7 C- R0 s7 f, @Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:1 K0 J6 d8 W2 q5 `/ r( A |
(Command “Commandname”) D0 O( j8 |9 ~% P8 I4 q
其中Command…………………AutoLISP函数0 G7 A& M t* W( B- h
Commandname……………AutoCAD命令7 p1 l( j) W! H, w) d- s+ N5 Q0 _
示例:; Q& @5 m' |0 m' z% b' y3 U
(Command“line” Pt1 Pt2“”), o, Y: K) f9 U! Y5 B3 \8 j
“line” ……………AutoCAD LINE命令
+ S& K8 _! d$ T0 R# g4 Z/ wPt1……………………第一点
! f0 ^6 U/ {3 C: X) u8 T1 yPt2……………………第二点
1 k. n- ^* S3 Y& z5 Q, W6 p“”…………………用于返回
9 h. r2 K: }5 v$ K 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。! K8 H7 D- x, V( ]% U
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
; [0 o9 \* v* i- V E: t不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。+ z, z8 Q% M2 P' N: s8 `! G! V
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。8 n9 n' u5 t* Y7 P
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
Y9 T2 {6 s/ l& y 编写程序前,必须确认这三部分。" }* }, G' H; W3 s, a4 o5 X; c
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
3 d1 {/ ~; [( w( R+ O5 S( D 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。2 {5 A( o# S. R5 n3 L
输入 输出
3 @7 u1 {0 y; [/ N; G P1点的位置
" J6 B' f/ z2 ?$ Q P2点的位置 三角形P1,P2,P3
9 |& }, C( Z+ S$ o0 r2 k/ A P3点的位置
- b0 `5 ^* s( Y2 a* T. t; r 处理过程1 g* ~- {) K. t& l" Q4 g/ L
从P1到P2画线
8 _- X# ^" ^0 F0 t7 J 从P2到P3画线
1 f" X! N( T- q; A* H 从P3到P1画线. @* N0 ]2 s- ?% d' w
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
! u* n8 J' i% ^- q;this program will prompt you to enter three points 1
0 q' _2 Q; i/ E; j: c7 y/ X* u;of a triangle from the keyboard ,or select three points 2! [: E) |: c$ z+ A, t- K
;by using the screen cursor .P1,P2,P3 are triangle corners. 33 \, b! o9 R$ x7 q8 ~
4* U8 \& H3 _0 l; C
(defun: C:triang1() 5/ Z/ o" D& P, A9 j5 {6 q# C
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
' c9 F+ k" X4 @/ A! R) r. B) n (setq P2(getPoint“\n Enter second Point of triangle:” 7
/ R, P4 G8 Z. j1 { (setq P3(getPoint“\n Enter third Point of triangle:”)) 8- Y/ M e- }8 g4 T9 v' A6 X
(Command“line” P1 P2 P3“C”) 9
' b* s' Z: \/ L7 w c) 10
+ C! _1 H: W5 G* m/ z8 D说明
. E' J" K7 o& y! M/ u& C. o% x第1-3行/ y. C9 a* v1 Q2 x! D( P
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。( t; x( \; a% [/ Z' Z1 \
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。/ I V8 ]" ^( C. Z7 D
第5行:(defun C: triang1()' z' i( z* h* L1 q+ n% h* T
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
4 Y& x7 t1 f5 A第6行:(setq P1(getpoint“\n Enter first Point of triangle:”)) b+ h5 m) B7 s- n, L
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
6 _# k/ ^; ?# d; V7 r& ]9 a/ t' ~. K8 @第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
; f' _3 g" R8 @* u这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。: t9 B% v3 t! W: p
第9行:(Command“line” P1 P2 P3“C”)2 Q! o3 _. _& X* Y; ^. T7 C3 V9 I+ h
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。! v1 C% F/ `+ Z* d/ p$ s4 Z$ K
第10行# D7 }# ?, B" [. [5 g. L! e! Q2 m
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |