1.defun函数
5 b# ?, D) V7 p* K+ Qdefun函数用于在AutoLISP程序中定义函数,其格式为:
& W. N0 d" C$ j0 K3 |" N (defun name[argument])
5 Z; ~4 E# d9 Y, I) q: M. G 其中name………………函数名/ Q M8 H2 _, Y9 `
argument…………参数列表
2 X f( i" h N& O1 ^ 示例:
+ V( w4 J& ^ [$ L(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。( R: X: C* ^; j( m5 P: Q- ~, C
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。9 @4 G8 k5 r6 t- @- m+ |
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
' n! f. [" w: W* Y0 t9 P# _2 I4 f(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。* Y7 S: o" x5 \# t) c1 c
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
8 e/ @/ }/ B/ N# |Abs ads alloc and angle angtos append apply atom ascii assoc atan
* P" u) ~) V- X4 g) sAtof atoi distance equal fix float if length list load member nil8 Q8 U C. R7 m
Open or pi read repeat reverse set type while! |& N0 y( W9 x( s U
2.setq函数
8 R. H7 C! I: H$ t" ? setq函数用于给变量赋值,其格式如下:8 Z: e' k! }" g5 E$ s
(setq name value[Name value]…)0 z7 I ^ z( b! y! v+ K
其中Name…………………变量名2 F, p' p* B- [% J8 B: A
value…………………赋予变量的值* I9 |) B: \% @( ~1 `8 c. n# W
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
& E. K, j4 f/ C- @3 G! b2 L+ o Command:(setq x 12)! Y% |4 n8 s: A8 v, c+ P
Command:(setq x 6.5)
' `( ~) A4 U& ] Command:(setq x 8.5 y 12)7 r$ y/ _. J6 k
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
- q' @; P p! j' w Command:(setq answer“YES”)
$ N0 e& ]% } s, { ?7 J0 V 这个表达式中,字符串值“YES”被赋给变量answer。% @9 M0 s! n+ ^4 `" D6 K; V8 r
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。' X) k4 M r& ^6 a/ n6 T8 H
(setq pt1((getPoint“Enter start Point:))
0 E4 N' W S* F% n3 r1 Z% f6 |8 B (setq angl(getangle“Enter Included angle:”)). v' e. ?$ l4 I
(setq answer(geststring“Enter YES or NO:”))( B, J% Y9 J& N4 x5 L
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。; d7 \3 i6 `+ z
(setq Pi 3.0)
$ a% o* ^7 K+ Z C (setq angle…)- m) X" V! S; K4 t
3.getpoint函数6 j0 t! X( |! m: e$ r; P1 x
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
/ \# M( W: c1 M& d(getPoint[Point][Prompt])# `5 E0 [2 _' m8 p) m
其中point…………………输入一个点,或选择一个点
% ^& M: ?7 |3 { prompt…………………将显示在屏幕上的提示. d" ^4 a& S3 a1 J5 k. n5 I
示例:( d# R4 ]. b6 n$ x8 n* i7 L
(setq Pt1(getpoint))9 ?0 e6 B+ p* }* [
(setq Pt1(getPoint“Enter starting Point》$ z' r4 M. D1 @; F# o
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。2 ~8 m+ B9 X( p/ L: i4 u' @
4.Command函数8 E- Y4 M1 a- f8 U
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
# s3 k, B) `% I) o; v! Y7 c (Command “Commandname”)
% f5 l6 F" I. |- J& E [3 j 其中Command…………………AutoLISP函数
/ U4 Z5 U1 ~ c4 |Commandname……………AutoCAD命令) N0 w, m4 P L" S
示例:
) k- L: d0 m8 C' @8 `(Command“line” Pt1 Pt2“”) x, B( o. F% Q! g- _
“line” ……………AutoCAD LINE命令( R2 G" Q( N- B1 J) n& F& `
Pt1……………………第一点: U! i {) e- C
Pt2……………………第二点
8 @2 B. E# n' u# \( \9 @“”…………………用于返回0 U' N2 C2 T( U( V2 y$ c4 q- U. C; m1 T
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
+ }7 c; C2 ?* k3 C8 hCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。! E; w4 X5 Z x. m6 X4 { H
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。% a2 f I. k, W# p4 c
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。% o3 N w6 V8 H) C d8 T' e
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。7 F; D. L5 m6 U s
编写程序前,必须确认这三部分。# U3 T, c0 z' m$ t8 H# E' U
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
0 [7 Q5 g& p4 N- t& ~% T 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
" B2 v- ~8 Y# x V0 O1 | 输入 输出, O" ?2 E. D) f! y7 u% q ]
P1点的位置2 X6 C6 W8 H) E& W: [8 I
P2点的位置 三角形P1,P2,P3# J( c9 Q g3 Z) v5 \+ D
P3点的位置. a$ o, O9 w" t
处理过程# y* E$ o/ u3 G+ Z8 v
从P1到P2画线5 M4 y# j8 Z5 `2 k O% Z9 y, G. D7 a
从P2到P3画线: r* p6 u& p- G0 `3 u1 z' H
从P3到P1画线- R5 I a0 y6 w3 J
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
* ~# n* h" T7 T& A;this program will prompt you to enter three points 13 J) Q$ D1 f$ F/ ? h: W C
;of a triangle from the keyboard ,or select three points 2
: ^: m+ J" C- ~: \# w% g;by using the screen cursor .P1,P2,P3 are triangle corners. 3) k& }( v8 v3 A/ }/ v% T& B1 D
4; d6 X/ ?# } @0 j" n
(defun: C:triang1() 5( C- E' g" ?7 p9 l) l! J' A' d
(setq P1(getPoint“\n Enter first Point of triangle:”)) 60 Y K" S7 E, T; F) b) D
(setq P2(getPoint“\n Enter second Point of triangle:” 7
% O- ]6 Q' w: o3 c% E (setq P3(getPoint“\n Enter third Point of triangle:”)) 88 d, z" o/ g7 v0 C. Z
(Command“line” P1 P2 P3“C”) 9
' y6 B6 T/ r- T' P% z: O7 `3 o) V) 10! Y R6 e# u3 \/ L& {
说明7 Z }' E# O/ Q' c' [$ [2 o
第1-3行# W2 d: C8 j3 z+ H" p
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。4 g* D' r: }7 o3 z6 `+ p
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
! P' S" w% d e5 S+ x第5行:(defun C: triang1()
7 i5 X* J- ]! b本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3) ?2 \- I, ^4 s+ l
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))& A7 S/ C. y9 ^" x, k, W, f$ f9 H
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
) L0 P! F) j/ g$ _% q: c* W# X# ?第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))8 R# o' B5 D8 s t
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。- N# J/ ^( ^: O4 A6 q$ m
第9行:(Command“line” P1 P2 P3“C”)
( V$ M1 z0 N$ O) u1 S; b5 B本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。- H6 f" F9 S: G* D$ h
第10行
/ V6 Z! `9 r! n# A# |本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |