1.defun函数
; e; e; j r- F( Q+ l0 Jdefun函数用于在AutoLISP程序中定义函数,其格式为:# M+ i* _( D, N& G3 A2 c5 I) s
(defun name[argument])
- x* r$ B8 e2 Q8 R1 R# ? 其中name………………函数名1 I& u, t: _% {1 t! f6 }
argument…………参数列表
1 ]6 |( o! ~( `; _ 示例:( U* D% D0 C( T# p+ a8 g
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
8 F# p( V2 C& r, H(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。3 L6 f7 `* p- K$ i* j6 {( f
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。1 S: q P4 T" k* l& _' G5 N
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
8 `6 m, d+ F+ w; [1 v注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。. _# H2 d% A1 b# |! d# k6 }
Abs ads alloc and angle angtos append apply atom ascii assoc atan) c9 Y" S2 [( w5 M
Atof atoi distance equal fix float if length list load member nil, ]& J; R& ]6 d& m+ w, g, L
Open or pi read repeat reverse set type while1 J# ~8 C0 L$ Q' g6 v0 X
2.setq函数7 Q$ {: ]% E% _; n- ]" \/ B
setq函数用于给变量赋值,其格式如下:0 X% R: I' a. X2 T% \2 p
(setq name value[Name value]…)
/ T- K' M1 |4 Y0 d: c% S' P5 E 其中Name…………………变量名
2 ~9 p% E. G! S1 J- h# }0 F' ] value…………………赋予变量的值
0 n2 ^. o4 p% o X9 i; s& ?. [0 h7 } 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。2 f* u% B- S; ^1 _
Command:(setq x 12)
$ E0 |% }! K* r2 T+ c0 y+ i/ X/ H1 r Command:(setq x 6.5)1 n7 ]: z! ^2 i8 D+ g) X
Command:(setq x 8.5 y 12): O3 p$ b V" R; ^
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。9 Y' ]3 c8 D, x' X3 }) W- @; g; z
Command:(setq answer“YES”)
; Y! C. R7 n5 I' V7 I. F( N+ e, W0 ~- x U 这个表达式中,字符串值“YES”被赋给变量answer。
/ Q+ J8 P9 V: R% m9 v+ l setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
' J" Q" D& N% ?; ~ (setq pt1((getPoint“Enter start Point:))( s) s' g% i+ Z9 v3 O
(setq angl(getangle“Enter Included angle:”))& U0 I! h. y' J
(setq answer(geststring“Enter YES or NO:”))
! f" j2 Q4 b/ l2 E( I$ u4 i注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。! c% r5 O0 p0 A4 G3 C
(setq Pi 3.0)" {; r0 @$ d0 |$ W" d
(setq angle…)
1 R$ C4 W: N4 y* _3.getpoint函数3 {# C* _( t' G1 s8 Y2 T2 s
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
1 p9 P# c( ?6 ?: w2 Q(getPoint[Point][Prompt])
( O1 d4 V; a$ L 其中point…………………输入一个点,或选择一个点7 P' Y# M; s& @
prompt…………………将显示在屏幕上的提示
* E6 n; u" ?: g. l" x+ [ 示例:6 u' o/ y5 g% L+ e2 d
(setq Pt1(getpoint))
& v2 K( y! }8 w7 F/ ~ (setq Pt1(getPoint“Enter starting Point》! J' w) V' O' l) J
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
$ K- L6 n4 _" [" X4.Command函数
4 i* Z4 W; B9 KCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:) ]) `+ n9 x( @- W4 I. p
(Command “Commandname”)
: S& W5 }- j, M0 P: q. Z4 | 其中Command…………………AutoLISP函数
1 k; g: p% Z+ c+ V9 d8 DCommandname……………AutoCAD命令
2 ]4 _* ]+ }. q9 a4 h示例:
$ |5 s2 O& @6 h(Command“line” Pt1 Pt2“”)
. f9 {( U! K! N3 M. h“line” ……………AutoCAD LINE命令
, W( z' G; M6 }* ~( }* V8 NPt1……………………第一点
$ ^- Q1 V/ z. i0 ^9 K; \2 s" \ pPt2……………………第二点
4 b3 A; |( L9 w d8 N% S- [& M" p“”…………………用于返回
7 k; D+ P& F# Y2 W; [- W, {$ ] 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。. w) U1 r% |% q( k8 g, A1 g
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
% U# Y; b/ @0 |, A& c不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
% m3 B2 j5 g: Q* W* z" F7 C例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
6 v) }7 W$ Q7 o: A* ~ 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
. U; ~+ { `8 j1 ^1 c 编写程序前,必须确认这三部分。
; D' ], S3 _0 }* ~3 E# w A 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。) Z9 |5 `5 c$ @1 x3 b7 _. }' x. [
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
" [' z- G1 a* w 输入 输出
7 U! m7 V- T8 p# t* e! W+ i P1点的位置+ o2 t; V+ |7 s6 d
P2点的位置 三角形P1,P2,P3
4 s, D7 ^5 r1 X P3点的位置. r3 ~/ U( z' X& j: {. u
处理过程: G" ?! u9 @' S! }( p
从P1到P2画线9 c, Y; g4 e- |6 I
从P2到P3画线
4 r, |' D. ~/ x" f 从P3到P1画线8 J H, g% q% N0 [# j: u
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
( z3 w% X* ]& g K" o% P+ [, I9 a;this program will prompt you to enter three points 16 Y9 m/ T. Q7 [1 s" F
;of a triangle from the keyboard ,or select three points 2
# O" Q; y, I* Z# b;by using the screen cursor .P1,P2,P3 are triangle corners. 3& k: s6 p5 G9 ]2 f. u
4$ i9 ^) i) @! q3 l
(defun: C:triang1() 5! e6 p, d% e0 c
(setq P1(getPoint“\n Enter first Point of triangle:”)) 66 N9 V% |6 o5 a: Z5 _ L
(setq P2(getPoint“\n Enter second Point of triangle:” 7! l* N, o) ? J
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
2 R7 W1 n- b" T6 ]0 L: k2 e9 i o" c5 d (Command“line” P1 P2 P3“C”) 9
5 W. f' M9 C5 b) 10
( a3 u! c9 h, z8 ]. L# U说明
% ?/ [/ |( G9 p( ]7 v6 h第1-3行* i% T4 O9 H5 |& V
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。3 c" u0 q2 l1 O. c- N3 u4 z6 E: Y0 L
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
8 i0 [: L+ M V' C% Z5 Z第5行:(defun C: triang1()
3 j3 F% B5 d( A3 K( l7 Z/ M本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)) [, T4 y6 S. P# g# m
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
8 i2 z ]7 \0 i, @本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
* n$ B3 n' ?7 @8 L U第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))% f3 Z' {3 U- t0 u9 d2 \/ b
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
! S- a! M" c/ I# n+ C$ K第9行:(Command“line” P1 P2 P3“C”)
4 V R/ g# R1 T本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。' Q9 |) M" v6 q# V; m) U- H, \" [; L
第10行
0 K5 V. i ~. e$ w本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |