1.defun函数; {$ r! X, F4 L8 N
defun函数用于在AutoLISP程序中定义函数,其格式为:% u! ~3 W# R3 u- ?( v
(defun name[argument])/ |" N; ~( `: o/ X1 H! E
其中name………………函数名$ c" |3 t# r) [/ ^, Z
argument…………参数列表% u# x) h) B; ~2 U
示例:
6 Q1 g3 B( I9 A6 i" E(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。: A. u+ r4 m/ z+ |1 o$ b6 s
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。 f; R* M" O+ e. u: x
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。$ s; Z: j* i7 q' v3 `% @
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。- ?( K2 p0 a% t+ k0 g, S! `
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
% _: z' ]5 {' p; y7 S) p+ BAbs ads alloc and angle angtos append apply atom ascii assoc atan: d1 V, B K! R" h
Atof atoi distance equal fix float if length list load member nil
( `4 R, O7 O) W3 B& z, sOpen or pi read repeat reverse set type while w1 c( O$ }& L( ~2 h- j
2.setq函数- _' S; B+ b2 w4 l$ {8 q+ Q
setq函数用于给变量赋值,其格式如下:
2 \) K8 @9 w4 v. B (setq name value[Name value]…)
1 u# ~( ^9 f: z8 F( [$ t( P 其中Name…………………变量名
! t5 L8 ~$ p2 f' K% h4 t4 P value…………………赋予变量的值
5 e, M5 r+ g. \1 u: _8 k 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
$ \+ U4 O9 l1 { t" a Command:(setq x 12)
* c1 H# v9 c0 M5 y! w Command:(setq x 6.5); h7 l$ K4 C0 `
Command:(setq x 8.5 y 12)
9 s6 o3 K7 M' O( z 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。% ?' `, v% }$ I+ V' ?
Command:(setq answer“YES”), }. w8 i0 m D7 U
这个表达式中,字符串值“YES”被赋给变量answer。
; {' \0 D2 `# i& v) x* c, w setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。' w7 ?8 W- b5 c
(setq pt1((getPoint“Enter start Point:)); ^4 E* L4 z& h# l5 a. N
(setq angl(getangle“Enter Included angle:”))/ o) k& X# O6 D6 L- [& m
(setq answer(geststring“Enter YES or NO:”))
7 {3 F1 V/ H( A+ F9 Y. J! q* r' m注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
: M# l2 p# d1 O (setq Pi 3.0)
7 ~1 p2 Z% X7 B$ R) B5 ~8 [ (setq angle…)
3 e7 o, F. h5 @3.getpoint函数
- D6 w9 ?; @. f3 A3 }! [7 q- `getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
3 X& H* {, R$ c) m+ u/ W' ^(getPoint[Point][Prompt])
/ T& x/ ~' u# ~% { 其中point…………………输入一个点,或选择一个点
* U3 f8 ^1 J, D1 D/ i- u prompt…………………将显示在屏幕上的提示! G/ }4 I3 H& D# L7 U
示例:
, t' `$ b9 K8 y% H8 c' m (setq Pt1(getpoint))
+ m* Q _* A; L: q' r& Q' d (setq Pt1(getPoint“Enter starting Point》
& H/ J$ v# E7 E; V5 K 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。! p2 y, q8 K* L6 ?9 o
4.Command函数( h( d b4 X" r9 e8 `
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
) C+ O5 _- v0 m- m6 A& T3 I! _/ E (Command “Commandname”)
. `6 D: o; I: t4 o% U" D 其中Command…………………AutoLISP函数
0 m( v! Y& x3 h2 m! ~Commandname……………AutoCAD命令
2 f3 A* p9 {) w7 C9 `# O, N) h7 `0 M示例:4 m, n. E: t( D; T
(Command“line” Pt1 Pt2“”)
1 Z! }1 J( w3 y% M2 ~“line” ……………AutoCAD LINE命令
8 l+ [0 K& q- cPt1……………………第一点' L6 P) j6 e/ {5 a: m1 K
Pt2……………………第二点+ J* f6 O5 ^3 `
“”…………………用于返回
& x# o" I2 R7 T 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。2 z9 b& S/ G4 s/ v' O* }/ q4 T' R
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
8 B' b5 t6 s( J& M9 U2 N2 c( k不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
- v7 Q1 s9 }' U# p/ s1 N2 ~例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
) j0 H, R3 v) y9 l+ W- C( T! p 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。7 R# m' x3 d) P% j& s
编写程序前,必须确认这三部分。
x* D& |3 I5 ~ 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。+ N; \1 x1 } {- Y) P. ]
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
, r6 d' ]1 S+ P+ \ 输入 输出
! n+ [- g0 y. h- x P1点的位置
, n# G0 Z8 E) p7 Q7 r P2点的位置 三角形P1,P2,P3 L$ M; w5 l' M, a* M
P3点的位置
A5 X' C5 b4 v4 ]5 W: O 处理过程! p u: `, D5 g) q7 r
从P1到P2画线
7 M" L. y. ?6 o4 _ 从P2到P3画线
1 L6 O5 E* q" V) m; y 从P3到P1画线
8 g4 Y/ s1 E1 h5 S' g% A下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
6 q ]( y) M5 J* m/ `;this program will prompt you to enter three points 1
* n% P+ o$ @1 V `$ W4 |6 `;of a triangle from the keyboard ,or select three points 2
0 |) ?5 X+ [# b V;by using the screen cursor .P1,P2,P3 are triangle corners. 3. b% ?. U9 c2 `
4
) \. N- k, ?# ~: l(defun: C:triang1() 5
) U( X* z/ M) c7 P (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
0 {: y# g8 |: a; | (setq P2(getPoint“\n Enter second Point of triangle:” 7! D6 h. f% H7 e& a9 h
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8. r" \/ `! @5 f
(Command“line” P1 P2 P3“C”) 9/ B, ]0 l; @4 ]$ R5 C) k
) 10
; U8 q. ^2 @" w说明# T) k2 ?" \, _) v5 ~, Z
第1-3行 r; p9 x9 Z/ Z7 Z
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
+ g1 r7 L. Q+ q7 s. T9 c) M第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
( W8 Q2 v* Z! l$ } T; G, N第5行:(defun C: triang1()2 P+ O4 M& J) U5 i. e' H
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)$ p0 M' r+ L! n
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))0 |& e3 y* D$ p' s! l* @
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)$ j: w( i5 T0 v* L |# ^" K$ M
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))/ C: Q# E0 U( O% C
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。! j+ G* |% E' F
第9行:(Command“line” P1 P2 P3“C”)
4 ~* f) j& ^' x5 W7 O; U- T' A7 |本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。& T* U9 p* A2 Z2 R
第10行
& x. l' A1 d3 j% i8 ?2 z2 }. J7 G* v本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |