1.defun函数$ Q B8 e) |+ l
defun函数用于在AutoLISP程序中定义函数,其格式为:
; v7 ^1 M8 j, h) e, o5 O (defun name[argument])- L* T+ y2 X* l' ~, z+ Z+ |
其中name………………函数名6 L0 m9 j' M0 \# d, e. z/ v
argument…………参数列表. N6 z1 X5 x( ~, D0 c4 f F n7 G! U
示例:
: g' ~2 Z' Y# [2 M. A(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
6 ?& ?, `- Q: N# s9 H0 ? N(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
* v: n* e4 P( J% J; K(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。# B* l& t9 e$ J' l3 f! F$ A3 Z
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
1 u! w( {) z/ D- H# q注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。6 c3 Q6 E! Q* k7 e" t2 C* S
Abs ads alloc and angle angtos append apply atom ascii assoc atan
6 C: \' T3 f0 B8 o$ PAtof atoi distance equal fix float if length list load member nil
8 X- `- E9 `/ W' V3 [Open or pi read repeat reverse set type while
) v x" N) x& Q. q" T2.setq函数1 ]" t. `% \& s5 f# v$ A- q0 C
setq函数用于给变量赋值,其格式如下:5 S. M) f L" i( R9 e- \6 H
(setq name value[Name value]…)
3 C. V/ c Q* I3 C 其中Name…………………变量名$ X- [. ^0 L! G- E
value…………………赋予变量的值
1 t' a: V/ L3 i- k k3 N5 G! D* [; Z2 `4 Y 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。! N) [7 p) l) v; { [* D
Command:(setq x 12)3 [5 k9 Y+ I6 H) G
Command:(setq x 6.5)# _! X9 `. Z( W. i
Command:(setq x 8.5 y 12)
2 u z1 _- I) I! f& L+ n) J, X4 \. v 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。/ k6 D1 N" R- T- w9 B# X
Command:(setq answer“YES”); A) Q4 y5 v6 R9 z1 J
这个表达式中,字符串值“YES”被赋给变量answer。7 w& G# ?9 G+ X2 `6 d
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
" v+ F7 W) Y/ F- G4 K( j; W (setq pt1((getPoint“Enter start Point:)) t+ Y6 ?5 B: m9 v
(setq angl(getangle“Enter Included angle:”))( `/ |2 l7 b' u6 |$ K
(setq answer(geststring“Enter YES or NO:”))
/ h( p6 A& n9 A/ g7 p, h, v注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
/ C; x( _( E' B8 C% i' w (setq Pi 3.0)
6 z1 C! j$ n( A/ J3 N) e (setq angle…)
: ]- Z2 R6 a/ {" V* e9 c3.getpoint函数5 h l9 v5 k7 W& j$ ~$ N( P! w
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:4 O& ^4 j5 m* H0 v
(getPoint[Point][Prompt])
* Q8 t J; _9 q" ~' i' e! j 其中point…………………输入一个点,或选择一个点& P6 }5 k3 g0 V4 i' F9 s' u& `
prompt…………………将显示在屏幕上的提示2 |* k. W3 r6 B; |& f7 P+ r$ G
示例:
2 j C5 ]4 J) P- @4 C (setq Pt1(getpoint))
* Y9 x* l$ c/ m4 T2 i6 B& M% I( g* ? (setq Pt1(getPoint“Enter starting Point》
6 T3 t2 [6 Q6 `2 m 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
5 M4 J: N) y6 w4.Command函数: r* \$ ~- O+ k9 ]1 ~
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
7 i; X G7 i1 V `# d (Command “Commandname”)/ w/ Z9 l% Q) ~
其中Command…………………AutoLISP函数
% Q, s u9 n! J9 X8 VCommandname……………AutoCAD命令
# ]9 ^- i9 Y5 z示例:
# u; |! `* B5 P(Command“line” Pt1 Pt2“”)
1 L' y4 C( N6 f" j% E8 p6 i# e“line” ……………AutoCAD LINE命令
# a) {) K9 U* Q5 GPt1……………………第一点
' f7 v1 D m# q+ u$ u" Y2 @Pt2……………………第二点
; c* q# C3 |3 z“”…………………用于返回; y R6 V6 D8 a5 {' M. y; y7 }/ G6 F
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。' [7 S0 o# Z1 h! h6 V
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
8 Z0 N: S3 Y( K2 k不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
- p1 O# [1 }/ B, ?. O例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。3 u* W2 o4 y/ w0 O0 P0 B
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
8 l* f, Q: |$ D+ E$ u6 W1 z 编写程序前,必须确认这三部分。
7 W# T3 j7 g# k; h0 H3 x) ]- T9 Y 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
8 S. W; m. X8 I5 e% A2 a" r7 j 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。$ n! o2 ~ f7 ^
输入 输出 X9 C, }/ a; h w8 j. f6 D
P1点的位置
, {8 G& S& G$ y$ C' M P2点的位置 三角形P1,P2,P3, I+ V, n$ {, B4 ?/ J# k
P3点的位置* e T7 f1 I2 a) ~) f7 ?
处理过程& l$ f6 `# M# o0 G, |
从P1到P2画线: q X$ q6 M9 Q% G
从P2到P3画线- W) i" B/ G0 J- h& f+ S }# i6 D# c! }
从P3到P1画线
+ r# s5 Q, g4 N m下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
3 l- ^$ R% S7 N- s3 c;this program will prompt you to enter three points 1$ F- a1 m C* z! |2 U
;of a triangle from the keyboard ,or select three points 2
: u+ s8 U8 j* P;by using the screen cursor .P1,P2,P3 are triangle corners. 3
( T1 {+ D H) X L# U2 o. L0 L1 c 4
+ T; u. [0 n! a: a(defun: C:triang1() 5
+ z% ?0 h* x; b3 ?3 C! [ (setq P1(getPoint“\n Enter first Point of triangle:”)) 63 V: t& f5 j1 y" f9 o5 i8 a0 }( }
(setq P2(getPoint“\n Enter second Point of triangle:” 7
& B' |, K! N9 O4 @, ~/ Q (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
. Y5 }$ G% w" O6 W- U" s (Command“line” P1 P2 P3“C”) 9* k5 \$ Z! X/ H ?
) 10
) u. K$ k, y! v0 n) Y* A: j说明
* Y6 j% g. S& D" V3 W) ]% Q6 s第1-3行" [9 o; R# y7 Y5 ]3 M3 i
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。; ~4 o* p/ z/ r4 r8 ]% P: I
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。/ r9 H4 E4 f2 M- c9 n2 ^
第5行:(defun C: triang1()
8 P8 J C1 _: F4 q& K本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
" Q- s4 P4 L6 v; } @' E) M第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))3 ^( i) u: D& Y( Q } D: _
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)# V5 n' Q& V6 g0 D9 Y$ }
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))5 a$ U: W, f3 P" c
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。5 j* B2 i& P5 T
第9行:(Command“line” P1 P2 P3“C”)
7 p" P9 g! ~, e$ Y本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
9 h& j2 v# u- Y" l: i) G/ C第10行+ Z" N7 K' c6 U: B
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |