1.defun函数% s5 o7 j" z8 H) {
defun函数用于在AutoLISP程序中定义函数,其格式为:
9 t1 E" U' a# |3 O6 _5 ^" s (defun name[argument])
1 }2 P5 R* \5 n( x; W 其中name………………函数名2 w5 k; I) P! S4 W: `4 H
argument…………参数列表
' M/ Y5 C$ o p/ f 示例:
5 B5 z. `' P( x; i- ~3 I2 o+ {(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。, |" \1 R5 o5 O; j! E6 u
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。0 d% [5 h- E# {& U- q( V( z
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
- B/ @* V- c* _1 q9 e, ]6 o- U(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。: y D% Y0 y9 T/ ]
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。$ g% n0 ~5 k4 ?+ l- B
Abs ads alloc and angle angtos append apply atom ascii assoc atan7 G0 L4 }' t$ d
Atof atoi distance equal fix float if length list load member nil# C2 i; |+ T A, G4 _
Open or pi read repeat reverse set type while! ^9 C9 d2 z q7 V
2.setq函数
* x, |$ e2 @6 S setq函数用于给变量赋值,其格式如下:
4 o) @% y3 G2 g: p; W0 S/ T- Q, c7 c (setq name value[Name value]…) |) P, \) T* D1 R% }; {
其中Name…………………变量名
) P4 q% V# }4 T! q' @ value…………………赋予变量的值3 j" L) V8 x; v$ `0 ?6 Y
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。4 }7 G; U; t* U" S4 ]4 b
Command:(setq x 12)& h% `- }, D% H2 v
Command:(setq x 6.5), T* f/ \6 d1 Q
Command:(setq x 8.5 y 12)) b- J! ]" d+ v: p1 I4 Q- f, ~
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。) ^) y" @' f9 a* z1 `, f
Command:(setq answer“YES”)& [, |* {# c9 ^9 d6 _9 I
这个表达式中,字符串值“YES”被赋给变量answer。 g0 H* o8 p- m( B$ o
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
5 H9 Z: N! @# c2 |0 T (setq pt1((getPoint“Enter start Point:))
7 N: {# w& ~- i$ x (setq angl(getangle“Enter Included angle:”))
E) u1 A. B* `% E (setq answer(geststring“Enter YES or NO:”))" J/ b3 G* u0 K7 Z
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
5 m/ [" g$ {% q: ]% L7 p8 } (setq Pi 3.0)
3 m$ Y2 B6 c3 U5 @* z2 g (setq angle…)) ]# H$ t A5 _& i
3.getpoint函数
+ c: n0 ? O% g/ w6 w: B& I) {8 bgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:+ p" n, X9 i- r! ^9 @. W0 W9 T
(getPoint[Point][Prompt])
3 T( n8 N* i! [; ~2 ^ 其中point…………………输入一个点,或选择一个点6 Y; Q( |% Z0 }/ v3 c
prompt…………………将显示在屏幕上的提示
: N$ e0 r6 m+ n' W! }& v 示例:
- p$ x8 B; J/ B5 B ` (setq Pt1(getpoint))
- g* k/ l1 b* e+ `4 t# ^& t (setq Pt1(getPoint“Enter starting Point》0 E* [7 f) d: P9 k8 C' d
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。. @/ O& \1 u, ~& k |# Y
4.Command函数
$ X$ w( A$ o( t7 q) ?5 C# hCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
5 @( T& ?5 l, }* S (Command “Commandname”)& k; q, A7 N& ~& b; m. S
其中Command…………………AutoLISP函数! {, S4 s0 n T* F! j' L1 l$ \) g
Commandname……………AutoCAD命令, E1 h) V9 l, _2 S, D. p
示例:
5 _+ }! M' }* i. s7 _; m2 m2 ~& D(Command“line” Pt1 Pt2“”)
6 P0 K p1 P6 E6 \$ |“line” ……………AutoCAD LINE命令1 N* Z, o- @0 T
Pt1……………………第一点3 F0 w0 z) N9 V! |) y7 M
Pt2……………………第二点# ?* t- L8 U9 P
“”…………………用于返回
! A8 G, @: E( e 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
3 q; b) g' ~; I3 G; F4 N' K; yCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
& a+ i. ?" r2 z ]& p不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
% e+ k# |1 I" g o例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
2 E- c2 f7 X2 m 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
' F4 Q! |0 F( Q& U% v 编写程序前,必须确认这三部分。
6 D* Q* D) T6 D4 C; j 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
% P0 s$ E0 V( u1 q9 Z, w* B8 h% n 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
' f; b' a8 u0 ], X) q: I4 p3 P 输入 输出
7 q# _* O9 m' p" V$ M9 ` P1点的位置; _3 y, H" o4 x" `) A- L9 Y
P2点的位置 三角形P1,P2,P3
/ y, k' {: P/ o- I1 J P3点的位置
5 m, h. v8 |' l 处理过程
: p2 A$ G* {# `4 d; r6 ^ 从P1到P2画线( W" I- Z2 Z( D1 h {% r/ E$ p
从P2到P3画线, U, u! C$ ?, Q6 ]4 j
从P3到P1画线
5 a7 u* A9 a9 L下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
& k( n8 x3 V; G3 Z, \5 I;this program will prompt you to enter three points 12 u: }* b' i/ ]
;of a triangle from the keyboard ,or select three points 2
! a4 s- Y% A+ Z5 Y1 _8 K( u' w;by using the screen cursor .P1,P2,P3 are triangle corners. 3
5 w6 x1 L$ T( q2 \$ f 4
: I1 ~3 E! C; d9 p7 ~* ?: Y(defun: C:triang1() 5, A/ `/ {% J0 N9 n7 x4 d; t$ }
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6
! i! _& k$ R0 R$ n$ B- E (setq P2(getPoint“\n Enter second Point of triangle:” 7
1 g6 {2 X3 D! H0 a (setq P3(getPoint“\n Enter third Point of triangle:”)) 8& e/ R5 R# D9 G1 b t$ ?
(Command“line” P1 P2 P3“C”) 9" Y! f/ G* P$ q- ]
) 10
. P3 _$ q7 |9 K9 W# Q4 R% X说明4 Z: L, |' @+ K$ h* Z. K/ s) H7 q
第1-3行9 P1 K% g0 ~! u. E: ^! S9 o
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
# {) ~9 P* T E3 }' y# E7 S3 }第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。8 N- L0 E! A& M1 |- o* O; t5 B( S
第5行:(defun C: triang1()
: T0 d# r H- r" @1 P本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3); |6 ^) x: Y" N3 f! k% ?5 S+ O
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
8 N9 W8 J9 {4 Q8 h- B, c4 g7 e本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)6 z; a7 s; k2 y. V3 @7 z
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))1 @( T& K: R; P* @* }2 n
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。( v- g4 f5 z) n: [6 A1 t
第9行:(Command“line” P1 P2 P3“C”)) w2 V; [' w2 u
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
% Y2 Y5 d f [; m第10行
' t; V$ v1 w, W6 }" z本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |