1.defun函数7 x; ]5 f7 T4 a3 Y9 \
defun函数用于在AutoLISP程序中定义函数,其格式为:/ O# r* J% H2 j! b f) p" _
(defun name[argument])1 h8 D2 u" J, I' ]4 R
其中name………………函数名
. R# `2 Y. }' H* [2 d H argument…………参数列表) W7 I; h5 s( _. b/ p: M
示例:
; Q& v" J7 u& M. |) F1 u& _8 n(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。/ E$ x7 z f: |& w4 B) i# ?
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
( L5 ^. H$ F7 C R/ Q' t2 e(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
- @8 @$ T$ Z. D0 z) K1 m(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。6 s; l) E$ P/ t6 {1 O, D2 v$ f
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
) Z b+ e: ~( T# Y( x4 a3 D2 ~Abs ads alloc and angle angtos append apply atom ascii assoc atan- V$ Z3 U3 P2 F/ |+ m
Atof atoi distance equal fix float if length list load member nil
) O+ `% o+ _) x0 y( g/ f1 f$ ~Open or pi read repeat reverse set type while
# m& r4 i0 w9 }+ \% |. r2.setq函数
7 ]% B0 ? C; j2 F, J6 p/ W8 [ setq函数用于给变量赋值,其格式如下:
" w" s4 u# s4 S0 l+ k (setq name value[Name value]…). _6 p3 o* e5 ?7 J4 L+ t# u" m q
其中Name…………………变量名
* X @ |3 O' h4 O$ ~ value…………………赋予变量的值
" | W9 O2 e. W) r6 d9 b4 `+ z 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
( w' y5 c2 @* E% b3 Y Command:(setq x 12)9 Q4 ?" R$ [0 Q. ^8 R0 ?6 q" j
Command:(setq x 6.5)9 Z ?$ b) R8 M4 p3 g
Command:(setq x 8.5 y 12)
8 J" F- s6 a3 `! } 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
: G6 S9 u) ]% U( M Command:(setq answer“YES”)& u! C+ f2 N( i N8 Z" U1 W! j( ~
这个表达式中,字符串值“YES”被赋给变量answer。8 I# Q' H: v+ o
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
6 k( A. n, ?8 i) P) X0 u( Q (setq pt1((getPoint“Enter start Point:))
7 b9 O! D1 ^. T9 } m; ?/ f1 e (setq angl(getangle“Enter Included angle:”)): `7 L5 S7 w6 U0 z. l/ ]5 U8 y
(setq answer(geststring“Enter YES or NO:”))
" c {6 D; `3 H. E& f注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。- W3 \4 j/ E: v6 g
(setq Pi 3.0)+ F2 z, G0 j& N& n6 j2 ]
(setq angle…)
6 Q/ u: s- A; h# _1 R# O% e4 G3.getpoint函数
\5 h) c) A$ g+ p5 ygetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:0 K. a) g! A7 E; [
(getPoint[Point][Prompt])6 \7 ~ [) z- s" }: E$ w% j( j
其中point…………………输入一个点,或选择一个点$ ]. {4 b* k3 _5 `' {
prompt…………………将显示在屏幕上的提示
# P, k9 r7 h' z' G2 o$ G, E3 w 示例:
, W* e+ r U# ^ v4 y* }2 R3 j (setq Pt1(getpoint))
2 F3 s% H+ k$ J" Q+ c7 {$ C6 s (setq Pt1(getPoint“Enter starting Point》2 \: F5 ?2 i) Q; n; j( l) f
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。; E$ X( U4 s, C7 ~+ Z
4.Command函数% c% m( _9 ^3 y1 Y/ h# [
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:/ I4 y- S) j0 h/ q5 J, m
(Command “Commandname”)
' P; x+ n5 m3 H! h. t! s8 l' G 其中Command…………………AutoLISP函数
# S* r2 ]* y( \+ W0 L: }Commandname……………AutoCAD命令
. d, V3 x& t; o, m1 l+ O3 e示例:
: ]5 b. L% {/ p% ]1 {(Command“line” Pt1 Pt2“”)/ n& o: M7 @5 Q
“line” ……………AutoCAD LINE命令& B* Y# G+ }. E; F' ^
Pt1……………………第一点2 P5 [' k4 y% y
Pt2……………………第二点
# ? F6 V* z* d“”…………………用于返回
- E" h! R$ \& H& m! @7 t 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
! I' E: |5 z' s/ R# l3 ZCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。+ X! D N _# G+ O. v. \
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
) a& i3 V1 `. X$ ^- R3 Q9 c例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
$ E' T( B" a, k# N0 ^6 K 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。; O, h9 L# t5 p P! w
编写程序前,必须确认这三部分。! K% C# h" f' P4 r
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。. R; t* h1 J0 s/ Y
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。" R. ]) M! h8 f9 Z5 N5 \0 `# ^
输入 输出
1 ~! @' E5 l1 K P1点的位置. t, O- p$ l+ G: b, C
P2点的位置 三角形P1,P2,P3/ E1 o7 H/ A4 }- g. {" R1 J
P3点的位置
* }( y' S1 }5 z$ ?7 X! ~ 处理过程
: O* [0 t5 T: j 从P1到P2画线% V, G" L. O1 g* U" V* R7 E& o
从P2到P3画线
& Z6 r0 H! B6 z1 F& p# w/ G4 t8 I 从P3到P1画线
+ L* A5 F4 J: y2 B; K下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
5 F! K* k8 O; Q3 Z;this program will prompt you to enter three points 15 A" E3 P; p' T- C. ^3 c$ _
;of a triangle from the keyboard ,or select three points 2& |% D. f6 C( t t
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
7 Y( a! F, K$ z/ D! ^ 4$ ?! i+ V3 {# C4 ]7 Y( n: v
(defun: C:triang1() 5
6 B, {- e' k* V( a. Y) A3 I (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
, \2 l* V m; m7 m6 g" O& U (setq P2(getPoint“\n Enter second Point of triangle:” 7
- l2 Y$ t5 \1 k, q$ y (setq P3(getPoint“\n Enter third Point of triangle:”)) 81 t' N2 ~7 R, \: V$ K$ B. U( H, d
(Command“line” P1 P2 P3“C”) 9
6 _/ @- i/ _' q; A, y) b) 10
+ {8 _$ H" H2 Q/ S说明9 X/ w$ q0 i4 S: y6 @/ `7 f: `
第1-3行( b- d6 H5 H4 |, o, U
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。0 l% Y* t" U: P5 R) R; g' r
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。* n+ A" `4 ^$ j
第5行:(defun C: triang1()
! z; M \' Y% a6 |7 e本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)/ h9 O" K! x6 ?
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))! X( a: ]" P$ {6 Y L
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
7 U3 |7 t ]( U$ Z& r第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”)) A4 ]/ V9 i) y9 O, N
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
$ @+ s/ q0 Q0 Z0 s `3 l5 C第9行:(Command“line” P1 P2 P3“C”). ~; B% Y! S* T) n7 ~5 J. b9 {
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
4 ~ X! m' T$ s( A第10行
I& O( U; b% M; d5 T- l本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |