1.defun函数
: {& j+ m9 v1 B/ T' q+ Adefun函数用于在AutoLISP程序中定义函数,其格式为:
B* O" A6 I$ H* N (defun name[argument])
& R1 C, d9 y5 Y+ j* W 其中name………………函数名- e& |/ a& U. e8 T' r$ S
argument…………参数列表& Y# ~, \, M, x& n- P/ @8 k
示例:
- x. q# z3 ~# X, G(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。6 `- F) j9 _ ]5 u; A3 n: h: n
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。6 {) N! I# E) }
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
! j3 b7 Y- s6 C* @$ j9 M2 C(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
8 Q8 l# c1 j' o, {注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。$ d- B; K e& v* h9 D: z
Abs ads alloc and angle angtos append apply atom ascii assoc atan9 q3 }5 b" R. g( U
Atof atoi distance equal fix float if length list load member nil) i b* R' `6 W& A
Open or pi read repeat reverse set type while; U) X+ f u4 J! ^- I
2.setq函数
: a- o3 o2 r g1 n6 ~) f$ D setq函数用于给变量赋值,其格式如下:- k) o7 e9 _( @" m2 ^
(setq name value[Name value]…): ?4 h& L; n+ _1 F% T
其中Name…………………变量名! E. g$ Q: H9 b+ @4 | x
value…………………赋予变量的值: R! b! y9 { X, n
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
/ { W9 e5 L' I, d: J Command:(setq x 12)- h$ O% W" W1 G4 O7 d: K
Command:(setq x 6.5)( f; J1 Y$ _* k4 O# R
Command:(setq x 8.5 y 12)# B; h. Y" Y2 J& r
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。; ^+ D# d/ \; N2 p, d G" ~. g; j
Command:(setq answer“YES”)
: m8 C4 y5 m. d: r/ _ 这个表达式中,字符串值“YES”被赋给变量answer。
$ a D2 F" A* M3 J9 [; A6 y. b5 C setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
+ {0 c+ Y3 e' |# U (setq pt1((getPoint“Enter start Point:))! z2 d" \# C9 B, T
(setq angl(getangle“Enter Included angle:”))
9 q1 T3 V) i0 Z$ v% W! G; f (setq answer(geststring“Enter YES or NO:”))
, h/ s9 m$ w. N8 F; M注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
1 ~( l5 P6 L: K3 ~; \! ^* c (setq Pi 3.0)1 p( i& f+ p. K
(setq angle…)3 t$ ]( u4 z; R( y
3.getpoint函数6 M8 ?1 k# _, t$ x; N+ ]
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:# s7 d& I* \( z) A1 M, o# |
(getPoint[Point][Prompt])- _) Q7 M/ N9 [
其中point…………………输入一个点,或选择一个点3 M4 t6 S- o: Y0 @
prompt…………………将显示在屏幕上的提示
* j9 v' w% q W& A/ a0 G 示例:
! z8 N$ e w+ l0 q# q) s' d (setq Pt1(getpoint))
2 j8 n* d& [" j+ _, p0 N& D (setq Pt1(getPoint“Enter starting Point》" ^ x, l6 y- U/ ^! f% d
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。# B7 A. ^ i7 y: i
4.Command函数
( u) L- L, k$ ?0 qCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:8 U1 N# @- l1 M- b
(Command “Commandname”)
, z# G; y2 F6 x 其中Command…………………AutoLISP函数
+ R# d' N5 z# i+ RCommandname……………AutoCAD命令
2 @+ {. s* B% Y. c示例:0 p. ^$ G2 c6 g/ Q+ Y: X
(Command“line” Pt1 Pt2“”)/ Y7 f8 u& I) M4 _+ [+ F
“line” ……………AutoCAD LINE命令 y( t+ }2 G" B4 K: A0 _" P
Pt1……………………第一点1 W, E' W L' ^6 b5 x. B- f( {
Pt2……………………第二点
0 w% |, d3 N" B& Y* ^8 x“”…………………用于返回
, ^ M3 Y2 _$ [& n 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
I1 X' ^9 i: S$ [9 kCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。: n; ? P0 e' H, z
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。2 g4 {4 U9 T% l) t+ a* S
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
: `0 b' p# I! i! L 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。: R8 _8 m. W+ S3 D4 i b6 P
编写程序前,必须确认这三部分。& I5 Q- O3 Z! @% y/ D& @
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。- Z7 j4 z& B+ u! }5 ]: R
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
& g6 {6 _1 U8 q4 i! c7 G 输入 输出
1 J! s6 m2 i2 x6 @+ G. a. v* p6 l! c P1点的位置
6 I) J6 K. {$ O P2点的位置 三角形P1,P2,P3; m( L4 \3 ~0 ?; |% M# A( F) X- }
P3点的位置
* B% W0 R2 q+ q" n 处理过程0 t3 G. A9 X9 y! f; L
从P1到P2画线& s# g& t5 g0 ]: l4 u
从P2到P3画线
! c$ d$ X4 S4 a5 `; P3 k) ^ 从P3到P1画线, e( @+ ]$ i; @" O9 Q, n" t& F8 e5 ?2 a
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。* i7 B2 U c* |8 C! V6 Q( p
;this program will prompt you to enter three points 18 S! S9 `8 ?7 M; o% K/ j
;of a triangle from the keyboard ,or select three points 2
; o; I: {# l& ]. B;by using the screen cursor .P1,P2,P3 are triangle corners. 3. h) a* B# l: q7 ]
4
9 b; `# d; b( ?. ?(defun: C:triang1() 5
: O! c* ]5 v9 { (setq P1(getPoint“\n Enter first Point of triangle:”)) 6$ p% J; U; R% E! k$ y
(setq P2(getPoint“\n Enter second Point of triangle:” 7
4 I7 z! f- v2 b. Q (setq P3(getPoint“\n Enter third Point of triangle:”)) 87 Q+ F6 z" O4 B! Z0 d8 U8 B7 J/ x
(Command“line” P1 P2 P3“C”) 9
T% H, P5 [- V2 G) 10- ?( F- Y$ v2 g k, V
说明
& ~" o) p4 v# F. |; T第1-3行. f j5 U1 p8 n2 \8 u
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
( U+ h# q g* _4 `3 L z b+ j J- ]第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
, ]! b8 e/ V2 D# U6 |- ^第5行:(defun C: triang1()+ ?" j' ?. }* Q* s" b# T
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
. ]& i! z* H. c2 {8 t第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))7 c% y2 m" \( ^. C
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
( c/ S1 V( e* o2 S4 z第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))* |' W1 Z5 N- O6 ^
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。, {+ Y& i0 A i, m4 Q- K) Q2 B
第9行:(Command“line” P1 P2 P3“C”)
5 Y# K8 c: N7 ]' v+ O本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
: U" [3 ]2 a4 {4 Z第10行6 p5 M( }( i2 |- e$ Q0 \
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |