1.defun函数
% A0 I7 n! Q8 S Q5 W3 c$ Z ]3 udefun函数用于在AutoLISP程序中定义函数,其格式为:
/ ^" K% k# b- ]9 D4 X8 T8 r9 } (defun name[argument])
/ ~4 I3 v2 m; ?, [, y1 z2 X! Q 其中name………………函数名
- B0 |7 Y. F7 v/ T9 f8 M' S argument…………参数列表9 y$ h8 h. I A3 G* p& X
示例:
5 ^7 D9 \0 X5 ~1 L% w9 N9 C q" A(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。
7 c% w2 H, P9 B/ X- g3 s1 O(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
; B2 `6 K, j$ f/ V(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。
z4 ?4 i- o; |- `(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。# l9 [8 n4 X8 o
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。' F* Z" y" \9 F9 _& E) u& j1 n
Abs ads alloc and angle angtos append apply atom ascii assoc atan
: ~, P7 t& S/ K( hAtof atoi distance equal fix float if length list load member nil
% o+ j: F$ X8 v" C eOpen or pi read repeat reverse set type while, m! p* y2 B1 L1 B# S5 ]+ |- n; |
2.setq函数6 |1 |. }+ R# M: P
setq函数用于给变量赋值,其格式如下:
% M7 b9 d! A# A2 a (setq name value[Name value]…)
x! }1 E( O' r. J8 I 其中Name…………………变量名. y( m0 B; \; X" _
value…………………赋予变量的值
# D/ t: A$ s$ B4 p1 e$ T+ s 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。$ b& ]( q- P# l# @& c, k
Command:(setq x 12): w9 L. h8 _) E5 t: n" i/ a& L
Command:(setq x 6.5)4 R; c5 c: }6 ?: F5 r
Command:(setq x 8.5 y 12)
2 s) D; p @& L t. a# g1 ?! l" M 在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。: ^# o* Z7 ?, w' P" f9 R! L& W/ @
Command:(setq answer“YES”)' @( w) F0 X$ f% D9 s9 N; I& \5 g# W
这个表达式中,字符串值“YES”被赋给变量answer。
% \2 {. E8 W1 `2 F setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。( z$ k6 l/ p8 K, j5 N3 ^
(setq pt1((getPoint“Enter start Point:)): J: `3 ]1 O3 V' F/ z4 e3 W' T
(setq angl(getangle“Enter Included angle:”))4 f/ s* @+ x( d/ @. m6 _
(setq answer(geststring“Enter YES or NO:”))1 X9 O1 U$ v1 y6 ?( Q2 m6 R
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
4 N! d5 @# j( O% C8 B7 u: V/ K S3 M1 Y (setq Pi 3.0)
. j1 j; s/ V( n, T/ }+ e (setq angle…)' {6 k& s; g1 e6 b1 q& o# Q) J. G
3.getpoint函数
* Y% A' c0 s8 Y# t- H- hgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:8 S4 k7 m( P- V% t9 @
(getPoint[Point][Prompt])
3 P: u! n/ v3 T7 ~) T 其中point…………………输入一个点,或选择一个点
8 m5 [. J K4 F! ?( \7 I, C prompt…………………将显示在屏幕上的提示" n7 i, U& u- t. u; x9 _# F
示例:9 \, r- q+ y4 y x2 Y$ Y
(setq Pt1(getpoint))6 J% y$ k! p2 Y
(setq Pt1(getPoint“Enter starting Point》
5 K I3 U8 w7 h: \3 C' T 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
+ x1 a8 M0 Z+ ~+ ~1 K8 s" q. }4.Command函数
4 C. P# `1 s8 CCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:" C' R3 A) M" c" {5 J# [; Q0 s
(Command “Commandname”)
& }+ y' \% d8 A 其中Command…………………AutoLISP函数" N* F) p" q9 O% r, r
Commandname……………AutoCAD命令% J R2 V# h9 E9 i2 n+ A0 F4 I0 B
示例:
7 ?4 `- C9 x8 }(Command“line” Pt1 Pt2“”)
0 o& N8 A3 f6 B! [* Q e$ S2 }“line” ……………AutoCAD LINE命令; s0 C1 q, L; N
Pt1……………………第一点9 Q0 u7 R% ~' d8 K& w
Pt2……………………第二点
7 N7 O7 A, Y/ j2 n) n5 }, G“”…………………用于返回/ f' y! y( ^# c* k/ R
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。) A5 I& l7 N6 Y& b; j) g6 S% F/ i+ i% F
Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。
4 k* D+ W5 ?8 B不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。1 ?! f' w4 @7 J3 {: k
例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。
/ }0 B0 i& G3 v+ m9 L9 T7 R$ T 多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
1 |6 Z4 y; u. x& g* ~9 Y 编写程序前,必须确认这三部分。& j* V& w# e( m, H. d6 K; f
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
, b" S+ V. v9 Z3 C! ^# W5 g 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。( Y# r% j2 o3 X7 J; v7 G
输入 输出
4 T8 \: V0 Y" l7 y- w$ g1 d P1点的位置9 `/ {# ^, |0 G z% }
P2点的位置 三角形P1,P2,P3. w) w9 R7 w. z
P3点的位置
: V2 G/ R) H1 s1 k% X$ ~$ ]+ { 处理过程
( b# F$ a$ N& x 从P1到P2画线
3 c6 p. a, c) `: L1 K/ y 从P2到P3画线
8 L9 u. C5 G0 t3 ~2 ~9 Y' u 从P3到P1画线* v, p2 M8 i g( W+ F# _8 R! Q
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。4 E: {7 E8 H6 g. X! z' ^; x
;this program will prompt you to enter three points 1# A# a2 Z1 S; T d. Q: m4 t. M
;of a triangle from the keyboard ,or select three points 2
" G/ z% h }: E' `, x;by using the screen cursor .P1,P2,P3 are triangle corners. 3
! H7 {! r w0 L% Y& C' i- W 4% w7 V% S/ M* F; R: u2 Y) {! t
(defun: C:triang1() 51 f l: ]5 ?* K) @
(setq P1(getPoint“\n Enter first Point of triangle:”)) 61 o! n) }+ y- g! Y8 u
(setq P2(getPoint“\n Enter second Point of triangle:” 7+ e# G! u) O$ K3 p2 u, [
(setq P3(getPoint“\n Enter third Point of triangle:”)) 8
; [! b: O6 e @; Z- |8 L* I2 \ (Command“line” P1 P2 P3“C”) 94 \' q) ]: _/ y( Q
) 10
8 V- o" Z8 D8 ~5 y说明
+ s7 d) e% ]# M; F5 v% R8 Y第1-3行' I8 Q/ O' h I
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。5 @7 d% W/ {. {3 g
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。. W7 Z4 Z# o7 H
第5行:(defun C: triang1()3 O9 A) ^" `2 U0 m1 L7 R+ h2 U
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)
6 O7 o% ]6 w4 q3 }. D! X第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))
7 c+ [4 j) ~; [本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”) V" R* v! B: L% k; f6 Z/ }- [
第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))' ^8 m" D! g/ G- S& ?" W. H3 b; R
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。$ }' J m: e. Q3 g8 C& Z4 s. ~
第9行:(Command“line” P1 P2 P3“C”)
3 y$ [! N; e" U9 C4 W本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。# J8 x) v* R9 u6 y' Z0 y* S3 S' t
第10行
* @/ g4 p# a( c! |, i2 p* P本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |