1.defun函数) m2 U/ }1 o9 c# e% k2 _! Y
defun函数用于在AutoLISP程序中定义函数,其格式为:
% {8 `% Y4 N& X2 x (defun name[argument])) |9 C" ~: u6 ]% V% x9 {5 h! Z
其中name………………函数名. k( N0 l6 o8 w# }, T. A" d
argument…………参数列表* @9 }) l. a T0 j
示例:9 h2 J# l3 p7 R# t P
(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。( b7 J; J9 ]9 P1 k8 l
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
5 J9 `% S8 R3 i- t2 S6 S6 W; ](defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
8 }5 N1 N h" c" E* m(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
$ C7 \2 l3 d n6 P注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。! w. [, n7 I4 W( [
Abs ads alloc and angle angtos append apply atom ascii assoc atan
7 m$ U5 [7 G* n7 ]* _% @$ jAtof atoi distance equal fix float if length list load member nil) f0 L4 v- o& {1 ]# d' T8 D
Open or pi read repeat reverse set type while
" D9 l8 K% P) w8 @& ~/ w% f2.setq函数" W3 Y+ L: }4 E2 a# {3 `
setq函数用于给变量赋值,其格式如下:) E7 u" Q" E! P Z) h
(setq name value[Name value]…)
2 ]# D3 S0 }' I8 _- B 其中Name…………………变量名
9 j8 u- d$ N7 O1 [# R" K3 `: \ value…………………赋予变量的值
! k9 j; D' L5 g; h: b3 t( K 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。" E% C* ^5 r6 K0 V5 L+ f' p
Command:(setq x 12), N+ @& n8 o! f
Command:(setq x 6.5)! d# G9 |8 x" t: j+ ^+ {
Command:(setq x 8.5 y 12)
7 `0 v: x7 L R/ }8 e+ v' L! L- ^ 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
. J& i' {+ X6 R" p) X# M( N Command:(setq answer“YES”)
6 {2 Q. v6 v \8 [ 这个表达式中,字符串值“YES”被赋给变量answer。" M& \& ?1 L U% ?+ l" R( |& ^
setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
8 P2 l: a# J5 Q) l (setq pt1((getPoint“Enter start Point:)); D9 t& Z B: ~# T, T+ V9 Z+ `6 T
(setq angl(getangle“Enter Included angle:”))
2 a6 X( [3 i' k; G4 _1 _5 f G( p# X/ V (setq answer(geststring“Enter YES or NO:”))
& Q9 n: i; ] ^7 }/ ]注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
! S1 t/ H/ `* i: l" X5 I (setq Pi 3.0)9 f; ?! o. r) C' z' V
(setq angle…)
4 F6 W* U' j: U# f3.getpoint函数& E, M6 R5 R" r- `
getpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:; b7 R6 v6 k0 a( M+ k
(getPoint[Point][Prompt])
1 e' H; j: s" s% L" M 其中point…………………输入一个点,或选择一个点4 Z3 \6 k! k6 ?+ e; k+ T
prompt…………………将显示在屏幕上的提示" y$ S' _& L( a9 ?& [- {
示例: [7 u2 g1 v k) f7 p2 A8 q
(setq Pt1(getpoint))/ k& _2 T+ Z* K: D
(setq Pt1(getPoint“Enter starting Point》- E$ z7 j% p8 y, D
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
- j$ L3 {5 D+ \4.Command函数& }, _/ ]" b' M {% `1 U. X) i
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
6 N$ W8 i. L, i; t- M$ C (Command “Commandname”)
! w/ l0 `, i# m, f$ e6 ]$ N 其中Command…………………AutoLISP函数 T- V# e8 `- J8 l w, F
Commandname……………AutoCAD命令7 j/ [. R$ P; r7 G) b: q% \
示例:: ^6 m$ K( G+ X& G% s5 h
(Command“line” Pt1 Pt2“”)0 \: E6 u/ y9 p8 c9 J4 X, Q
“line” ……………AutoCAD LINE命令' p' j7 y* T+ W- l" W
Pt1……………………第一点
- n/ {6 b- O W0 VPt2……………………第二点6 `8 ?8 G) s3 o1 a" Q7 M0 e4 u
“”…………………用于返回
5 H {- {1 _4 U6 n 注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。$ L4 e$ N* r3 P) f
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
8 W0 {. J: W. |, R/ P! M Y, a, V( N不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
) L/ i4 ?$ `, m% {+ u7 G* M例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
' S' K8 V0 e. N; G* _4 O7 U 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
" W, i! ~9 z3 i$ E 编写程序前,必须确认这三部分。8 U8 M9 _* O F1 A
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
- @% x% X5 S$ O+ E3 D6 D 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
( S/ q& w) z( G7 ~6 z 输入 输出
# C$ y7 B) p/ @1 g# R M0 | P1点的位置5 P, S. }. U0 _- E9 h; `; y0 P0 Z
P2点的位置 三角形P1,P2,P35 x+ t# j4 s8 {! G4 T. }( V
P3点的位置8 M: }/ p& N8 t
处理过程+ V- P; F- V, [0 n; _" X
从P1到P2画线
5 s" _6 P( i3 K4 }" p; i 从P2到P3画线1 k$ |5 f; c. X- v
从P3到P1画线
. h% o+ _" { ]下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。; G, C7 x5 ~- o" ]. L8 ]
;this program will prompt you to enter three points 1) j- Q2 x, }# z, v0 E1 _+ v
;of a triangle from the keyboard ,or select three points 2
! i9 g' [0 F' Z- A7 @0 {8 r" A;by using the screen cursor .P1,P2,P3 are triangle corners. 3+ W% |6 q& B% t
4
1 N+ B0 {" i, J& |( B* h(defun: C:triang1() 5
+ Q' N9 K) A: t" y$ ~% L! v (setq P1(getPoint“\n Enter first Point of triangle:”)) 6 Y" x- ?+ N, {! G/ y( o& Q9 ^
(setq P2(getPoint“\n Enter second Point of triangle:” 77 V8 v( N( J- f1 n' H
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8( E+ l- A R- A; q4 g
(Command“line” P1 P2 P3“C”) 9
# U* M" i6 M2 X1 Q8 q$ [) 10( D( [- w) e( [4 {) y, y
说明 u& W% S# ~* L& R6 i) s v- D! f
第1-3行: M/ R2 [5 A* {/ e) _
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。
, D7 l$ v4 ~+ a8 E第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。: `" h9 @* } v. l: T
第5行:(defun C: triang1()0 X9 E" L: f5 }3 g
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
( T& w* ` K7 ? R) q第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))* ?2 l" `) z; v6 s- K: w
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)2 l. B; I! g2 }1 }
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”)): E g+ `4 z$ ^! S3 D
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
3 c7 }/ o' O! C3 p/ Y第9行:(Command“line” P1 P2 P3“C”)! x' W% H- N9 @7 t7 y
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
2 f7 u7 S! L# h8 |% W$ ^( S第10行& @" i# s# M7 P6 l) v2 M q
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |