1.defun函数
Y. Z }* z x/ D# }defun函数用于在AutoLISP程序中定义函数,其格式为:+ D2 l- o% t0 x0 Z+ D
(defun name[argument])$ T9 O5 i9 P' C8 i
其中name………………函数名
# m* g. H! @2 I7 h( }$ g c+ k argument…………参数列表! `3 I {3 q( t
示例:
$ `5 V# y0 c5 Q! {(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
) V; d0 ? z# q+ K" L(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
3 J/ {; l t; W5 F9 ~(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。7 p$ N) ~ k( B; b
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。8 V7 m) J' E1 {+ n6 O# g! n& Z# G+ A
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。+ ^. n( i5 C* f% \4 w
Abs ads alloc and angle angtos append apply atom ascii assoc atan, X% }+ G% F" U8 z% O; G
Atof atoi distance equal fix float if length list load member nil/ i. a8 r; M3 `) ^, J. K
Open or pi read repeat reverse set type while
$ |& x, a- J6 i) F1 Z2.setq函数
7 b7 f) n: @7 G5 u& L/ _ setq函数用于给变量赋值,其格式如下:
# B3 `1 J% B0 Z/ B# | (setq name value[Name value]…)
- u# Y- M0 r" R) s8 h 其中Name…………………变量名3 Q, O: e" x2 R" K; L0 U! @
value…………………赋予变量的值
/ b! b( W1 H. x5 `0 p* S4 n 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
3 U- u- w J1 [ Command:(setq x 12)5 \5 \0 I9 ^9 _3 Z6 F
Command:(setq x 6.5)" M6 {0 R' p$ g+ D0 [3 T: V
Command:(setq x 8.5 y 12)
2 e4 [1 Z5 f2 J 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
: M4 F; P7 ?3 b& p$ N5 q Command:(setq answer“YES”)
- Q/ G9 y$ V+ M 这个表达式中,字符串值“YES”被赋给变量answer。
; g/ R3 K8 S6 h# o+ h4 }" {; O1 H setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
( [% o# W! i/ L (setq pt1((getPoint“Enter start Point:))
$ }4 B6 ~- G+ | f/ I2 h (setq angl(getangle“Enter Included angle:”))
) z, r! F4 c6 C! w G (setq answer(geststring“Enter YES or NO:”))% f. n1 w. h+ ?8 E D: c
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。( R- M7 I( S- H# C* j# l
(setq Pi 3.0)
4 L. T0 k& \* \: L- B. v @8 W (setq angle…)
. f8 f; Y+ L# _0 R& }& u3.getpoint函数
( `. U' {6 L, d# V+ X& \. X! ?getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
9 c- A; ?( D, ?* z(getPoint[Point][Prompt])
( s: x3 p9 ^& _5 k/ x 其中point…………………输入一个点,或选择一个点
' K0 N( D% A3 l6 h$ c$ c# _: f' p9 M prompt…………………将显示在屏幕上的提示
" O- q# d! M, @ 示例:* Q$ D" R# M3 S) M0 `2 U
(setq Pt1(getpoint)): J. U- J4 i$ J9 o1 n" z
(setq Pt1(getPoint“Enter starting Point》
N, i1 q. r& j' P1 V" p 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。0 e6 W7 l6 a4 u5 J
4.Command函数
~7 z0 n. i6 z, M8 cCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:& Z0 j) m0 s1 ^' b
(Command “Commandname”)
% M- S7 v. f0 i: `7 S 其中Command…………………AutoLISP函数
, w4 Z+ ]- K( q$ N8 D5 C. O# NCommandname……………AutoCAD命令2 p8 `0 a4 g& ~: q9 Y
示例:
( }$ H6 `; l& R; c- {7 o(Command“line” Pt1 Pt2“”)
. T! ^ `) q( s9 Q“line” ……………AutoCAD LINE命令
3 o8 ]/ i- Y' R# A! JPt1……………………第一点* F6 e3 A3 G: d, z1 W; U' d
Pt2……………………第二点
$ x) r# e. f4 V“”…………………用于返回
! Q( F- T! Q/ v# T- ]7 i 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
$ ]" R r& G( D/ Q2 sCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。2 Q' O: q. r/ c$ y0 c& e3 [
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。* J2 S6 C) E. g9 @
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。2 h& V4 w3 k' A& @7 A
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
4 t" u6 `4 E3 B: X$ F# E 编写程序前,必须确认这三部分。
1 ^/ ^( C* v% D) y$ x5 m 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。 z( a, \9 r3 H5 x( e* [: c0 d" m! s
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。+ J9 G* p+ J, q( h9 I! p& I
输入 输出
. L0 Z* Q8 E: G4 C& I7 I/ \ P1点的位置$ s8 v y5 i5 o7 k# h$ e& ^
P2点的位置 三角形P1,P2,P3
. }! M; |) f; }2 f P3点的位置
8 j6 }0 o& q k& m( O1 ^8 C 处理过程; K7 s) Y: w0 [ P* Y$ M! P
从P1到P2画线
' L1 U9 Y7 A$ ?6 v3 O( z3 o 从P2到P3画线
# `- t4 u. u+ E4 l) V9 L3 _ 从P3到P1画线+ E8 U, Y3 `9 i: d t
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
, h) g" R; A: `9 `;this program will prompt you to enter three points 1
# D- u/ U# h, Z Y9 F* B' Z4 M% G;of a triangle from the keyboard ,or select three points 2
J' {/ N. B! F' M;by using the screen cursor .P1,P2,P3 are triangle corners. 37 p9 H& p$ X8 R7 S8 t7 L/ C8 I1 y& K
4
; H$ M, M j/ r(defun: C:triang1() 5
9 ]) b4 O8 Y5 t: x (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
' }" B1 ` x# ]1 \) j (setq P2(getPoint“\n Enter second Point of triangle:” 7
& E0 n8 B x" C4 ?+ l (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
$ x5 a" m# Y% v) x4 n (Command“line” P1 P2 P3“C”) 9
+ S5 l9 K$ F" M) q" ~9 t, k) 101 ^% f3 _! r0 L+ E) e! U
说明9 j( K$ O0 k) j( Q7 J/ Q2 h* Y
第1-3行1 P2 i7 i$ U( d( s: A
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
: K9 P* j3 |/ }第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
" O% ]+ S: m D( @+ p, a4 J第5行:(defun C: triang1()
6 M7 K% o' J0 Y本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
B8 ~+ \6 A. w2 j4 h; Y: i第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))$ S, G# a% D5 P1 p. s
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
# M! _( z3 l9 D+ I! A# n' ^第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))3 c' R( ^6 g; a* V% T
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
+ z" j7 Z: C4 N4 |; C8 E0 [第9行:(Command“line” P1 P2 P3“C”)
+ R8 D j7 r: C; g本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
' ^4 p6 J* G8 |0 ?* `第10行
& j2 J8 Y% E/ c; T. H8 {本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |