1.defun函数5 A5 S& o' t2 ~) E7 I" y
defun函数用于在AutoLISP程序中定义函数,其格式为:5 t! x# P, z" D! k ^& _4 g- U2 ^* Z' @
(defun name[argument])
$ ~% M$ ?, c% _1 F+ p6 u, r 其中name………………函数名
0 f; f5 @6 s" F/ g5 }/ i" p Q argument…………参数列表8 z) s" x* F1 V+ E; m
示例:
, N7 B1 [9 d" \( i# i(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。1 |+ |3 M& `" q0 V7 h
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。0 W- R( [- q; O, S
(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。6 F/ h6 t. D/ Q1 ~
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。
- b: x( ]+ [ C- Q注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。3 j8 E# K8 q# U" ^5 `1 G n7 `( t
Abs ads alloc and angle angtos append apply atom ascii assoc atan0 z" R, {5 m! F$ T
Atof atoi distance equal fix float if length list load member nil
6 ^1 K/ E1 z3 W7 t2 z5 jOpen or pi read repeat reverse set type while& \' @& D2 I, C1 f5 k4 s2 A
2.setq函数' E. m8 c. h, _/ w2 R
setq函数用于给变量赋值,其格式如下:' [3 P0 ]% j K% I# Z! v0 F T
(setq name value[Name value]…)! K& g6 h z9 d9 G
其中Name…………………变量名
& l7 ^2 h4 @8 o2 E8 L/ d3 B, c value…………………赋予变量的值0 r5 m; p* g2 r' |" J6 Q9 U! \* X
赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。& _$ {4 r) U" U( s: O
Command:(setq x 12)4 O/ d5 p. [' u" `3 L
Command:(setq x 6.5)
* ]; q9 j+ F8 Y- M. ~7 }3 {9 e Command:(setq x 8.5 y 12)+ _/ |" e0 K8 F' d' S9 o
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。
( _. ?8 \6 Q% R! q- w; F Command:(setq answer“YES”)3 `- g5 b( h. S6 ]' J/ \" @5 _. t
这个表达式中,字符串值“YES”被赋给变量answer。
/ p6 X+ y; ^0 R. _- ]2 l setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。
1 X0 t, ^, r9 J: S" w8 l (setq pt1((getPoint“Enter start Point:))
. R0 L, f& v. }2 E& p& t (setq angl(getangle“Enter Included angle:”))
$ p- s1 l9 b2 g0 ^/ e. S7 ] (setq answer(geststring“Enter YES or NO:”))
8 O; C6 C- `8 }/ b& p3 J8 _, j/ i# K注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。
' j# `/ s J! |% P (setq Pi 3.0)% P2 U# P! q. V' N' B+ q8 Y2 H
(setq angle…)
( v/ @! t! O* J3.getpoint函数
8 S. e# ]4 \7 ~+ k1 K6 P# j, Fgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:2 B* w. H/ [7 L1 \
(getPoint[Point][Prompt])
# U, M2 n- i+ ?9 e D1 d' I: c 其中point…………………输入一个点,或选择一个点3 n( j) {5 H, C; o* t) l9 R
prompt…………………将显示在屏幕上的提示
9 k/ O, C* q# l" V- T, |, ?& } 示例:
( V& p" r* Y: V9 X' ~- u8 x* {: P: J (setq Pt1(getpoint))
' [6 ~# {- ^) d' q! Z9 l5 ` (setq Pt1(getPoint“Enter starting Point》
9 E- Z+ U. u% z4 b9 }! ^. {1 f, [ 注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。
! b1 Z! }5 j7 P. x* _) h4.Command函数
9 i& D: q% b7 x+ f0 a3 [, ~2 DCommand函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:* q9 i. I* r5 b. U
(Command “Commandname”)
( u j+ f3 D/ I( S- H: F% a 其中Command…………………AutoLISP函数7 U) g# j" e2 `
Commandname……………AutoCAD命令& ?3 k8 g/ _* O# v3 B
示例:* M5 @' t5 p5 S, l
(Command“line” Pt1 Pt2“”)
# j1 w) K0 J9 ?5 j% Y“line” ……………AutoCAD LINE命令
# O" T% s8 [( K- g/ F+ \2 DPt1……………………第一点
4 w1 v! z, B, Y6 s9 iPt2……………………第二点, y, T" }4 R# E& A9 l
“”…………………用于返回/ }" w- I C2 Q
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
: A" U$ ?& u; M$ }. V" lCommand函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。+ J% P# r# i" O
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
3 D" ]) f6 Q; n例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。+ z9 Z& N& p B" |+ |( U
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
8 k, q5 Y2 @1 y' n 编写程序前,必须确认这三部分。% a' c9 I+ z$ F3 Z
本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。2 r1 j/ s& O8 A1 ]. O
处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
4 p$ Q5 h% X. t1 i: D 输入 输出
9 e1 T( q8 a( k/ o" ] P1点的位置
6 ^4 o* }* Z. G9 y. q6 | P2点的位置 三角形P1,P2,P3
) ^1 ~% v2 v) O/ e7 a8 G P3点的位置
5 p+ D' z4 Y0 Q% Q1 u/ Q2 D 处理过程; l; L; }) p: |
从P1到P2画线# \ G6 ~( B1 b( i1 w7 F% }
从P2到P3画线/ \* V6 Z* X5 O2 f
从P3到P1画线! L2 E6 h0 u2 y6 Y0 W
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
/ j$ l* t" r8 b/ x0 I5 {- H;this program will prompt you to enter three points 1
, c' n' X) L+ x6 k5 e r7 ~9 O;of a triangle from the keyboard ,or select three points 2& u9 z7 V& \6 h* Y" H* d, l
;by using the screen cursor .P1,P2,P3 are triangle corners. 3
3 X) P2 }8 d* a8 u& m0 w9 |8 {* y 4
* s# L* l' { u, U9 a: X/ }9 @(defun: C:triang1() 5
: ~& `8 L9 Q% e# o (setq P1(getPoint“\n Enter first Point of triangle:”)) 6& ^ ? L6 ]/ w
(setq P2(getPoint“\n Enter second Point of triangle:” 7
& K/ k q3 f. F s' @( Z6 Z$ M (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
- v% H5 S: v) c5 z9 X (Command“line” P1 P2 P3“C”) 9; [! J. T# I/ h
) 10
, ^# e0 j/ ~2 P7 l说明. H2 u3 R6 N' m
第1-3行% j* k) |0 E7 ?0 @
前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。2 e; M1 {! U! v
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。- N8 E+ s0 k5 F, }6 h: g
第5行:(defun C: triang1()8 b( O7 @2 R. M+ ~
本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)3 f' @/ c+ _! i" ~
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))( j* T# m! n& W" T T
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
_ d% h# k2 w$ _! j第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))% e5 U4 q- t( s" V
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。
- o, i1 B6 [1 o0 Q第9行:(Command“line” P1 P2 P3“C”)/ f' \: A L9 a: M7 ?8 h
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
9 E8 u# ~( ^. D/ ?& n; J: e第10行
9 B0 U$ s: y8 t本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |