1.defun函数
4 z- e4 Y. H9 o' X- [& N0 tdefun函数用于在AutoLISP程序中定义函数,其格式为:1 `/ |6 H0 C k: I4 }& ~
(defun name[argument])' D- h8 ?! u. m; q( `% H& ^5 Y4 |
其中name………………函数名2 _7 `( b. g. t
argument…………参数列表
/ F( z9 B4 S/ d# e: {" L e& F 示例:
2 E# z' q& C1 K; D8 W$ c- D(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
; o, W6 @) W$ A5 X8 }4 [* S(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。" T4 n( A1 x& q+ ?% R
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
H0 Y8 M) H& h7 m5 k0 y(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。0 Y& ~4 D5 U% g! y
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。3 i: b7 u; a9 f7 k/ N/ z. g2 K
Abs ads alloc and angle angtos append apply atom ascii assoc atan" n; ^0 `4 ^1 Q3 P7 `4 w
Atof atoi distance equal fix float if length list load member nil0 B8 b0 `& n! l8 J
Open or pi read repeat reverse set type while
% `3 M: V. |7 G1 {! m4 E! n/ j2.setq函数
) \2 N, N$ |" H# i( E$ S setq函数用于给变量赋值,其格式如下:+ s. s, ?- g+ K1 |
(setq name value[Name value]…)% _3 V1 Y1 b5 p8 W3 e; _/ n
其中Name…………………变量名
2 L5 i' f6 j3 C, E3 _3 W4 S7 S value…………………赋予变量的值
/ D' F& U( [( G3 T& n1 C 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
( H6 Y! Q g% z) G' S# [" C1 N0 v Command:(setq x 12)
: s3 c- q8 B& T) [: \- m) A Command:(setq x 6.5) C' ?5 r/ }% b; j; P; n
Command:(setq x 8.5 y 12)4 e( c' `4 ?7 Q9 O- f G
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
7 S3 N5 t5 l- N7 n Command:(setq answer“YES”)9 @ Z" I0 W% T+ H* a
这个表达式中,字符串值“YES”被赋给变量answer。; d6 z- \8 _" P- x' @1 q
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。! B% v+ W! K0 X2 s2 f5 Z/ N! w1 i
(setq pt1((getPoint“Enter start Point:))
, Y% D6 p9 c2 r8 y, I$ {7 _6 S (setq angl(getangle“Enter Included angle:”))2 l$ y- o$ v) v% `
(setq answer(geststring“Enter YES or NO:”))" a8 P7 P7 V7 z6 L
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。2 h) `; t1 L# [& S& C
(setq Pi 3.0)$ s6 E. f4 [$ a5 t( q
(setq angle…)
5 y7 R O1 | M3.getpoint函数
( Z" [+ `. ~) f7 T4 ]5 Xgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:0 D. u4 K4 t. `: k s+ m8 @
(getPoint[Point][Prompt])- [+ `" Y1 V& l- P r! o) y
其中point…………………输入一个点,或选择一个点) C4 a$ n2 x! R7 G, z
prompt…………………将显示在屏幕上的提示! d: m0 x. T0 z/ ?3 O) j" I
示例:* d0 l/ N+ P7 J5 i/ h
(setq Pt1(getpoint))* `, i$ l9 f/ y4 c
(setq Pt1(getPoint“Enter starting Point》7 A+ A' b, K6 J- M) g
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
d1 _; z4 I6 J4.Command函数, W7 c/ y5 U$ }( [' n1 G
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
+ Y/ h* Y5 Q Z (Command “Commandname”)) T# j: |, N- O4 h. v9 ^
其中Command…………………AutoLISP函数6 E; @( m! W( S: C
Commandname……………AutoCAD命令
2 v! U; m6 R9 P8 f3 n6 A示例:
5 U6 w& V E2 o(Command“line” Pt1 Pt2“”)% w5 W# z4 y8 Z, W$ u
“line” ……………AutoCAD LINE命令
8 E/ u! t% J* D* h/ `3 D3 J7 FPt1……………………第一点 @+ m% r3 D; }; W! C
Pt2……………………第二点
( y2 v3 `4 O& M7 U5 [% s“”…………………用于返回
2 z9 V$ P- t- Z+ }! P0 [) Z2 B4 y 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
* ~ p& ?# M9 P* {+ {8 B( MCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。0 V6 O& }/ y, P
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。; M- C/ N% \6 d3 F8 ^. `
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。. u. b) _1 J- d& S2 o, w0 O: H
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
& ?$ j8 \7 `, L! y 编写程序前,必须确认这三部分。
, s1 i3 c* g3 q& B9 i 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
* |2 A) w' W+ C* f1 @+ C- ]- M; k 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
3 D& ]. [; T6 a8 p8 H- o N 输入 输出
7 _- V' D$ Z- J7 u8 `7 @" L+ q P1点的位置
! P8 `: Z9 Z$ S. V' S0 L P2点的位置 三角形P1,P2,P31 k! E: v, E' ^4 b, R; Y$ z
P3点的位置8 D7 b' S" k/ @; k0 @! P/ Q$ @. o5 U
处理过程
; D% |) |" b8 F& a; {2 m 从P1到P2画线
' }: c& s7 m5 W" c( r 从P2到P3画线
" }7 `4 h, V" \ 从P3到P1画线" o% n/ \; V* T' w( v! a; m3 ]
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
" e: C* Z7 c' y) `* i;this program will prompt you to enter three points 1% `' w* `, U ~0 |9 H& \% V0 o
;of a triangle from the keyboard ,or select three points 2* Z$ ?$ A- ] H0 k! l' b
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
3 O$ [0 {* q1 [( E# o 4, w1 C/ V3 N2 U% I% E4 F4 p- C
(defun: C:triang1() 5
9 `6 t4 K7 N# |/ k8 f2 V (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
) |. d# s9 p L1 e/ O# M( m3 Q (setq P2(getPoint“\n Enter second Point of triangle:” 7
2 t+ W y8 c s3 F7 J (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
& k+ Q7 v/ P+ M- I% ~+ O% d0 n4 { (Command“line” P1 P2 P3“C”) 9 M* M+ }! O G. r4 E
) 10; K0 Q' u' Z% x* v- H# m
说明
5 M4 X% k0 H! D ?第1-3行5 P1 g$ ?1 F6 v' F0 k6 p2 W- Q
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
, r8 M0 n* ?8 K# N( U第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。$ [' M: j6 a& S& Y2 W m; _
第5行:(defun C: triang1()& L7 M9 U) s+ Q& Z: p" o! d
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3): R4 Q" B2 N# w- R& D# R5 J d
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))- \1 z& ^/ I2 `0 t: B4 z4 h7 d9 G
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
# {" l5 o1 l/ \第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
, U k0 A. d- n这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
; c1 t' E8 w$ E5 W第9行:(Command“line” P1 P2 P3“C”)
& |* Z9 F9 z$ f3 `: V本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
1 A; }. u ?9 V ^3 k* h% M; t/ x2 y第10行
6 s7 W* F; \& O3 b G本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |