1.defun函数, c. S$ C* [0 k+ \1 b8 r
defun函数用于在AutoLISP程序中定义函数,其格式为:0 y9 W% r9 t& W( b0 l
(defun name[argument])
! e$ i1 \9 m) ] 其中name………………函数名
5 Z. ?: h+ {, @8 h argument…………参数列表1 Q6 q, T8 m* B# N# y( H: i
示例:
: D& r; X1 k k9 z+ ?1 \(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
+ s5 l- A; u" T. u5 ^(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
( e1 @8 \: J5 v# j(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
% ^/ {1 @+ s4 O0 d+ p(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
# V, A* x' k1 E注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。. O; o1 x- j& f+ F* ]1 E' Z
Abs ads alloc and angle angtos append apply atom ascii assoc atan
8 }$ P9 F2 `& S; PAtof atoi distance equal fix float if length list load member nil
5 r9 L/ L% B, i% c- O- EOpen or pi read repeat reverse set type while
0 u" b2 l u) G! {" [6 ?; D. c) Q2.setq函数
( _7 [, b# H0 ^3 B; m1 F setq函数用于给变量赋值,其格式如下:6 x3 a; G& Z9 ?' a1 @. @
(setq name value[Name value]…) U) I2 M1 a3 M. ], e; p
其中Name…………………变量名9 B% j' q, u1 }9 M7 _
value…………………赋予变量的值
" J" u R6 v/ z( ^ 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。; G! M! L. [ G
Command:(setq x 12)
3 P5 U3 F- y4 H Command:(setq x 6.5)
6 C. w6 }1 k3 W/ L7 u Command:(setq x 8.5 y 12)
# J# w1 k' |* e9 X- G5 ?( t( Z9 ` 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。0 {2 N( P h. d+ T+ j" s" L
Command:(setq answer“YES”)
* I7 u' y# _. r. B+ G# Y) f; k 这个表达式中,字符串值“YES”被赋给变量answer。' M; v- }3 |& `" F3 J/ x! n- g' [
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。0 D, K: O# K4 p5 A/ ~
(setq pt1((getPoint“Enter start Point:))
* A0 c. M* d9 [; t7 [5 f (setq angl(getangle“Enter Included angle:”))
( r8 p, J6 h$ e6 @5 u (setq answer(geststring“Enter YES or NO:”))! B. i; e$ R( v0 J3 T+ |
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
T; ~4 g/ O' i: G (setq Pi 3.0)
0 p/ [4 X/ Z7 v q& x (setq angle…)
/ B+ S; e4 }: ^5 N r3.getpoint函数
0 C" P# ^8 x& o. o# c, T$ t! Wgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:/ R N6 ?2 w. w) H& C" o1 a' _
(getPoint[Point][Prompt])
" z' e( K- C0 t" n6 [) ^ 其中point…………………输入一个点,或选择一个点1 D/ L4 A% m4 _
prompt…………………将显示在屏幕上的提示
( R' q3 _* Z) R3 g 示例:
) F6 n5 ^, a0 a- H (setq Pt1(getpoint))
3 ~& x! ~+ K5 w4 {6 B6 ?3 b* B* E (setq Pt1(getPoint“Enter starting Point》& @& }9 ^+ v2 V! e, `5 W
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。5 s( q) h& s7 v; v
4.Command函数7 t g0 C( k' u4 A: K
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
$ ?! V* f( x! j: d( O7 K4 G+ f, Y (Command “Commandname”)
3 ^2 p4 z- x' ]6 Z) ^ 其中Command…………………AutoLISP函数
U( _# g; ?4 p+ c! H. iCommandname……………AutoCAD命令
& W/ J( Z J) X示例:4 v( ~8 c- E/ m0 X o
(Command“line” Pt1 Pt2“”)
- z% b0 a" b* N% _“line” ……………AutoCAD LINE命令$ m g# u! ~5 b% p5 ~3 w1 T5 Y. j0 h
Pt1……………………第一点; h0 N, E( _5 S4 I9 h
Pt2……………………第二点
& ]* q8 Q- z' d“”…………………用于返回' V/ ^" @- d$ \ s1 y1 t
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
8 k' p4 ]8 X3 R. @Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。* i8 d" Y0 L# U) d9 m' |% G- _
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
# [3 I# U5 d/ [& `# O例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。5 n2 v+ ^; ^ a9 W8 ]
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。3 r& G! H. s" \, D1 t
编写程序前,必须确认这三部分。
8 ~* o( a- R( B1 y, k: o+ N 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
1 J- N* t+ g# e9 e4 D 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
. @* A1 G- I) R, z6 i 输入 输出, O( b* u4 D% v4 I. {
P1点的位置
/ i$ N' u# m( ] g C P2点的位置 三角形P1,P2,P3
' V$ V. u! G. f8 v6 u P3点的位置2 [8 {8 P0 h" m# W
处理过程
" g1 t' E+ B) ?8 n- V/ I/ N* T5 n 从P1到P2画线% K7 P( G3 B+ R/ j0 m; a4 ]& P
从P2到P3画线
- x% D! ^ V. R+ w: u k Z5 u 从P3到P1画线! R: Q2 |* Z8 { f
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
% d3 B5 Y# |3 G4 w;this program will prompt you to enter three points 14 d: X9 f+ E R; l( Y
;of a triangle from the keyboard ,or select three points 2
6 ^$ e5 M* H6 _& V0 W7 w3 s0 C;by using the screen cursor .P1,P2,P3 are triangle corners. 3
3 j6 q4 E9 c9 b6 ~0 `; T 42 ?" V2 w" E# Q e4 W2 C4 U/ p; H/ Z
(defun: C:triang1() 5
# }9 b; g6 r" D; i8 M" G/ T" B (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
# t; A# T2 H; c) G. `) t1 k2 L (setq P2(getPoint“\n Enter second Point of triangle:” 7! q% N( l6 u, _; K# b' e
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
6 _' U9 [9 G' ?# f# w (Command“line” P1 P2 P3“C”) 91 `& R, p+ l1 i. _- z0 _
) 10
: X$ [8 d9 c1 w4 B) V% d说明 v0 [: `* ^) {0 S( A
第1-3行
& @, f7 ~1 `) R, _ X前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。! ^! A: ~/ O% c! M8 U, R5 o
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。' M" `, B" d4 c6 ?& k6 _7 w. M8 u/ b
第5行:(defun C: triang1()
- z5 O7 T; @$ h& |) w2 D- b本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
. a. A+ X( H6 z3 U第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
, x! H2 z6 P8 ?; z8 b: A" I S本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
2 l0 \/ {' g& v9 K) Q# ?; b第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
* X5 x. {9 f4 d7 P; o/ Z这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。- O* H/ Q: t' ~6 ^6 n
第9行:(Command“line” P1 P2 P3“C”)2 u: a" o/ F, ]1 ?
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
9 N: u( F9 {+ u* I第10行/ L0 L$ B* g5 ?: c* g. f6 W
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |