1.defun函数2 u% Z2 a* {* ]* W6 X4 U( b
defun函数用于在AutoLISP程序中定义函数,其格式为:, L8 E {# @2 W4 ?: O H
(defun name[argument])6 o! t% T4 s- m( j% V7 t
其中name………………函数名) u$ V* @2 A8 m5 `$ g
argument…………参数列表
, Q, ^9 Q9 a4 N5 L( R. L/ r* l 示例:
6 |: \' X5 G& `' `2 Z4 v* h(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。9 I4 I7 b8 S# i8 r2 K5 T
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
; u- [* {: [# O8 v2 T; @, W(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
( V0 ?: U. N. Q(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
( W: R1 n( q8 c( l2 U0 [注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。8 `5 b1 q. t0 L9 Q
Abs ads alloc and angle angtos append apply atom ascii assoc atan5 C& f, f: _* M+ Y/ Q8 R
Atof atoi distance equal fix float if length list load member nil' P/ v3 g- x* y! o, c& m* R5 m9 Q4 L
Open or pi read repeat reverse set type while* k1 U. d, `4 i' y
2.setq函数
6 ?* y4 ~, m' j9 L9 n# A, H6 R setq函数用于给变量赋值,其格式如下:8 G# t1 l' R6 @" }$ \
(setq name value[Name value]…)7 ^$ J8 t+ H! N
其中Name…………………变量名( _) E" Z1 l! z) k0 o- M* q
value…………………赋予变量的值
$ Y' E" x' N+ c' h, i 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
0 |7 D1 h3 Q1 l& F( K3 V$ J K Command:(setq x 12)
" Q' c! f8 S* L; H" ^8 P Command:(setq x 6.5)
1 K% o; g- Y L' @/ t4 x/ K O Command:(setq x 8.5 y 12)
6 O- ~) X j# p$ N5 Y+ [; t N 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
; c6 P; H! l% ^, y Command:(setq answer“YES”)
: Z: c( T! l' l6 x/ y9 m 这个表达式中,字符串值“YES”被赋给变量answer。
8 I F4 d4 m0 I% e setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
, v/ d* i K' f+ S5 F5 V (setq pt1((getPoint“Enter start Point:))- N* K0 ~( [/ l# j7 R
(setq angl(getangle“Enter Included angle:”))
' E N# j' B7 i; @9 a (setq answer(geststring“Enter YES or NO:”))
1 e' f0 d) I/ X7 ^8 N6 d注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。2 i. L3 G: R3 c e2 ]6 E
(setq Pi 3.0)
5 v" p' { R. U4 D8 n (setq angle…)* E9 W1 H+ M* O0 f4 Q8 Q
3.getpoint函数# S u: ^% |" R# {% ?) M
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:6 V8 Q5 b1 S1 H$ j$ y" h7 u6 b
(getPoint[Point][Prompt])8 i" I* ^" }6 J' M# p( i( Y' ^1 E
其中point…………………输入一个点,或选择一个点! v& _# A; ~& ? u0 ?6 K& {
prompt…………………将显示在屏幕上的提示6 s: y0 Y2 L# G0 c) h) h
示例:
( y4 N$ | \: E. @ _& D (setq Pt1(getpoint))9 Z! J' u9 h Q1 S, f' p
(setq Pt1(getPoint“Enter starting Point》/ n% e5 I- s2 B* i5 V4 D
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
6 i, a( G, V/ z- R* o! B$ A4.Command函数
( r2 G; o1 z KCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:: G$ Y4 B+ R0 ?, a2 _# x7 U; Z
(Command “Commandname”)& S+ x' ?, `$ @" Q7 m b
其中Command…………………AutoLISP函数1 k3 ]3 O2 C% b! U( F T( T4 U
Commandname……………AutoCAD命令
% \& ]2 y- B$ U7 j) o+ I4 t示例:
& G) m8 S, r7 c6 s- t(Command“line” Pt1 Pt2“”)8 c5 ^, d, ?; `; Y ?- N- P+ \
“line” ……………AutoCAD LINE命令
0 T; C* K' k: UPt1……………………第一点7 `* R3 I' ^+ |
Pt2……………………第二点
* @- b, ^7 x* }9 a6 u* S“”…………………用于返回
$ D* a6 p% R4 T7 l+ B, @ ~ 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
% [0 l# O" ^4 ~Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
% \% _! H b0 {' Z7 G& Q' W2 T不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。+ F7 o' { n) H3 W7 m. R" G
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。1 `" N. a$ K9 C/ }3 o/ u
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
6 u9 J/ \5 L9 G( g( U4 C 编写程序前,必须确认这三部分。+ c( W4 T* \, _
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。9 I7 ]- Q% v; E, S$ x
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
8 @0 C( i: v4 E, w& Q7 r( H1 T6 C3 ` 输入 输出- M, ?% l2 s$ u7 v8 L" Y! A8 q& n
P1点的位置6 _' q. h, `: `4 P8 j& _
P2点的位置 三角形P1,P2,P3! |7 O# O) \" ]4 a3 n. u2 O
P3点的位置9 N/ {! {' s& \3 ]) ?
处理过程0 p/ h8 Q! a- W. m9 O8 |
从P1到P2画线
9 L9 P ^ \- n& ?( ] 从P2到P3画线
4 ]% s8 ], P; k# A8 D- W: h 从P3到P1画线
3 U6 q4 c& W# e: X: l1 W下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
0 c4 T& x2 ~# ]3 l) m# K;this program will prompt you to enter three points 11 | }! c2 q% A
;of a triangle from the keyboard ,or select three points 2) S4 G- ]' J! e- V. r5 A
;by using the screen cursor .P1,P2,P3 are triangle corners. 3; M' m. e9 V( H+ K8 t3 d: N f
4+ P2 n. S7 h3 m/ b
(defun: C:triang1() 5
9 @2 y4 w2 N8 u2 Y# S/ | (setq P1(getPoint“\n Enter first Point of triangle:”)) 6( R3 z) p: p# x# ?4 C& S5 a: w
(setq P2(getPoint“\n Enter second Point of triangle:” 7) t- O0 ~% C: w/ P
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
; A9 c" ?( ]+ p+ O2 ]( O (Command“line” P1 P2 P3“C”) 9
' W# y- h: q r( j* j$ {: P) 10
; O& u h8 ?) v. n' ?7 u! Y# c& S& J说明
2 N% O( o6 H) O0 \第1-3行0 k* K4 g- N3 N4 c) F4 s3 ?
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。, k7 m, t% n# L% ^1 y
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。# J/ g. L3 N1 |& O
第5行:(defun C: triang1()7 ^: d9 O. m- W- j6 F7 x
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)4 [$ u' _6 v. l
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))- _, f" e5 P6 ?) l$ k
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)- o0 l% N5 T0 w+ l- `: ]' X6 [$ E. B
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))6 w) `0 V+ F; i8 U5 r$ G1 Z& P
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。0 _! ]$ h8 a' O, W6 l
第9行:(Command“line” P1 P2 P3“C”)8 s5 I+ X* i; U+ J4 C) f% E" X+ I4 X5 e+ f
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。& u* j: T( @4 r3 N( Z8 U; a
第10行9 q- U" O$ X) u5 I7 H7 s; x
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |