1.defun函数
) v) m# U0 ]6 O" {# s. c9 [. n7 cdefun函数用于在AutoLISP程序中定义函数,其格式为:
+ B0 i6 e' l6 W (defun name[argument])# m9 g4 x6 K0 z, q+ P9 k# ?9 Y
其中name………………函数名
. @5 V' n3 [! N( u" e argument…………参数列表
# M! n, c" ` l. ^ 示例:
% q+ i% [4 q( g$ r$ A1 T. L: K(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
+ n: `7 D, b& J/ Z' n(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。7 }# B9 P' e5 v
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
5 s/ P4 V0 p" V(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
3 f6 g) t8 [6 L) [3 b6 r注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。+ _# l+ D% \* B a4 [
Abs ads alloc and angle angtos append apply atom ascii assoc atan
m; |( d6 {9 K( F C! cAtof atoi distance equal fix float if length list load member nil0 x5 D* X& A6 }4 p% Y' a( R
Open or pi read repeat reverse set type while
3 L7 s4 c; [0 Y/ ^8 o6 b2 L2.setq函数
' ^. d: d" [7 I setq函数用于给变量赋值,其格式如下:: v& u' r& @# h; `
(setq name value[Name value]…)2 y* Q- {/ L4 N0 L$ D0 }0 W
其中Name…………………变量名
! r+ p5 Z% Y6 t7 ~' F3 f value…………………赋予变量的值# e3 H* Q1 o0 x7 L6 O Y& H
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
1 n! ~" q8 e$ O* M Command:(setq x 12)
3 K$ C4 x2 x* v4 } k+ A Command:(setq x 6.5)+ t; g" u" r. `! Q0 K9 T
Command:(setq x 8.5 y 12)
/ \3 {9 U9 A) B) j2 g" Z% r/ p 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
/ M# N f( t7 G+ `& a% A$ }& F$ m Command:(setq answer“YES”), h" t0 {: Z' m; y) z1 i1 ]& g
这个表达式中,字符串值“YES”被赋给变量answer。% l2 ^# c W+ \$ t3 w
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
4 m5 D. s/ { N* `' r# ?5 C (setq pt1((getPoint“Enter start Point:))- L% ~- r$ [; ]0 _( l
(setq angl(getangle“Enter Included angle:”))8 Y; F0 w( W8 N- d3 m; L
(setq answer(geststring“Enter YES or NO:”))
0 v3 e7 z0 D- f+ j, I1 D1 G注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
/ ? z0 M4 o: M0 F& y( ] (setq Pi 3.0)4 c( C0 J# o/ F0 E9 z1 R1 }" v2 ?
(setq angle…)& h6 V% G& m6 s' r
3.getpoint函数4 }6 l: Y+ j6 t6 A
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:! }8 T; A: }; s5 o8 W" v0 s
(getPoint[Point][Prompt])
9 @# ]0 |! K6 m 其中point…………………输入一个点,或选择一个点2 @% F( D* P( B! [
prompt…………………将显示在屏幕上的提示2 X2 e8 t( Y$ z
示例:
3 J' U9 H( B/ g. z! k! a0 J7 s" e (setq Pt1(getpoint))7 a$ Q' h6 z2 i9 F/ ]
(setq Pt1(getPoint“Enter starting Point》) }+ W4 W' G: n
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。- [1 z+ [. u+ Z5 ?3 P
4.Command函数
; R! a% f7 f% ?3 I; J" T% y8 UCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:2 E: Q7 q6 w; U+ v1 E+ q
(Command “Commandname”)
\( l+ C" O+ I/ \6 o, O 其中Command…………………AutoLISP函数+ p' D/ G/ @5 y2 |+ L2 Y
Commandname……………AutoCAD命令; z- \3 M/ c, [* y/ z( _7 e
示例:
: v7 F6 W, J1 w5 l) a5 t+ }(Command“line” Pt1 Pt2“”)
/ O. T6 i% P3 C* u5 b“line” ……………AutoCAD LINE命令0 g1 S3 b2 q( F! j3 @$ g
Pt1……………………第一点
# h: U% B' m/ T' W. v; vPt2……………………第二点6 u _5 Y9 x% U$ }# s6 s
“”…………………用于返回' @# Y) Q& p& @5 X+ @9 M: |- ?
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。' A a. l9 S( o. F
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。9 }$ D/ h( ~# Y2 N, _
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。( M2 H5 j) `, W) E+ I; U
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。& X* W6 ]4 C& u2 ~' }0 O
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
7 C M' ~. j/ C7 N. T, A 编写程序前,必须确认这三部分。
: ~. M/ M' J7 ?- x; E$ V 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。3 p' N: Q* g W; b% X
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
) {* d2 ~- K1 _3 v: v/ u; f" r 输入 输出
- n+ a: |2 a* q$ v9 a5 S3 A! A. s P1点的位置
" ? q* A& M" d, N. b P2点的位置 三角形P1,P2,P3
5 B) M& K1 m" d, l) K Q+ I! n P3点的位置3 z0 i! ~5 T5 x. [, j( g! c, f
处理过程: U4 R, O, D; _, P3 }" {0 l! ?6 [
从P1到P2画线% u4 W1 }$ l; { S1 F- k1 A
从P2到P3画线
1 A; l3 ?+ ]6 a; f 从P3到P1画线
. ?. T2 y: k0 q下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
& {9 C8 h: r* c6 d2 y" C;this program will prompt you to enter three points 1$ @" o( A. I$ x
;of a triangle from the keyboard ,or select three points 27 ~; W o: ?4 S
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
3 K* C- X6 P1 B 4
# N, S5 p4 N4 w, v5 @(defun: C:triang1() 5) F3 X1 h7 ^5 t% z5 f+ ]
(setq P1(getPoint“\n Enter first Point of triangle:”)) 62 r; {5 l6 y$ v/ }% c
(setq P2(getPoint“\n Enter second Point of triangle:” 72 N$ h: _! P) K9 |7 q% o* P( z
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8: M/ _" m8 K) t# l4 e! [
(Command“line” P1 P2 P3“C”) 9" |: v7 T1 Q7 a/ O. Q- z
) 10# ?3 s1 O, f* T9 `
说明$ S. y. P# x- `) _" @' h) ~
第1-3行
4 T" v) z) c. g' P# D* ~' y前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
$ B! y) w2 P4 w第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。: ]4 G8 I9 b4 j. q! C8 L1 E1 |
第5行:(defun C: triang1()
+ a& Y6 @* ^7 O! f; p本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
( k& Z3 T q; M) N第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
- ^5 L& `& b; n' X! `* L本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
9 T- v& K3 H: {& z7 \; P第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))6 X- V* ^% R. g) f+ [1 s
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。! V) t$ O9 F! s
第9行:(Command“line” P1 P2 P3“C”)% W7 G! A5 o) q( M/ I a; R/ A3 {
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
1 g( B9 W3 p+ S" i# `# R: i- i) l+ x第10行/ j& U3 |0 K( t, {
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |