1.defun函数' b+ k4 D3 y5 g/ f7 X
defun函数用于在AutoLISP程序中定义函数,其格式为:
. | Z: [. \$ O/ _2 P# [$ v (defun name[argument])# G; B6 L! G7 r9 b' _0 x; G
其中name………………函数名
$ s6 Z6 `1 y2 N4 O# o argument…………参数列表
! R8 l8 q6 A2 n: f, G 示例:& y* A N: ?" \% y4 f' l2 Y
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
7 N) {' v# X+ b(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
3 {+ b+ S$ Y) q(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
6 M3 d5 w$ P& O/ _(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。" n5 v. q' k9 _$ ^- n* D
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。, L4 Q! ^4 y4 s4 Y
Abs ads alloc and angle angtos append apply atom ascii assoc atan1 z1 t; l. y( I
Atof atoi distance equal fix float if length list load member nil
5 } j6 p& k. M6 i$ k& L! o! |% [Open or pi read repeat reverse set type while
9 f, {: j% A* b2 s: s6 I5 ^2.setq函数; f' m( \4 k$ l, c# q
setq函数用于给变量赋值,其格式如下:
4 C0 {- W% @, k3 m4 E0 F (setq name value[Name value]…)
1 S3 `) T7 r# a0 d0 D/ m 其中Name…………………变量名
+ W/ J4 E$ n0 P' Q4 i. c value…………………赋予变量的值+ m. r1 b) R" D. K J' S
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
" \8 K! v. |9 ?* r$ N Command:(setq x 12)
+ w1 l8 U$ A- X Command:(setq x 6.5)
: v8 F" n$ e8 @- f/ K0 D Command:(setq x 8.5 y 12)0 R7 _" l; p8 ]* F
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
7 R7 n9 z2 L, G6 c Command:(setq answer“YES”)% h' X1 d g3 t
这个表达式中,字符串值“YES”被赋给变量answer。
' I3 Y9 i9 h- g! A; p5 O setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
. n3 d+ t# |) e (setq pt1((getPoint“Enter start Point:))9 }% {1 S# e$ E$ g
(setq angl(getangle“Enter Included angle:”))2 D, } U( c' Y. x0 J ?
(setq answer(geststring“Enter YES or NO:”))2 m- W, Q& N; i. [3 N5 `
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。3 F' o) z* m& U$ A
(setq Pi 3.0)
( O3 ?2 g1 Y1 s- \# E (setq angle…)
r `0 ~9 m* X2 V! @3.getpoint函数
# ?8 y5 ^; e2 z4 Q8 F* \: |getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
4 L$ u& S+ M# v5 I6 U. E: k7 e. _(getPoint[Point][Prompt])5 ^" Y; I8 D/ O$ J, g3 `
其中point…………………输入一个点,或选择一个点" B, e! X8 Z6 i! W- P, Z, h9 \
prompt…………………将显示在屏幕上的提示# ?6 I' q) g" h! B5 e ^
示例:* {% w+ d/ h1 ]; @: q0 B( U
(setq Pt1(getpoint))8 |$ n; ]( X. a4 Y) ]' T: C
(setq Pt1(getPoint“Enter starting Point》7 p: M* d( V( @' i- [- p' a* }" _
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
* z( L' ?& r$ l$ d$ T4.Command函数2 w. u7 b( c4 [: T A
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
& ^2 S, ^( E' o, A5 x& a2 C (Command “Commandname”)
- K6 p A& |" O) H" o2 ~* V& z+ A 其中Command…………………AutoLISP函数
, R% P+ i) ?# b4 C; [- tCommandname……………AutoCAD命令" w( z1 t* R: u
示例: C8 `" H7 W5 O
(Command“line” Pt1 Pt2“”)4 k5 e$ X. o1 |
“line” ……………AutoCAD LINE命令
+ W! ~) L1 V1 ^. ?# d B: S& F EPt1……………………第一点
3 z+ g& ]" D' mPt2……………………第二点
. @/ u) ~' M+ J9 y( [6 \) @“”…………………用于返回- }( p; C& ~+ c/ \/ b+ V T
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。: d5 W' \& }. u; X4 t/ N
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
# s! Z" S7 O" r# n: B( m不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
3 ^3 r3 Y3 @) z, S& T2 M7 [: x8 M例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
9 l. S7 V: w/ z2 T 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。7 r" N( V9 b Z5 [+ P% x
编写程序前,必须确认这三部分。* y5 q& o9 ]8 T4 [9 w5 q- ^
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。) T. k, b) p" W5 ^% C
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。' c [; A0 r* \+ v' g4 b! T
输入 输出' ?8 X; y; w% [0 z
P1点的位置
' `+ j0 j4 f! G( ^0 E3 y! f8 A W P2点的位置 三角形P1,P2,P3
3 i1 v) }) M- z( }6 ` P3点的位置; T! N0 I" i" }, v" s1 }
处理过程; J- b4 ~5 N- \; f- o: h. Z
从P1到P2画线% z" K8 W! U' y
从P2到P3画线0 _6 S2 c7 E0 W! }) |0 {9 Q# Y
从P3到P1画线
1 a# _7 E/ T9 \7 U+ J0 T* H5 F+ G( O下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。( [* ~; T. s9 k, k
;this program will prompt you to enter three points 1
- A6 r# S# k; u! ~$ D; r;of a triangle from the keyboard ,or select three points 2
/ [# g& z. g8 m;by using the screen cursor .P1,P2,P3 are triangle corners. 39 A6 V! Z' l) o5 s8 m
4$ Q; R$ }9 v" W0 V, L8 Z
(defun: C:triang1() 5, ~ N1 I+ S: h9 A2 x
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
4 B h- M* b( ~$ b% `9 o (setq P2(getPoint“\n Enter second Point of triangle:” 7
7 q2 U1 o5 P0 `+ @1 f (setq P3(getPoint“\n Enter third Point of triangle:”)) 8- Y, w; S) m! {& L" d: M) _
(Command“line” P1 P2 P3“C”) 9) g2 i' X, Y3 s/ f, {9 R0 b
) 107 t* m" i' Z7 X/ x
说明
( w9 L6 M2 |' D1 N/ ^3 o8 Z第1-3行/ g Y3 [. S0 s9 i: C
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。: H: Q. Y, e) M3 \; s7 g
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。7 N" H& q) E4 l( N; Z
第5行:(defun C: triang1()
6 K+ c- G8 m; I& B本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)8 Z+ d7 ~# l( U! \4 ~0 {8 e5 f
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”)): k2 E0 D& W/ q9 y8 H, L+ l+ }: ^/ _
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)4 F' O) i4 d2 q" F7 j7 O
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
3 g# H' e) V3 h; y+ R/ P这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。* |7 |# E7 |7 h+ t5 N. v
第9行:(Command“line” P1 P2 P3“C”)6 c6 @# L2 n* P3 A/ j/ k0 w$ M0 j
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
7 u5 y! U* X; r9 B4 h: t5 m第10行' B" y. S/ S+ U# i- x8 j
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |