1.defun函数 X9 t$ ]4 D+ H' \
defun函数用于在AutoLISP程序中定义函数,其格式为:
. Y/ i; _) f6 ?' {# G" Q% y/ \ (defun name[argument])) s+ I, }9 E! X' O- s( s
其中name………………函数名# E! W8 e M2 E+ G, ~6 L: l$ B
argument…………参数列表# }. S ?* s; Z8 v% m2 O, X) K
示例:' `8 @& f6 U1 d/ C6 s
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
; Z9 e# L4 U* H/ V9 l(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。# p; [) h1 j$ D, S5 D: ?
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。: \; _& L$ K5 N8 Z6 _
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
+ ~) }! v0 X) i( O+ I注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
& j8 U0 z* V/ e$ OAbs ads alloc and angle angtos append apply atom ascii assoc atan
6 h7 \* X3 _% I6 Y* HAtof atoi distance equal fix float if length list load member nil+ }5 d2 Q6 g. h5 }$ K% b
Open or pi read repeat reverse set type while
3 ~! v8 {8 v1 e$ I2.setq函数
+ E6 P. m# o. ]$ W5 T3 T setq函数用于给变量赋值,其格式如下:
1 Y7 A" z/ B7 l7 V, I (setq name value[Name value]…)! J+ `5 r' q$ Y, q5 A
其中Name…………………变量名4 j: G J6 c" U: k6 L* a
value…………………赋予变量的值
, A& k& x Z6 A1 i4 O 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
: I; ?( {3 r9 I, ~ Command:(setq x 12)
9 J& m" n/ l* W1 v6 A2 d1 ?2 P Command:(setq x 6.5)
" S$ v' I+ E+ ^5 J2 p p$ r) x Command:(setq x 8.5 y 12)
7 P' I# k6 b5 w3 H5 ]" y8 N 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
4 x# V1 q0 U+ s7 A& L Command:(setq answer“YES”), t( d& i8 Y: `# X
这个表达式中,字符串值“YES”被赋给变量answer。
: [0 u2 W& u' Y setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
! b1 z& \: q. u A: K, _5 l (setq pt1((getPoint“Enter start Point:))
3 l8 u- A2 {- \# ]9 T" y C7 A (setq angl(getangle“Enter Included angle:”))
# I6 c, O+ k( l( k+ {2 I" Z0 N2 N (setq answer(geststring“Enter YES or NO:”))
6 }, b& R% T) T& p; V {注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。, V- G. E9 f) r L# @, s% _/ | U
(setq Pi 3.0)& M2 O" C9 F9 I6 R7 }
(setq angle…)
' w8 N' K6 q$ W8 a* z" S/ G3.getpoint函数. T% q4 m$ y9 I# e
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
9 k! u% H* H# ^6 ~3 q; e# R(getPoint[Point][Prompt])8 l% _9 b4 |7 q! Z7 d' ~ l C
其中point…………………输入一个点,或选择一个点
* H# J; z( l& z0 w, b0 c prompt…………………将显示在屏幕上的提示0 w( O+ T2 W7 V4 Z9 @
示例:+ @8 g9 Z- Y/ d4 [: N
(setq Pt1(getpoint))
% q; p, v* K: A5 |3 S (setq Pt1(getPoint“Enter starting Point》3 N E0 G; @4 o7 G, a
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
- w; Q' k4 a5 e* D3 ?4.Command函数2 M+ V9 }, T6 S o5 Q
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:5 F8 V$ G1 U0 Q4 P0 ~
(Command “Commandname”)0 l* S3 w _# O& x# K% j* C
其中Command…………………AutoLISP函数
( f+ i0 C9 }* r6 g ?Commandname……………AutoCAD命令
2 m0 E- x. D. A* M' B示例:
# D8 i5 c) L( P3 { s. j(Command“line” Pt1 Pt2“”)
N$ G" q4 m9 a* K# \“line” ……………AutoCAD LINE命令
% P# U# Q( {. q# zPt1……………………第一点
' M- j3 E. G# ~Pt2……………………第二点
0 e8 [: D, W2 _! Q+ f* }4 Z“”…………………用于返回$ d. m: q5 E" g' m$ u+ S
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。* O" ?. R4 N* x) Q
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。+ J0 A9 Z! A3 O* E0 z+ i5 m% b
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
( t' ]0 z) G% d# v; F) u, v" i' {例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
t5 K" u: B2 V# _ 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
1 N& w; I: E- z 编写程序前,必须确认这三部分。
$ W% ~' L3 n! k# C6 M, x) E 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。. Q1 v0 [: p* K. l
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
* `. a0 a6 D4 Y$ Q! h( F3 F 输入 输出) B0 q+ R2 p! }$ q6 g( f
P1点的位置2 Y, ~7 f/ P- c# K- B
P2点的位置 三角形P1,P2,P3
, z* e8 |. b/ W6 z P3点的位置% M9 n/ Q, x9 W6 V: S
处理过程* j1 u& M' Y; ]
从P1到P2画线/ m; f3 S( |* n4 Y( X2 Z6 ]2 E* ^, N
从P2到P3画线; J, @1 v' W% H R+ S& U
从P3到P1画线
4 h7 R3 r# N) L下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。( e) ?/ d! J$ G! b
;this program will prompt you to enter three points 14 M* y9 N/ u8 `( b3 P4 |
;of a triangle from the keyboard ,or select three points 2! K0 [* {5 t9 J$ ?2 H) _; W7 d
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
+ w* W2 ]; K7 x2 z 4' z" G) r3 P3 |/ M7 i9 u7 X
(defun: C:triang1() 5 F; a6 @# K- w0 t4 `5 @8 @
(setq P1(getPoint“\n Enter first Point of triangle:”)) 67 Z. G" T4 a9 H, o! h& X. D
(setq P2(getPoint“\n Enter second Point of triangle:” 7: k' h6 A7 P* ], q9 p* ^' G
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
* I ^; h) o* \* L (Command“line” P1 P2 P3“C”) 9' a0 ]; Q9 n3 C& q
) 10
. M7 ?, r" \2 p4 L说明. D0 z4 z' ~# |+ H' y0 `9 L
第1-3行
/ I" ?+ V3 \1 O0 H, y2 t2 F& v前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
/ m5 X6 X) p' r6 i! F第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。
/ S8 t6 O. o# l0 m# w2 w第5行:(defun C: triang1()- W" I+ o! t p) h
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)' @- y+ d- V7 v# e
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
& h. q* ^! i' r4 m7 g, E; X本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)5 S1 Q+ }: [5 {" q
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))
) R* W$ C, h4 x. {& B' B: u. d1 w0 a这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。 a' }! D" k3 u
第9行:(Command“line” P1 P2 P3“C”)8 p8 x3 T3 S, `! f W3 \
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
. \" U4 I' m4 T0 C第10行* s! J& w% Q9 ?
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |