1.defun函数
! \% d) w G' S; Tdefun函数用于在AutoLISP程序中定义函数,其格式为:
; g! K6 w6 z q8 I" n: a1 S" | (defun name[argument])6 l3 U1 E& R. T7 j/ S( F' z
其中name………………函数名( Y' x$ d w$ Z" C0 [7 C$ o
argument…………参数列表
, E; e7 x! t a/ v8 W6 P 示例:5 X% q9 x2 H: }4 g# W+ u7 W
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
! ?' A8 }4 \7 A x6 m# D(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。* V; o9 y, ?" ~" T' Q& W
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。& S$ b# b& o2 W/ C2 B8 i8 A% {
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。8 q- W' I# ^& J2 M
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
5 a/ p8 q& [1 ?7 u2 kAbs ads alloc and angle angtos append apply atom ascii assoc atan- A1 J2 J: q* c6 [4 v2 u
Atof atoi distance equal fix float if length list load member nil$ c% F2 _0 E) T
Open or pi read repeat reverse set type while$ _* W5 V) W) m$ q0 j
2.setq函数
: B# ` A# F5 q$ `) e1 J setq函数用于给变量赋值,其格式如下:
K, [+ X) }2 V3 U/ Y (setq name value[Name value]…)
* n( _6 s1 |! B( }) a6 a1 L 其中Name…………………变量名- N# S! [* D$ n: {
value…………………赋予变量的值
: [" I k9 [, z 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。' l8 v2 ^" ?- M! K5 ^4 V9 H& T: B2 g
Command:(setq x 12)7 s0 S3 J9 O+ Y
Command:(setq x 6.5)! i, L" G I/ n
Command:(setq x 8.5 y 12)
" d: ^% L& n& W( Z1 B. \0 ] 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。$ |$ g. I5 r4 S
Command:(setq answer“YES”)$ M6 x; Q9 G' ]: n' g3 x1 c
这个表达式中,字符串值“YES”被赋给变量answer。
/ I3 m& l/ l7 l. m setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。, Q+ o# U T/ J+ B+ r
(setq pt1((getPoint“Enter start Point:))6 e# C; C& N; f x
(setq angl(getangle“Enter Included angle:”))5 ~9 i% G! g$ Q) V
(setq answer(geststring“Enter YES or NO:”)): f! ]' Z7 q R1 m+ K
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
) X. E, K& m0 }& ]* f (setq Pi 3.0)3 m" ~1 C6 l P! G8 D3 J$ `
(setq angle…)7 R+ C7 g$ |# x& o/ {
3.getpoint函数. a2 R' ?0 R, R6 K6 f$ [0 j' S. @
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
$ p# N8 I) k8 Q1 ^8 M. \(getPoint[Point][Prompt])# F. Z% t9 Z! y# W0 U. ]$ ?
其中point…………………输入一个点,或选择一个点# T6 m4 b, ^! k$ U2 V' a6 b
prompt…………………将显示在屏幕上的提示. L6 q% m$ M/ m: P. ^4 T
示例:
* y! i) m1 C5 f7 _ (setq Pt1(getpoint))4 l- b K q5 K+ W9 F
(setq Pt1(getPoint“Enter starting Point》
6 i' B& Y# K( _: V 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
, z7 N( s; ?( E* T. ]* E% n4.Command函数
- c5 F8 D3 l! o6 z4 xCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
1 z2 q1 U' K* Z0 U7 Q (Command “Commandname”)
) n5 t: w. W/ @4 W, r) I 其中Command…………………AutoLISP函数
9 o# z: G* ]! OCommandname……………AutoCAD命令
0 S: E6 S+ w: P! B" z示例:" `$ A" S6 [/ D u
(Command“line” Pt1 Pt2“”); v9 q* C( y3 k1 G3 m$ `
“line” ……………AutoCAD LINE命令
0 |4 c4 r3 E$ K- aPt1……………………第一点
/ r6 x. c/ e0 M p1 BPt2……………………第二点
: O8 p3 Y1 b3 j7 ~“”…………………用于返回$ ? j+ T" i- ?# i- C3 |7 c- [* L
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
/ x1 F$ ^$ d' [Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。% d9 A! P( m0 @# Z$ k
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。! B6 W% B: j& a) Q6 z, L1 |0 {9 y. I
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
7 H0 z0 X7 W; R, h3 }9 p# G# j 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
Y3 A( \( | I9 h" Y$ i/ S8 Y+ p$ ]4 @ 编写程序前,必须确认这三部分。
4 `/ R! Y, @# V$ }" L0 Y2 {+ }0 Y 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。, I; T4 g: j* C8 _) J! @/ _% g
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
: Z3 a5 F7 R9 n! c* L' h$ } 输入 输出
# R. T/ _) e8 }$ {; C P1点的位置
* S7 J) V- l8 S) V P2点的位置 三角形P1,P2,P3
) K1 Z5 V$ L8 b; U' m4 k+ R P3点的位置6 F1 ?9 h7 f" @+ x8 R. f
处理过程
; _& V% J' v0 P3 r( L 从P1到P2画线* d: M2 E) M) K) e; K
从P2到P3画线
$ j0 t8 E$ K S+ e9 o 从P3到P1画线( k* b; L ^5 X0 s ]# s$ ?# J
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
: \* X" K0 t' R0 B$ Q$ l, U% B4 `;this program will prompt you to enter three points 1$ R) W2 P, Y0 i
;of a triangle from the keyboard ,or select three points 2 l, e) Y' x( `9 }0 D* F
;by using the screen cursor .P1,P2,P3 are triangle corners. 3* k; L |) g' `& [4 T) y
4 g+ V2 y0 e7 A* \/ d$ K
(defun: C:triang1() 5: Q6 ^8 G, P1 s4 `7 f3 B' B3 J! D
(setq P1(getPoint“\n Enter first Point of triangle:”)) 67 G+ T& u4 m' n1 A* y. ?6 [
(setq P2(getPoint“\n Enter second Point of triangle:” 7
! u3 e0 n& Y( n; p1 x" j (setq P3(getPoint“\n Enter third Point of triangle:”)) 8) A7 W5 G; [3 m( Q7 T q
(Command“line” P1 P2 P3“C”) 9
0 k2 G+ _4 x7 g" }) 10
8 D- g9 O2 g$ e5 q, G8 |说明+ [1 m9 q: s( Z- @" w$ g
第1-3行
! M" `5 W; K( o2 |! x* ]前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
) O# b2 w, h8 s! m第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
+ G6 n, W9 F* Q0 A$ p( {% Z第5行:(defun C: triang1()4 h9 r7 V0 m" H: g
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
2 P4 C4 c8 p0 B第6行:(setq P1(getpoint“\n Enter first Point of triangle:”)), s) g4 D3 p2 A
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
0 ]5 p; c) v( y' H第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
! ^. ]! }! a2 h& B+ t5 W, P; |这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
% X8 K, V- C: X9 u: _8 k第9行:(Command“line” P1 P2 P3“C”)
7 l5 L- [! R2 e7 p5 `, n8 d( l- U本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
7 m$ _8 k! W% a/ K& S第10行( O7 H7 N3 J0 Q. l+ k& u3 d
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |