1.defun函数
0 H% y L" X. c3 Tdefun函数用于在AutoLISP程序中定义函数,其格式为:
$ Q R/ V7 S$ d5 Q; W (defun name[argument])7 R+ w. k: K) @6 u9 ~$ Y
其中name………………函数名
- G! |+ ?& k6 _- z- c6 | argument…………参数列表
) X; Q2 K. S- w5 Q7 m8 P9 w 示例:
# d/ _7 }8 L6 [) A(defun ADNUM(),定义了一个函数ADNUM,此函数天参数,亦无局部变量( Local symbols)。这就意味着程序中用到所有变量均为全局变量。全局变量的值在程序结束时不会丢失。7 {" |7 g- [1 s- A h. K3 d$ `
(defun ADNUM (ab c),定义了一个含有三个参数a、 b和c的函数ADNUM。变量a、 b、 c从程序外部获取它们的值。
: [! M# S+ {1 Q/ G# E1 a4 d' B(defun ADNUM(/a b),定义了一个含有两个局部变量a和b的函数ADNUM。局部变量在程序的执行期间保留其值,而且只能在它所在的程序中使用。, {& R2 A- l) R$ B, b G
(defun C:ADNUM(),在函数名前加上C:后,此函数就可以通过在AutoCAD的Command:提示符后输入其函数名来执行。如果没有使用C:,函数名则必须置于圆括号中。$ b1 ?$ ~4 m7 t3 r
注意 AutoLISP包含一些内置函数,不要使用其中的任一名称作为函数名或变量名,以下是一些AutoLISP内置函数的保留名称列表。
5 W; w4 c' \9 K1 n1 k$ GAbs ads alloc and angle angtos append apply atom ascii assoc atan0 r2 b. m" U! \) h
Atof atoi distance equal fix float if length list load member nil5 ^1 s+ ?& J% z* R
Open or pi read repeat reverse set type while" g$ w. R% ?2 e4 W2 T( {
2.setq函数& C* d& Q' Z6 H
setq函数用于给变量赋值,其格式如下: I; A. J' b: K
(setq name value[Name value]…)
2 u$ A6 O+ g$ e5 G 其中Name…………………变量名
+ h+ U- N6 e4 `1 d* ^; c value…………………赋予变量的值
7 u |* q7 z& _$ s0 q 赋予变量的值可以是任何表达式(数字表达式,字符串表达式或既含有字母又含有数字的表达式)。若该值为字符串,其长度不可超过100个字符。
" N6 X c% @4 y$ F Command:(setq x 12)
" y" i+ I; H v9 O4 ^) ^ Command:(setq x 6.5)
, [, P$ e, I [1 m9 d n Command:(setq x 8.5 y 12)2 L& T0 d( P# p( _
在最后一个表达式中,8.5被赋予变量X,12被赋予变量Y。' C8 O6 c4 Q: a2 I8 [
Command:(setq answer“YES”)! I6 S& t" {& \0 Y& d+ w
这个表达式中,字符串值“YES”被赋给变量answer。
, W0 Y$ f3 T# z# x! t" m setq函数还可用于与其他表达式联合为变量赋值。下面的例子setq函数被用来为不同的变量赋值。$ m$ N, W& Z- D4 j* o1 v
(setq pt1((getPoint“Enter start Point:))! Y; a [& ?' O1 g$ w$ [7 y
(setq angl(getangle“Enter Included angle:”))
, w. j) f, L* S5 F# c (setq answer(geststring“Enter YES or NO:”))# E; A; ~4 C9 _, s9 [
注意 不要给AutoLISP使用的一些内置函数名及符号赋值。下面的函数是有效的,但由于保留符号Pi及angle将被重新定义,因此不要使用。0 c- W5 N7 l% e8 y8 |% C! ^
(setq Pi 3.0)1 y% u3 g6 u! H! F9 F6 {. X
(setq angle…)
2 }% u( Q: n6 e: m, \' s' b, W, y3.getpoint函数
0 b, w/ w: y$ C, e: g: S, b8 o1 }5 d; bgetpoint函数暂停程序的运行,允许用户输入一个点的X、Y坐标或X、Y、Z坐标。该点的坐标可以由键盘或使用屏幕光标输入。getpoint函数的格式为:
& g. L- \- Y; a, b% N5 N(getPoint[Point][Prompt])9 `: L5 m0 h1 P
其中point…………………输入一个点,或选择一个点2 K- m: x- j( Z( z' V
prompt…………………将显示在屏幕上的提示
1 j" H) h3 P" V) l, g 示例:
6 s9 F% k8 t4 _7 j (setq Pt1(getpoint))/ y. ~. R, u4 x( x! Q% f
(setq Pt1(getPoint“Enter starting Point》) ^) k# W! j- U1 Y% I
注意 不能输入其他的AutoLISP例程名来响应getpoint函数。二维或三维的点应考虑定义在当前用户坐标系统(UCS)下。1 I/ |- ?4 E8 N
4.Command函数2 R/ a0 |' F/ C1 H+ P) J
Command函数用于在AutoLISP程序内部执行标准的AutoCAD命令。AutoCAD命令名及命令选项必须置于双引号内。Command函数的格式为:
! F. ^# _' k, j/ p9 Z (Command “Commandname”)% Z! w) I, j1 x% W3 M- p
其中Command…………………AutoLISP函数4 S. C: |' a0 |
Commandname……………AutoCAD命令. n# m* Q7 Y8 Q# q% H
示例:
- r4 A$ y. Q7 f* s# @* |7 S+ T(Command“line” Pt1 Pt2“”)
+ S( N9 F ]: w“line” ……………AutoCAD LINE命令
: M9 n4 N/ O5 t8 `) K) X2 NPt1……………………第一点$ C2 R/ D5 j: r$ L/ A- o$ l
Pt2……………………第二点' _5 w1 A2 k8 q9 d j4 A
“”…………………用于返回# b3 g9 k7 [8 l1 l7 B
注意 在AutoCAD R12之前的版本中,不能使用Command函数执行AutoCAD的PLOT命令。 例如,(Command“plot”…)是无效表达式。在AutoCAD 2000、 R14 和R13中,才可以通过Command函数使用plot命令(Command“plot”…)。
2 r% s9 C* o' s5 w& U, \Command函数不能使用 AutoCAD的DTEXT或TEXT命令输入数据。( 可以用Command函数发出DTEXT及TEXT命令,还可以输入文本高度及旋转角度,但却不能在DTEXT或TEXT命令提示文本输入时输入文本)。7 G# Q( b }1 l- Z k( {
不能通过Command函数使用 AutoLISP的输入函数。这些输入函数为 getpoint、getangle、getstring及getint。例如,(Command“getPoint…)和(Command“getangle…)均为无效函数。如果程序中包含这样的函数,在其被装入时就会显示一条错误信息。
$ v1 D' X3 v8 h( ~- q例1 编写一个程序,该程序将提示用户选择三角形的三个顶点,并通过它们绘出如图12.1所示的三角形。4 z! q: X' i$ R% Z) j9 S
多数程序都包含三个基本组成部分,即输入、输出及处理过程。其中处理过程的功能为根据给定的输入来产生预期的输出(见图12-2)。
; b& o: F5 ] B$ d) o# C3 S 编写程序前,必须确认这三部分。
t' O. ?/ b; t A) }3 @ 本例中,程序的输入为三个点的坐标,期望的输出为一个三角形。用以生成该三角形的处理过程为:由P1到P2、由P2到P3、到P3到P1各画一条直线。弄清这三部分就会使编程过程更清晰。
+ g7 O$ ^0 o- G2 j1 s* _ J/ l 处理过程对于程序的成功起着很重要的作用。有时它很简单,有时却包含复杂的计算。如果程序包含大量运算,就应该把它分成若干个程序(甚至是子程序),并按逻辑的顺序和系统的顺序安排好它们。同时请记住,程序需要随时修改,也很有可能被其他程序员修改。因此,应尽可能使程序清晰、明了,以便其他程序员了解程序在其执行过程中的不同阶段在做些什么。如果可能,请给出草图,并且说明要点。
. q# S! P1 e! `- Y; [1 R4 I) K+ I& z8 t 输入 输出
' }5 u. q A: ?, Q P1点的位置
4 |5 A/ x3 q p4 p( X P2点的位置 三角形P1,P2,P3$ W9 A! T# `) `, M
P3点的位置
& s: R) S+ F( O- y' p* {8 j+ g8 ? 处理过程6 X N' H4 `/ x3 Z
从P1到P2画线
# O: v$ G; C2 U; I 从P2到P3画线9 ?1 S7 d- ?, }3 I5 k2 P
从P3到P1画线6 T3 c! j2 q+ R3 X1 m; ?8 C9 o/ N
下面的文件是例1的AuotLISP程序清单。右边的行号只为方便引用,并不是程序的一部分。
+ [- I3 i7 b4 F) |6 S+ @& i;this program will prompt you to enter three points 1) k( l+ a' F# @7 H l" i3 B
;of a triangle from the keyboard ,or select three points 2
' F `1 {7 U ^% F& f5 y;by using the screen cursor .P1,P2,P3 are triangle corners. 37 _! }: F; c/ W: o4 t
4 Q6 C7 ~- Y, F9 a: E/ O
(defun: C:triang1() 5
+ }* |+ t% i# b& e (setq P1(getPoint“\n Enter first Point of triangle:”)) 6
3 u7 W5 z% [* S# _+ v1 i (setq P2(getPoint“\n Enter second Point of triangle:” 7
D0 I: O: u9 b6 j, J3 \0 q (setq P3(getPoint“\n Enter third Point of triangle:”)) 8
( W' A& s4 R! D/ `: Y$ z2 z) h4 W (Command“line” P1 P2 P3“C”) 9
0 c+ ?' K+ c1 W- Q% V. w) 10
9 @6 D1 M7 \- N: y1 f) R" s7 s5 Z+ r说明
( P, c6 `( G9 a" i6 V" p) Z第1-3行
/ } g! j/ y/ s, B6 t4 j前三行为注释行,用于描述程序中的函数。这几行很重要因为有它们,编辑程序会变得简单一些。可以在任何必要的时候使用注释。所有的注释行都必须以分号(;)开头,当程序装入时这些行会被忽略。: X, F% P# ]' k- M& l
第4行:行为空行,用于分隔程序与注释部分。空行还可以用来分隔程序的不同模块。这样便于区分程序的不同部分。空行对程序没有影响。/ n6 _4 |4 e ]9 `, }, z7 E2 a
第5行:(defun C: triang1()
+ d; t( ^; o2 l2 S$ h7 v, R本行中,defun为一个AutoLISP函数,它定义了函数TRIANG1。TRIANG1为该函数的函数名。由于此函数名前带有C:,因此该函数可以像AutoCAD命令一样被执行。若没有C:, TRIANG1命令只能置于圆括号中执行(TRIANG1)。此函数带有三个全局变量( P1,P2,P3)。第一次编写AutoLISP程序时,保持变量为全局变量是个好习惯。这是因为装入并运行程序后,可以通过在AutoCAD命令提示行中输人感叹号(!)并在其后输入变量名来检查变量的值(Command:!P1)。一旦程序通过测试并运行正常,就应该使它们成为局部变量(defun c:TRIANG1(/P1 P2 P3)' ]: h- b7 J4 r" {; Q0 P2 [
第6行:(setq P1(getpoint“\n Enter first Point of triangle:”))" U5 ]. @7 X' O+ d" W, T$ @- f5 g* T
本行中,getpoint函数暂停程序的运行,允许用户输入三角形的第一个点。提示信息Enter first Point of triangle显示在屏幕的提示区内。可以通过键盘输入该点的坐标,也可以用屏幕光标选择该点。随后setq函数将这些坐标赋予变量P1。\n的作用是回车,其后的表达式将被打印在下一行上(“n”代表“newline”)
+ U1 @- p% f4 |' S \9 e# D第7行和第8行:(setq P2(getpoint“\n Enter second Point of triangle:”))及(setq P3(getpoint“\n Enter third Point of triangle:”))! |4 R/ u" s; B. u% h9 [, d# [
这两行提示用户输入三角形的第二个顶点和第三个顶点,随后把这些坐标赋予P2和P3。\n的作用是回车,因此输入提示显示在下一行中。2 d* d3 ?" A" s1 w+ l# f! E
第9行:(Command“line” P1 P2 P3“C”), f+ v7 ^" u3 ?# V. R) T+ P8 m8 {
本行中,Command函数用来输入AutoCAD的line命令,然后从P1到P2,P2到P3各画一条直线。“C”(表示“close”选项)把最后一点P3与第一点P1连接起来。所有的AutoCAD命令及选项在AutoLISP程序中使用时都必须置于双引号内。变量P1、P2. P3之间用空格分隔。
! Q. d% t6 q6 q f8 n' Z第10行, H: z, Z5 P' z2 @- a) q" z6 ~4 o
本行仅包含一个用于表明函数TRIANG1定义完成的右括号。该括号也可以写在上一行中。把它单独放在一行是一个好习惯,因为这样做任何程序员都可以很容易的确定定义已结束。然而某些程序中,同一程序内的多个定义及模块需要明确区分开。括号及空行有助于明确定义或程序段的起始和结束。 |