1.defun函数
* L: V1 a! o( ^, Bdefun函数用于在AutoLISP程序中定义函数,其格式为:0 M. k8 z4 [( t) L) l; Q/ v6 {0 x
(defun name[argument])
9 z! h: o7 ]$ Z7 [: |6 N 其中name………………函数名" i5 x' Y2 Y5 Z( t
argument…………参数列表) `6 [3 u7 L% {- ]' j9 [
示例:
: b% @9 B) F) b' H(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。% g7 n+ Y# } r! ~, v4 `
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。. N# W' C8 M6 v4 ^
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
: s! W; f$ `5 s7 u. j(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
9 M; o7 k8 [! b3 `& a% t注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
0 ~/ F, y8 e# \, ^& W$ ?/ ZAbs ads alloc and angle angtos append apply atom ascii assoc atan! f* s' ?( c0 D
Atof atoi distance equal fix float if length list load member nil) y% k" k+ m4 |. F4 c) U( F
Open or pi read repeat reverse set type while
5 P; z) Q: E8 X2.setq函数
" N1 I2 F4 A2 b* M l3 [5 [ setq函数用于给变量赋值,其格式如下:
! v/ s6 r* C. b6 r (setq name value[Name value]…)6 H* }3 ^+ S0 P
其中Name…………………变量名+ U3 N/ m% X2 T; C& ]
value…………………赋予变量的值
1 J- j1 y$ X( v7 Y/ \0 G$ K! Y 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
5 K0 W0 S. T1 Q* B8 p3 ~4 y Command:(setq x 12)
; @' P7 M9 o9 ] Command:(setq x 6.5)
/ t, Y9 C4 r* O+ I! _' O, b Command:(setq x 8.5 y 12)
: M# ]; G+ r; ? J- x 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
% r9 |% h+ d7 z2 D; N7 i. U Command:(setq answer“YES”)
4 }* k8 {- \% p+ k" O 这个表达式中,字符串值“YES”被赋给变量answer。
3 D6 Z% f/ g' ]+ ?' s$ z. }& D( V setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。& L- ~- n% U+ v& K1 ]
(setq pt1((getPoint“Enter start Point:)). [. z' a2 U7 W! D# d
(setq angl(getangle“Enter Included angle:”))
- ]. N5 t" O. R; h4 \$ a (setq answer(geststring“Enter YES or NO:”))% Y) b* Q# ^' A5 Q
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
5 Q7 c0 U5 b) D2 p. h8 l (setq Pi 3.0)
# M( n F' z& p: B1 c% m (setq angle…)/ {5 Y& Z- k. `: ?
3.getpoint函数
* ]* w# T' `4 M$ F& ^getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:2 \1 n% q( s+ X) U
(getPoint[Point][Prompt])
( Q8 _! R& v4 ^/ x& a. r; _ 其中point…………………输入一个点,或选择一个点
$ g0 q: p7 ~: F& B9 Y; W0 ~, } prompt…………………将显示在屏幕上的提示7 I% V/ @1 { q8 h* T+ I- B8 K
示例:
6 q* I x% a- B3 \ d (setq Pt1(getpoint)) \4 y2 I+ T: Y1 z- V( I
(setq Pt1(getPoint“Enter starting Point》: k' z2 k: e' A' [: U
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
% l' D" T2 w# |, G4.Command函数, Q3 f$ k1 ^$ H6 a$ B
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
* _3 F4 v. O" w5 Q( c: p8 k2 R* Z (Command “Commandname”)
2 f1 h M' y- B9 p! N5 | 其中Command…………………AutoLISP函数
u; H- C6 @, F- O# S Z, ?1 w; I+ mCommandname……………AutoCAD命令
; x' X) I) ]# c! C& \示例:3 b+ |, f& \( S: M0 ^5 N
(Command“line” Pt1 Pt2“”). h6 Y) M4 N9 K7 Q
“line” ……………AutoCAD LINE命令( |+ _9 S% T6 N+ C8 a
Pt1……………………第一点" Q& e9 B3 j) J; K" }! d
Pt2……………………第二点0 C/ J+ r) k. H: u' R) H
“”…………………用于返回" N! D2 q% I% X) |$ e
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。8 n# @. S* X1 L2 V1 T' B
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
* z2 n/ [/ m# F; Y* y* N5 Y不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。6 y$ V9 }' d) ^% A3 j" y$ y
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
2 {" e# `3 T$ I/ A6 Z! J: s 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。/ D/ F9 g! I D3 y
编写程序前,必须确认这三部分。" r9 ?$ t( `) W; \6 i7 q B! ?
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
# |* t ~5 }: K8 J' h 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
7 l7 z% |* |( T; _1 f- U 输入 输出
7 i7 B6 }1 v' H5 m/ } P1点的位置0 |4 d( |6 e; C+ Z8 u: a4 @
P2点的位置 三角形P1,P2,P3
3 S+ J0 B$ b1 T, F k7 k6 \( U P3点的位置9 G+ S0 }2 K+ V" H8 U) Y
处理过程7 v/ c3 Z6 j0 u% j2 v9 I: } U
从P1到P2画线% y# S- _- p7 Y% ]# y
从P2到P3画线7 `* s' Y! t) l) y* @$ @
从P3到P1画线3 J: A ^% M* H: {6 K
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
% W# l& a# `# G) A;this program will prompt you to enter three points 1: D7 Z# p: x/ ^# ~4 T7 U7 \
;of a triangle from the keyboard ,or select three points 2" f: p: P9 o: n, m1 {" o
;by using the screen cursor .P1,P2,P3 are triangle corners. 3& t% X+ _8 ], K6 i1 D
4# u/ n. O% l& _( I) d" |$ g) ]
(defun: C:triang1() 5+ C$ r0 Z1 b( L5 B, c) g
(setq P1(getPoint“\n Enter first Point of triangle:”)) 6" s9 F. ^* @2 }! |/ I' N
(setq P2(getPoint“\n Enter second Point of triangle:” 7
5 P5 ?5 C. u, V* k% }# e* e (setq P3(getPoint“\n Enter third Point of triangle:”)) 8+ q P% d X; c1 q' u
(Command“line” P1 P2 P3“C”) 97 U& D7 W6 _8 R# U9 s1 c
) 10
, C3 }# N8 x: M/ N7 e说明
% ?6 u- S5 ^ K* _7 B* Q: t2 Z. L2 Z. W2 P第1-3行' P# |( J1 \: G+ m) h/ M. p& d
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。: d9 X: J8 Q" }% I/ n+ `; e
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。4 w3 S1 v+ m+ H9 k' q! k+ f
第5行:(defun C: triang1()
1 H1 X8 I9 N6 L4 `% F/ b Y2 F( R/ ?3 z本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
* m6 C' T: o6 l; @" v第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
6 g. D4 q! @+ o$ _- |本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)3 t- u. W7 D" m( C) Z
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))& Q# j# ]9 ]' @+ P
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。2 e/ r/ Q; b5 _9 Q! F
第9行:(Command“line” P1 P2 P3“C”)- f4 u* L1 G* H }* s
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
% n9 i, c) P, K! @, j: n2 \. w第10行
# ?8 a* W3 `5 ~( X/ v$ @本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |