1.defun函数7 K6 u6 D: N# F6 h4 b1 S a
defun函数用于在AutoLISP程序中定义函数,其格式为:
0 F, \9 P. I) |& N) W (defun name[argument])& o3 V- d- C" Z, A
其中name………………函数名9 U( l$ ^7 M, S; P7 `; R O
argument…………参数列表) d! F: H+ h- _) u9 b
示例:9 `+ g( _$ q$ r) T4 y T
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
" u" D5 J, k' ]0 X* V(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
1 a& [3 x( H7 |: y/ ~( U(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
2 z% t3 Y1 L% n, K* \: v(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
7 k5 R. t# A* L2 h' u注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
M2 ~; g% A# J+ a' MAbs ads alloc and angle angtos append apply atom ascii assoc atan
( c. I3 R% p; q/ {' |, w% xAtof atoi distance equal fix float if length list load member nil* s) e$ l! `$ M4 O
Open or pi read repeat reverse set type while' J: h# a" k9 I% e, `
2.setq函数
- f7 R. O' y" t, g' _ setq函数用于给变量赋值,其格式如下:
, e$ t7 o* v; X, O8 u+ J (setq name value[Name value]…)8 I. ^% ?2 Q9 T7 }/ S" x9 ?0 G
其中Name…………………变量名
4 k% t' { {3 Q7 z+ Q, m value…………………赋予变量的值
0 {8 ~) x: d) a/ C! _ 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。( V( ^* l% z" `4 O. c' l7 U
Command:(setq x 12)
T- S# r& f% Q% j7 `" m8 | ~ Command:(setq x 6.5)7 M5 P' S' e2 c7 c9 ` x1 R
Command:(setq x 8.5 y 12)9 y) Q/ ^0 p/ a# e1 d/ N
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
" O7 e1 @ v! a Command:(setq answer“YES”)
, I- n+ H. ~) ? 这个表达式中,字符串值“YES”被赋给变量answer。
( H$ ]7 W0 ?3 N+ E( M/ x {( Y setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。* ~. u4 M1 G2 u6 c% q) ?
(setq pt1((getPoint“Enter start Point:))
' Z, e) Q4 e; ]3 o9 n' ] (setq angl(getangle“Enter Included angle:”))
! P7 p+ {; A. { (setq answer(geststring“Enter YES or NO:”)) S; S" h8 A9 T9 F% y% F
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。/ D' I7 ]* W' l' X: P
(setq Pi 3.0)" N7 M( p# d$ I- m$ T' q. u5 b
(setq angle…)
/ y3 n& }' \! U6 ?3.getpoint函数
; a# Y9 u! r% h6 s% V' {& z, T; cgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:( `. v, R# ^: }- n: Q
(getPoint[Point][Prompt])" w5 D$ {9 |9 D8 \
其中point…………………输入一个点,或选择一个点
+ l/ L4 W- f. s prompt…………………将显示在屏幕上的提示4 @8 F5 r$ h5 }
示例:; G" ^3 n1 [; J9 f7 r, x
(setq Pt1(getpoint)): k! r# |$ ]; V# T
(setq Pt1(getPoint“Enter starting Point》- X3 P0 w1 o" w/ e
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。; o0 w) h% f/ x& C, \+ m- e
4.Command函数
- v1 r+ L# T% M1 G, P9 F. l& NCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:% U8 Q0 _' i. Y# g4 G4 N2 g
(Command “Commandname”)
7 Z: [; v% Y/ [$ b2 d: s 其中Command…………………AutoLISP函数
- u2 _! d+ b( {( B6 O ]) MCommandname……………AutoCAD命令
! s* ]; }# u6 G& |! M% x$ {示例:
$ ?2 ?9 T3 J; L1 Z4 u7 v( }/ P(Command“line” Pt1 Pt2“”)7 T0 T: d# v4 Q! r5 ~
“line” ……………AutoCAD LINE命令- D9 |2 r' X+ B1 L
Pt1……………………第一点4 b' l- _7 \/ P$ R* I8 U0 b- I# J) }
Pt2……………………第二点) z- n+ V" ~" w* m& O: R
“”…………………用于返回
4 Z$ ?6 P& ` A; w0 g, }3 T8 W6 q 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。: B" V4 F5 [; p I1 @' K6 A
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
5 C2 S0 J+ P" v" r6 ^- k不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。" m6 v# z2 H6 D0 x4 r6 ?8 c
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。$ r! \ ^# `+ g7 k2 J* J
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。# I$ o4 |% \9 L$ H# s6 P1 s* ?
编写程序前,必须确认这三部分。% b; [/ m9 W; {4 e# [
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。+ C) }2 W5 \1 x9 i
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
$ y$ W, h1 b+ j0 E- e W 输入 输出
) P4 y" C4 A% n P1点的位置
s; P7 i1 _0 I7 Y) T P2点的位置 三角形P1,P2,P3
8 l' |1 v7 a- b, V2 E P3点的位置
! h1 U e) f( O# D 处理过程5 I ~ z( t% s0 m1 j$ E
从P1到P2画线
$ c) p, [$ z6 T% a$ n S; O 从P2到P3画线% u* Z8 q# M1 D* Q
从P3到P1画线
5 g- l1 N1 {1 \/ g, [$ I下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
% p* i: U3 N* O' x% l* |. d/ ~;this program will prompt you to enter three points 1
- s/ j) ~* `4 a% y* \;of a triangle from the keyboard ,or select three points 29 X. M# \' L+ |: o1 w
;by using the screen cursor .P1,P2,P3 are triangle corners. 3: t. P4 ^0 X* p
4) C" E% D7 _ A' C
(defun: C:triang1() 5% Z# l% R4 i6 a# C' B% a5 g
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
/ D* w/ d. f9 Z; P, D% [2 v (setq P2(getPoint“\n Enter second Point of triangle:” 79 R, r( r: k3 o% Y5 V+ X7 F
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
% i( F I4 ]" u1 J; }3 U (Command“line” P1 P2 P3“C”) 9
" P$ |5 G- P* ]: u8 l) 10
3 k9 a( @/ x, b( v, p1 }说明( _4 p6 k" u, h8 O" q
第1-3行
& |4 b$ E# e$ h6 [$ D前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
1 `5 r+ k( R3 J8 z第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
( w o$ W; U5 L3 ?9 Y8 l/ a第5行:(defun C: triang1()5 J+ A& S( D% f0 O' a2 y6 x" @
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
" ]# f0 E% m- g第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
9 e d+ \! v( A& \" o' d本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
. N) T" y% Z; p8 X第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))( _" X; Q5 N: e4 ]7 T
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
1 l, j* i' K- V- l9 Z第9行:(Command“line” P1 P2 P3“C”)0 V. v E! [0 N. d3 d: q, l
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
]) W9 P& j- x7 J) D- h* ?- g: E第10行% n2 N2 q3 f% n9 R! b
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |