1.defun函数
. t. ~7 ^; ^2 Y3 I" U; ^6 Tdefun函数用于在AutoLISP程序中定义函数,其格式为:) [ K! f) k0 _- T7 z
(defun name[argument])" |/ y2 l: ~; ^. ~
其中name………………函数名
0 ?/ c( M5 I% x argument…………参数列表
' Z+ h0 l& J9 w) I 示例:1 \5 d5 E/ F0 ^$ b/ U8 B9 L w, q
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
1 Q- p A' X) ?( P' f0 K(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。2 }0 M8 L* }6 g' x6 K! Z. f
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。5 D' {9 p6 D2 T- _& l
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
; v P+ m1 J! Z" W+ R! y. y注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。* J8 e! [1 E. [6 B" d0 V
Abs ads alloc and angle angtos append apply atom ascii assoc atan" v9 i5 h8 o, q1 u
Atof atoi distance equal fix float if length list load member nil2 F1 l4 P; i' S& u: {% P
Open or pi read repeat reverse set type while
# N! V g* v& p+ s: e) a) E) A8 n6 m2.setq函数
5 @/ i; U& p( W setq函数用于给变量赋值,其格式如下:* C6 u* r/ D) ?1 ]8 y3 w
(setq name value[Name value]…)( n9 U4 F; T. ?( S+ p& g
其中Name…………………变量名* J2 g, t) A+ t" b6 Z: D
value…………………赋予变量的值
# y( e @: V0 ]- Z* V: z! X# y1 G 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。1 L9 f. U/ X' R0 q' u* m2 t, S
Command:(setq x 12)
( d0 D1 J" O9 G2 k' l& F6 i Command:(setq x 6.5)
7 x9 S" n1 R" \' d( j! ] Command:(setq x 8.5 y 12)
' h: b5 U0 s' x7 e* q2 I 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。6 b+ ~' t$ D. L/ g
Command:(setq answer“YES”)8 _9 H R4 K" N1 ?4 f1 d
这个表达式中,字符串值“YES”被赋给变量answer。
. ]5 Q* |8 l9 s0 O: S+ f3 N% G setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
3 s+ J) s' y1 f9 H (setq pt1((getPoint“Enter start Point:)); ^- O. C! N- ]( O. ]
(setq angl(getangle“Enter Included angle:”))6 B+ a! {! m9 l3 F/ P
(setq answer(geststring“Enter YES or NO:”))
$ s" k0 j3 Y7 Z' v1 n注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。+ h4 p& F$ ^0 h' A1 y" d
(setq Pi 3.0)
( @' E6 w9 a2 Z* r# b$ N/ } (setq angle…)' D5 U2 H/ K% l# w* m1 C, Q
3.getpoint函数8 ~ `# J2 ]& Q$ e1 Z! p# `
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
5 h5 \: g6 q8 e) O' A, f/ {(getPoint[Point][Prompt]), J) Y4 p& F6 ^/ ]0 v
其中point…………………输入一个点,或选择一个点 ~: {' R( }3 `* s$ `& _ H" H" q
prompt…………………将显示在屏幕上的提示/ ?( v9 L) i }+ S# e
示例:2 L, `8 |- w' M# k7 D9 Z3 D
(setq Pt1(getpoint))4 c, L6 m: }9 p \0 [. B
(setq Pt1(getPoint“Enter starting Point》
0 s! v7 V) W+ g" d4 B) G 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。 A* l6 R: j* S, s5 t
4.Command函数
# q4 n. l4 g! w' ]7 k- |$ x2 sCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:) S3 P$ x; A* A$ S& P9 k
(Command “Commandname”)
7 o5 k0 p4 e9 v/ P$ V; G 其中Command…………………AutoLISP函数3 s4 o8 ~" m& A
Commandname……………AutoCAD命令
9 @6 L$ n( [( o& x1 Z7 z示例:
/ [& U; k; @! ]+ @(Command“line” Pt1 Pt2“”)) t7 P, o/ o* u# j1 r
“line” ……………AutoCAD LINE命令' ~3 Y4 a8 q$ k( \5 Q; k
Pt1……………………第一点
3 {6 G' a# }, m i+ WPt2……………………第二点7 R" w5 }' l2 N6 |
“”…………………用于返回
8 Z+ Z4 ?* g$ {$ e; S0 ]/ e& u0 o 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。4 u% O* @( U" p! N+ h2 n; j
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。: {3 V' J8 |( _" [2 x: g3 b2 y9 g
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
, F" g! {% t1 L0 J例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。9 A D9 r9 X. ~2 w
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
( T3 I- ~! k2 M+ Y% p1 X- Q 编写程序前,必须确认这三部分。7 m- R% b) f4 K4 C) z
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
: {1 D) H5 g' o( N/ R* g 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。8 T4 T3 n2 E4 V% s( p
输入 输出9 H3 q) O& Y4 U- W7 t% d
P1点的位置% L! x4 d5 d2 F
P2点的位置 三角形P1,P2,P33 Z; {# F- \) l
P3点的位置
4 D5 s7 ^ ]6 c; K- s 处理过程3 M/ \3 h2 w" s
从P1到P2画线
1 T& W: t+ d) \8 S$ T 从P2到P3画线3 }, r% I, V# q) t+ z: ]$ a
从P3到P1画线
5 f" }- u: s, }9 J* b) q下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。" l% m z8 D* e
;this program will prompt you to enter three points 18 x6 @. d* G8 l* @
;of a triangle from the keyboard ,or select three points 22 l( O" \1 k, x0 d
;by using the screen cursor .P1,P2,P3 are triangle corners. 3/ w v! Y& `4 f! k
40 h0 @7 L# M- \
(defun: C:triang1() 5
1 q" [# c5 i$ r H) ` (setq P1(getPoint“\n Enter first Point of triangle:”)) 6$ P7 H1 K6 ]1 z" X" C2 ]- _
(setq P2(getPoint“\n Enter second Point of triangle:” 7! W! N$ j, s9 y/ ~% Q" B8 C3 r4 h/ U
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
! \' ?. h0 ]& S) O2 s0 P (Command“line” P1 P2 P3“C”) 95 S. ?$ z3 f5 h* }2 [, T/ b
) 10" P" x& z& P% Q6 B* o: Z
说明( G- r0 x" x" A
第1-3行5 F7 d6 y; @9 n8 ^! h5 A
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
$ d& t. z$ K7 |: J. G第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
" Q# d4 B& J; E& a第5行:(defun C: triang1()3 L6 J" ]3 A) n1 p" e5 r
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
- u7 ~- K' B3 s" u7 n3 @. E6 K4 ~第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))" o( ~( \& ]) B' z" a
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)6 x. [) u' p) y# @
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))# |8 y# z0 u# [' U; G7 T
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。5 L6 A0 D2 w, ]$ m, L
第9行:(Command“line” P1 P2 P3“C”)
! X5 I$ u8 j; K. A本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
3 k* F6 v5 c! A/ X第10行$ m9 W. {) ]$ |+ e! T9 ], v* |/ y
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |