1.defun函数4 S. v1 c" J+ n& [8 u4 @: L a& J1 E
defun函数用于在AutoLISP程序中定义函数,其格式为:
, Z. c2 r# N5 A4 @ (defun name[argument])
) M' C; ^3 k! N& b) j. u% G0 Y 其中name………………函数名+ V4 d# r7 J X1 K5 ?0 e# z, [
argument…………参数列表: i2 {) @# y0 \2 E) y4 i
示例:2 j2 z% {9 ]. l" |! g) |# C6 j
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
- z" j- E# t! Z m(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
3 S( D4 N9 H9 l' Q L& ](defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
5 _# r j6 y. k5 |+ l) p7 n(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。$ |# A7 W4 E9 Q# g- n
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。2 a9 L# x% {& W+ D! r( H- @
Abs ads alloc and angle angtos append apply atom ascii assoc atan
% r; E5 t g$ C& kAtof atoi distance equal fix float if length list load member nil
, a8 {8 s( n4 u$ M3 T, J* NOpen or pi read repeat reverse set type while) A( u. H3 ^' E& {* d
2.setq函数* }' o" r0 _$ d. t8 L9 H) d) ?0 n
setq函数用于给变量赋值,其格式如下:
9 C8 D) ]" w, F) S+ } (setq name value[Name value]…)* v: I) Y4 t; h. h& \
其中Name…………………变量名 ~" J! H7 I0 H6 f) e/ }
value…………………赋予变量的值) N% A0 o3 M. E# d1 n2 c: s
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。; k$ r' ^( w# X7 t/ [
Command:(setq x 12) V! C2 b( B/ S4 y+ T- w3 O3 L
Command:(setq x 6.5)
4 J+ {. P" I( I1 A Command:(setq x 8.5 y 12)
c) |( Y! ~2 N* y' S; `/ h! U2 ^$ M 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。! I2 Z: U6 W( @' s& J
Command:(setq answer“YES”)
/ k+ t2 H! `9 `( }0 L9 I 这个表达式中,字符串值“YES”被赋给变量answer。+ h) ~/ v/ y! m9 x8 H
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
5 M' H+ S+ D& u* C2 S6 |/ h (setq pt1((getPoint“Enter start Point:))! V( M3 t; f/ k
(setq angl(getangle“Enter Included angle:”))
6 W3 h, h8 D9 W4 q6 O (setq answer(geststring“Enter YES or NO:”)); c8 @' ?2 S4 j4 L3 u
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。0 ]0 ]# a) s# }4 ^9 N% q R* i
(setq Pi 3.0)$ q' q$ P: X0 ~) ^8 w2 U
(setq angle…)) @) A2 v# Q0 s0 b
3.getpoint函数" {. T8 C9 }8 k% L6 @% ]# F' u
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:, |5 k5 P. b2 q: p( p
(getPoint[Point][Prompt]): J) F4 J3 [. f: i C
其中point…………………输入一个点,或选择一个点# _+ O( c3 r9 I+ a& ]
prompt…………………将显示在屏幕上的提示' m- }) f5 s/ x) U0 L8 R
示例: ?" z, s. |$ u: k9 `4 r
(setq Pt1(getpoint))5 B1 l; T% Z: F
(setq Pt1(getPoint“Enter starting Point》
7 D/ g+ q6 m; Q. J8 e 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。) Y$ X+ E: |+ F, G
4.Command函数7 S! x& J3 h# ~. ?0 {, h5 L ^
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:! U& v$ d' L! p4 i6 w
(Command “Commandname”)
6 T; D: U* c: t! A, M S4 E% S 其中Command…………………AutoLISP函数
9 ]" \- M$ U6 w* \# Q( h: W1 J: d- `Commandname……………AutoCAD命令 Q: @ y- j9 Y' M# F3 C! ~
示例:
4 A/ ?$ H. o/ {* S1 i5 Y( e0 ^(Command“line” Pt1 Pt2“”)3 F! y4 s3 ]: `+ J8 V
“line” ……………AutoCAD LINE命令' I' M+ X7 V/ a4 J
Pt1……………………第一点
3 S2 F/ T; |/ o6 yPt2……………………第二点) |7 i7 T7 _+ p3 F2 A
“”…………………用于返回
- L H. U8 m% e0 a 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
0 G* M# Y4 R+ ?" f5 ~9 p. ~; i9 L! [Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。; U& K$ ?: u0 b8 ] `
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。" L5 W7 e1 k. B/ X( H, x
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。" V6 P$ D4 s8 X6 T. A1 K( {
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
5 L9 C* D% ~! \ 编写程序前,必须确认这三部分。
$ P2 Y+ e- C/ ^0 o/ w$ Y: { 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
" D. |9 S8 E0 L, e* ~. Q 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
3 d% V i# E- e7 A0 a" z 输入 输出" W. t# H, X, H
P1点的位置8 K% n4 W6 ]0 a
P2点的位置 三角形P1,P2,P3
3 [. i T! j, I+ E P3点的位置
: N5 L6 Y5 ~2 j( e, |& g; T 处理过程
. z3 T. b% d) c- c" z 从P1到P2画线% {1 s' q, U- e/ t2 J- u/ w& |- j6 y
从P2到P3画线8 T( c7 E% \1 q ?; x
从P3到P1画线5 ^4 S! B" n* s: c5 Q; g7 f0 \ m% z
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。% r( P/ h$ v! E
;this program will prompt you to enter three points 10 ^' p, x' l7 u6 o2 |, [$ l
;of a triangle from the keyboard ,or select three points 2
1 D8 r( B4 m5 v;by using the screen cursor .P1,P2,P3 are triangle corners. 39 [3 @8 r8 H7 @2 g5 H3 R
4 `8 ]$ l7 Q3 a
(defun: C:triang1() 5
: |! S3 J0 i% N" R: T (setq P1(getPoint“\n Enter first Point of triangle:”)) 6/ x! h1 M# m8 k' I( }
(setq P2(getPoint“\n Enter second Point of triangle:” 7
% p6 {, t1 V G+ F/ Z7 { (setq P3(getPoint“\n Enter third Point of triangle:”)) 85 b' m& {- t$ s$ g
(Command“line” P1 P2 P3“C”) 90 I& `4 }9 W e, R+ V
) 100 {' [$ E! X7 R
说明* ~/ S9 H5 d% `6 R$ r
第1-3行6 d( V; E' E; N+ x+ j) {
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
[4 L0 {9 e1 Q第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。& J# A( C z3 y4 A6 b
第5行:(defun C: triang1()
' w2 ^: a! t- X3 d/ E0 Y本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3); C! z& w4 K5 I- }, u
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
. w9 `3 ], Y ?+ }$ @* s4 X本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
' z) L1 w; {- t6 X' Y第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
2 ?# |. {* u/ j/ [* R这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
7 x7 }6 t- }! K2 M8 w. Q4 J X2 n第9行:(Command“line” P1 P2 P3“C”)
8 b; k7 d& c7 ]本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。) G9 G" I! z/ q$ U# i0 z% i; A/ ~
第10行
3 c+ S' c0 | N+ V- J+ U! a' D本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |