autolisp语言_第1页
autolisp语言_第2页
autolisp语言_第3页
autolisp语言_第4页
autolisp语言_第5页
已阅读5页,还剩148页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AutoLISP语言,LISP(List Processing,表处理解释语言)诞生于20世纪50年代末期,是人工智能学科领域广泛应用的程序设计语言。 AutoLISP语言是Autodesk公司为用户提供的在AutoCAD平台上进行二次开发的早期语言。 AutoLISP不仅具备一般高级基本结构与功能,而且还具有强大的图形处理功能。由于AutoLISP易于掌握,因此,是AutoCAD用户使用较为广泛的编程语言之一 Visual LISP,对AutoLISP是一次重大改进,增强了AutoCAD的二次开发能力。可使用户方便地用AutoLISP语言进行程序开发中的编写程序代码、调试程序等操作。,Aut

2、oLISP数据类型,1.整型数 2.实型数 3.字符串 4.符号(或变量) 5.表 6.文件描述符 7.AutoCAD选择集 8.AutoCAD图元名,1.整型数(INT) 整型数是由0,1,2,9,+或-这12个字符组成的数字。 例如:+230、450、-180等均为整型数。AutoLISP的整型数是16位,其取值范围为: -32768+32767。,2.实型数(REAL) 实型数是带有小数点的数,它以双精度浮点数格式保存,提供了至少14位的精度。实型数既可以用十进制方法表示,也可以用科学计数法表示。例如:13.2、0.045、4.5e-2均为有效的AutoLISP实型数。,3.字符串(ST

3、R) 字符串是由一对双引号(”)括起来的字符序列。通常又把构成字符串的双引号对称为字符串界定符。 AutoLISP对字符串有如下约定: 字符串中,同一字母的大小写认为是不同的字体,空格也是一个有意义的字符。 字符串的长度指位于双引号之间的字符个数(不包括双引号对)。 如果在字符串的定界符之间无任何字符,称其为空串,它的长度为零。,字符串中可以包含ASCII码中任一字符,通用的表示形式为“nnn”,其中nnn为八进制形式的ASCII码。例如“101102103”表示”ABC”,二者的作用完全相同。 由于反斜杠“”已作为字符串中的前导转义符,因而当字符串中要使用反斜线时,必须加转义符,即用双反斜线

4、“”表示字符串中一个反斜线“”。,字符代码表,4.符号(或变量)(SYS) AutoLISP用符号存储数据,因此,符号又称为变量。 符号名与大小写没关系,它可以是除下列6个字符之外的其他可打印字母和符号的组合: (左括号) )(右括号) (句号) (撇号) (双引号) ;(分号) 符号名的第一个字符一般采用字母或下划线。,5.表(LIST) AutoLISP的表指包含在一对相匹配的左、右圆括号之间的相关数据的集合。表中的每一项称为表的元素,这些元素可以是整型数、实型数、字符串、符号,也可以是另一个表,且各元素间要用空格隔开。表提供了保存各种数据的有效方法。,6.文件描述符(FILE) 当Aut

5、oLISP打开一个文件时,系统将给该文件赋一个数字标号,当AutoLISP函数访问该文件时(如读文件或写该文件),应通过该文件的描述符对此文件进行操作。 (SETQ fp (open “c:/cadtest.txt” “r”)),7.AutoCAD选择集(Selection Sets ) 选择集是一个或多个对象的集合。类似于AutoCAD中的对象选择过程。在AutoLISP程序中,用AutoLISP函数可以构造选择集,并把它赋给一个符号,以供其他函数使用。,8.AutoCAD图元名(Entity Names ) 图元名是AutoCAD系统在绘图过程中赋予所绘对象的一个数字标号。确切地说,它是指

6、向一个AutoCAD系统内部数据文件的指针。利用图元名,AutoLISP可以查找到图形对象的数据库记录,并对其进行各种方式的处理。,AutoLISP基本函数,循环函数 文件处理函数 关系运算函数 逻辑运算函数 图形处理函数 赋值函数 defun自定义函数 command函数,计算函数 表处理函数 交互输入 输出函数 字符串处理函数 转换运算函数 条件分支函数,计算函数,(+ ) 返回所有的和。其中, 可以是整型数,也可以是实型数。 (- )返回第一个与后面所有数的差。 (* ) 返回所有的乘积。 (/ )返回除以后的商。 (1+ ) 返回加1后的值。 (注意:1与+号之间不能有空格) (1-

7、) 返回减1后的值。 (注意:1与-号之间不能有空格) (abs ) 返回的绝对值。 (sin ) 返回的正弦值,单位为弧度,(cos ) 返回的余弦值,单位为弧度 (atan ) 如果没有,返回的反正切,单位为弧度,范围从。如果有 ,返回/后的反正切。 (max )返回中的最大值。 (min )返回中的最小值。 (exp ) 返回e的次幂的值。 (expt )返回的次方的值。 (log ) 是exp函数的反函数。返回值为的自然对数值,其数据类型为实型数。,表处理函数,(car ) 返回中的第一个元素。如果是 空的,返回nil。 (cdr ) 返回除中第一个元素以外的所有元素组成的表。 (la

8、st ) 返回中顶层的最后一个元素。 (nth ) 返回中的第n个元素,其中是返回元素的序号(第一个元素的序号为0)。如果n大于的最高元素序号,返回nil。 (list ) 将任意数量的表达式串联在一起,返回他们组成的表。 (cons ) 将加到的开头,返回得到的新表。 (reverse ) 返回将中元素倒排后得到的表。 (length) 返回表的长度,交互输入函数,(getint) 从命令窗口根据输入一个整型数。以整型数形式返回输入数。 (getreal) 从命令窗口根据输入一个整型或实型数。以实型数形式返回输入数 。 (getstring) 从命令窗口根据输入一个字符串。返回该字符串 。

9、(getpoint) 从命令窗口根据输入一个点的坐标,或从屏幕上拾取一点。返回该点坐标 。 (getcorner)根据及已有角点确定矩形窗口的另一角点,可以从命令窗口输入点的坐标,也可以在屏幕上拾取。返回另一角点的坐标 。 (getangle ) 从命令窗口根据输入角度值,或基于在屏幕上拾取的点决定角度值。返回该角度值。,补充,取得xyz分量 Getpoint和getcorner函数返回坐标,是一个有三个实数组成的序列(x y z)。若要取得其中xyz坐标的分量,可以使用car、cadr、caddr函数,其语法格式为: (car list) (cadr list) (caddr list),还

10、可以自组坐标序列,(setq p1 (list x y z),输出函数,(print ) 该函数换行输出表达式的值,并返回该值 (prin1 ) 该函数不换行输出表达式的值,并返回该值 (write-line ) 该函数输出字符串,并返回带双引号的字符串,字符串处理函数,(strcat ) 将、按顺序连结成一个新字符串,返回该新字符串。 (substr ) 将从位置截取长为值的字符串,返回字符串。 (strcase )根据将全部转换成大写或小写,返回转换后的字符串。为任意表达式,若省略或其值为nil,字符串各字符全部转换成大写,若值为非nil,字符串各字符全部转换成小写。 (strlen )

11、求字符号串中的字符个数(包括空格), 返回数值。,转换运算函数,(itoa ) 将整型数转换为由该整型数构成的字符串,返回字符串。 (atoi ) 将字符串转换为整数,返回整型数 (atof )将字符串转换为实型数,返回实型数 (fix ) 将转换为整型数,返回该整型数。如果为实型数,舍去小数部分。 (float ) 将转换为实型数。 (ascii ) 将字符串中的第一个字符转换成ASCII码,返回该ASCII码的整型数值。 (chr ) 将代表ASCII码的整型数转换成只有一个字符的字符串,返回该字符串。,条件分支函数,(if) 根据条件计算表达式。如果不为nil,计算,并返回计算结果;否则

12、计算 ,返回计算结果。 (cond ( ) ( ) (T )从上往下判断,一旦发现条件满足,计算与该条件对应的表达式并返回计算结果,不再继续判断条件。,循环函数,(while ) 如果成立,执行各,执行后再判断是否成立。如果成立,继续执行各,如此循环反复,直到条件不成立,并返回最后得到的计算结果。 (repeat ) 重复计算,计算次数由确定,返回最后的计算结果。,文件处理函数,(open ) 打开一个文件,以供其他AutoLISP I/O函数访问。为字符串,由文件名和扩展名组成,可以包含目录,用“/”来表示目录路径。 (close )关闭打开的文件,并返回nil。例如,(close a)a为

13、一个文件描述符)。用open函数打开文件后,应及时将其关闭,以免数据丢失。,(read-line )该函数从打开的文件中的当前指针位置处读入一行字符,并返回由这些字符构成的字符串,然后把文件指针移到下一行的首部。 (write-line )该函数将字符串写入打开的文件中,并返回一个字符串。,关系运算函数,(= ) 如果所有在数值上相等,返回T,否则返回nil。 (/= ) 如果所有在数值上均不相等,返回T,否则返回nil。 ( ) 第一个小于后面的原子,返回T,否则返回nil。 ( ) 第一个大于后面的原子,返回T,否则返回nil。 (= ) 第一个大于或等于第二个原子,返回T,否则返回nil

14、。 ( ) 第一个小于或等于第二个原子,返回T,否则返回nil。,逻辑运算函数,(and )返回所有的与逻辑:只要有一个的结果为nil,返回nil,否则返回T (or ) 返回所有的或逻辑:如果所有的结果为 nil,返回nil (not )返回的非逻辑:如果的结果为nil,返回T,否则返回nil,图形处理函数,(distance ) 返回两点之间的距离。 (polar ) 返回一个点的坐标,该点距 的距离为,与X轴正方向的夹角为,其中,角度的单位是弧度。 (angle)返回由、两点确定的直线与X轴正向的夹角。,赋值函数,赋值函数是AutoLISP程序中最常用的函数之一。较为常用的赋值函数是se

15、tq,其使用格式为: (setq 符号2 表达式2) 功能:依次将各表达式的值赋给对应的符号。 例(setq x 30 y 20 r 50),禁止求值函数,AutoLISP提供有值函数quote,其使用格式为: (quote),或简写为() 功能:不求值,返回本身。 quote函数的简写形式只能在程序中使用。 例(setq pt (20 30) r 50),SET SETQ QUOTE,实际上setq就是将set和quote函数合并使用,所以,要设定变量的值,可以使用下面三种写法: (setq b1 10) (set b1 10) (set (quote b1) 10) 如果要指定一个字符串序

16、列或者数值序列给变量,可以使用list或者quote函数 (setq p3 (list 150 203 380) (setq p4 (150 203 380) (setq p5 (quote(150 203 380),command函数,Command函数的调用格式如下: (command ) 为调用AutoCAD命令所需要的全部数据,它们的格式取决于AutoCAD命令时实际需要的数据。 Command命令有以下约定: (1)作为参数的AutoCAD命令,相应的选项均应以不含空格的字符串表示,大小写均可。 (2)调用line、pline、layer等命令时,最后以“”结尾 (两个双引号间不能加

17、空格),等效于在键盘上按一次空格键,以终止该命令的执行。 (3)用command命令可执行多条AutoCAD命令。,defun自定义函数,(1)有名函数自定义格式 defun ) 是所定义函数的名字,用作函数标识; 是该函数的变量列表; 用于函数执行时的计算,是函数的主体部分,俗称函数体。,分为形参和局部变量两部分。 有如下四种情况: (/ ) 各参数用空格分开,“/”前后必须有空格。形参是在调用该函数时由“实参”传递的参数,局部变量是本函数中使用的符号。除“形参”和“局部变量”外,函数中出现的用作变量的符号都是全局变量。 ()只有形参。 (/ )只有局部变量。注意“/”后有空格。 ()或ni

18、l无形参和局部变量,为空表,括号不能少或将括号改为nil。,AutoLISP语法规则,规则1:以括号组成表达式,左右括号“(”开头,它可以单独位于一行,也可以位于某一程序语句的后面。 编写AutoLISP程序时,应添加必要的注释,以说明程序的功能、编写时间、作者、某些程序代码的具体含义等信息,这些信息将有助于程序的编写与修改。,规则3:“前缀表示法”。 AutoLISP语言的结构与常用高级结构有所区别。像BASIC、PASCAL、C等语言均采用“中缀表示法”。当给变量a赋值12.0时,通常为下面的形式:a=12.0; 即赋值运算符“=”位于中间 AutoLISP则采用,即把运算符放在参数表的第

19、一个元素的位置,后面为其参数。 例如,通常用到的表达式X=(A+B)C在AutoLISP中表示为:(setq X (* (+ A B) C),规则4:运算顺序“由内而外、由左而右” 在AutoLISP表达式中,函数参数表对表达式的执行过程是从最内层表开始逐步到最外层表,每个表达式都会返回一个值,该值可以被变量或外层表达式引用。如果没被引用,返回值会显示在AutoCAD的命令窗口。,规则5:程序书写格式十分灵活。 在AutoLISP程序中,最简单的程序可以是只有一个表达式的程序。一个表达工可以分写在多行,也可以将多个表达式合写在一行。 在AutoLISP程序中,除注释外,其他所有成分均以表达式的

20、形式给出,而各表达式一般通过调用函数来执行。所以,执行AutoLISP程序就是执行一些函数,再调用其他函数,而AutoLISP程序的运行过程就是对函数求值的过程。,首要应掌握的简单基本函数,(+ ) (- ) (* ) (/ ) (1+ ) (1- ) (abs ) (sin ) (cos ),(= ) (/= ) () ( ),(and) (or) (not),(itoa ) (atoi ) (atof ) (fix ) (float),(itoa ) (atoi ) (atof ) (fix ) (float),(strcat ) (substr ) (strcase ) (strlen

21、),(polar) (angle) (osnap ,(car) (cdr) (last) (nth) (list),(while ) (repeat),(open) (close),(getint) (getreal) (getstring) (getpoint) (getcorner) (getangle),(if) (cond() (),建立第一个LISP程序,(defun c:plus32(/ ans) (setq ans (+ 3 2),加载与执行,自定义的函数调用与系统函数调用一样,通过一个标准表调用,第一个元素为用户自定义的函数名,其余为实参。其格式如下: (函数名 ) 函数定义与

22、调用时应注意的问题: 实参与形参在数量、类型和顺序上必须完全一致。 用defun定义的函数名不能与先前定义的函数名同名,特别不能与系统函数同名,否则将使原定义的函数或系统内部函数失效。 在defun的定义中不允许再出现defun,即defun不能嵌套,所有defun定义的函数在结构上是并行的。 允许函数定义中对函数本身调用,即允许递归调用。,Command :(load “plus32”) Plus32 5 加载程序用load函数 (load 文件名失败时的返回值) 文件名是一个字符串参数,指定要加载的文件名,可以包括磁盘符号和目录路径,目录分隔号可以用正斜线“/”或者双反斜线“”表示,扩展名

23、“.lsp”可写可不写。 例如(load “d:lispplus32”) (load “d:/lisp/plus32”),一个lisp程序内可以定义多个函数 (defun c:plus32(/ ans) (setq ans (+ 3 2) (defun c:sub32(/ ans) (setq ans (- 3 2) (defun c:multi32(/ ans) (setq ans (* 3 2) (defun c:div32(/ ans) (setq ans (/ 3 2) ),自定义函数,Autolisp提供了上百个函数,可以根据需要将其进行组合使用,建立适合用户的应用程序,可以通过de

24、fun定义这样一个函数。 (Defun 函数名称(参数群/局部变量) 程序主体 ),建立一个小程序用于计算平方 X2.lsp (defun x2(x) (* x x) ) X是一个参数,全局变量,如果想要计算结果保留下来,可以将上面这个程序改一下 (defun x2(x) (setq yy (* x x) ) 执行之后会出现yy这个全局变量,一直存在于内存之中。可以用!yy查询,局部变量,如果不想计算结果保留下来,可以申明局部变量 (defun x3(x/yy) (setq yy (* x x x) ) 执行之后会出现yy这个全局变量,一直存在于内存之中。可以用!yy查询,自定义AutoCAD

25、命令,Autolisp允许将自定义函数变成AutoCAD命令,方法很简单,只要在函数名前面加上C:即可 当在AutoCAD中调用由defun函数定义的函数时,应采用()格式。如果希望所定义的函数成为AutoCAD的一个命令,则应采用如下定义的格式: (defun c:() ) 请注意,这里的c:并不表示硬盘驱动器,而是函数名前缀,大小写等价。 (defun c:x3(/yy) (setq yy (* 3 3 3) 申明了参数的函数名称不可以用C:开头,否则当其像AutoCAD命令一样被调用时是无法进行参数的输入的。 如果真的有参数怎么办?,自定义一个绘制圆的函数,(defun c:My-cir

26、cle() (setq pt (list 100 100) ; 得到圆心坐标 (setq r 50) ; 得到半径 (command “circle” pt r) ; 绘制圆 ),关闭和显示CAD提示,(defun c:mycircle() (setq oce (getvar “cmdecho”);保存旧的CMDECHO值 (setvar “cmdecho” 0);关掉命令响应 (setq mycen (getpoint “n输入圆心位置:”) Myrad(getreal “输入半径:”) (command “circle” mycen myrad) (setvar “cmdecho” oce

27、);恢复旧的CMDECHO值 (princ) ) 如果cmdecho的值为1,则cad的会显示命令提示,例:绘制下图的长方形和圆。已知长方形的长和宽,圆的半径。要求圆在长方形内。,分析:绘制该图首先应有一个绘图基点pt_base。长方形的绘制可用line、pline和rectang命令绘制。 程序设计小技巧:将问题分散解决,逐步完善程序的功能。 本例中先编制绘制长方形和圆,将“要求圆在长方形内”条件及中心线绘制一个一个地解决,将问题分散解决。,(defun c:cr1(/ pt_base len width r pt1 pt2 pt3 pt_cen) (setq pt_base (getpoi

28、nt n请输入绘图基点:) len(getdist :n 请输入长方形的长度) width(getdist :n请输入长方形的宽度) r(getreal 请输入圆的半径) );setq,(setq pt1(polar pt_base 0 len) pt2(polar pt1 (/ pi 2) width) pt3(polar pt_base (/ pi 2) width) pt_cen(polar (polar pt_base 0 (/ len 2.0) (/ pi 2) (/ width 2.0);polar );setq (command line pt_base pt1 pt2 pt3

29、close circle pt_cen r);command (princ) );defun,程序设计的核心是算法设计,算法的特性之一是:健壮性,即程序的容错处理技术。 运行出错时显示如下,(defun c:cr1(/ pt_base len width r pt1 pt2 pt3 pt_cen) (setq pt_base (getpoint n请输入绘图基点:) len(getdist :n 请输入长方形的长度) width(getdist :n请输入长方形的宽度) r(getreal 请输入圆的半径) );setq (setq pt1(polar pt_base 0 len) pt2(p

30、olar pt1 (/ pi 2) width) pt3(polar pt_base (/ pi 2) width) pt_cen(polar (polar pt_base 0 (/ len 2.0) (/ pi 2) (/ width 2.0);polar );setq (setq str(strcat 圆的半径过大,应小于 (rtos (/ width 2) 2 2);setq (while (= r (/ width 2) (alert str) (setq r (getreal n请输入圆的半径:) );while (command line pt_base pt1 pt2 pt3 c

31、lose circle pt_cen r);command (princ) );defun,(defun c:r5() (setvar cmdecho 0) (setvar osmode 0) (setq pc (getpoint n输入图形中心: ) ra (getdist n输入大圆半径: ) rd (* pi -0.5) coun 1) ;程序主体 (command circle pc ra) (r5b pc ra coun rd) (command circle pc rm ) ;恢复环境 (setvar cmdecho 1) (setvar osmode 4337) (princ)

32、);结束defun,(defun r5b(pc ra coun rd) (setq p1 (polar pc (* pi 1.0) ra) p2 (polar pc (* pi 0.6) ra) p3 (polar pc (* pi 0.2) ra) p4 (polar pc (* pi 1.8) ra) p5 (polar pc (* pi 1.4) ra) (command pline p1 p2 p3 p4 p5 c) (command rotate last pc rd) (setq coun (1+ coun) ) (if (= coun 4) (progn (setq ra (*

33、ra ( / (sin(* pi 0.3) (sin(* pi 0.6) (setq rd (- rd (* pi 0.5) (setq rm ra) (r5b pc ra coun rd) );结束progn函数 );结束if函数 (setq rm (* rm (cos(* pi 0.1) );结束defun,1.4 选择与循环结构,1 . (if testexpr thenexpr elseexpr) 功能:根据对条件的判断结果,对两个表达式求值。 参数说明:testexpr 要判断的表达式。 thenexpr 如果 testexpr 不等于 nil 则执行该表达式。 elseexpr 如

34、果 testexpr 等于 nil 则执行该表达式。 返 回 值:if 函数返回选定表达式的值。如果未指定 elseexpr 且 testexpr 为 nil,则 if 返回 nil。 注意事项:当thenexpr、 elseexpr表达式需分行书写多个 表达时,务必配合progn函数连接成一个整体, 处理多个表达式。,2. (cond (test result .) .) 函数功能:多条件、多处理结果函数。 返 回 值:被执行的结果处理表达式中最后一个表达式的 值。如果子表中只有一个表达式(即 result 不 存在),则返回 test 的值。如果未指定参数, cond 返回 nil。,(c

35、ond ( ) ( ) (T ) );cond,文件名:ex7-1.lsp,例:计算,3.(while testexpr expr.) 函数功能:对测试表达式进行求值,如果它不是 nil,则 执行循环体中的表达式,重复这个过程,直 到测试表达式的求值结果为 nil。 while 函数在 testexpr 为 nil 之前不断运行。 参数说明:testexpr 包含测试条件的表达式。 expr 在 testexpr 为 nil 之前要求值的一个或 多个表达式。 返 回 值:最后的 expr 表达式最新的值。,例:求1+2+3+100的总和。,4(repeat int expr.),功能:对循环体

36、中的每一个表达式进行指定次数的求 值计算,并返回最后一个表达式的值。,参数说明:int 正整数。 expr 一个或多个原子或表达式。,返 回 值:最后一个计算的原子或表达式的值。如果 未提供 expr 参数,repeat 返回 nil。,例:求1+2+3+100的总和。,应用举例,趣味程序 绘制下图所示的趣味图形,以指定点为起点,绘指定长度的任意多条直线,每绘一条直线就自动变化一种颜色,且在360内画完所有直线。,该程序还存在不足,当输入直线条数255时则出错。运行时输入500,出错内容如下: 命令: color 输入默认对象颜色 真彩色(T)/配色系统(CO) : 256 颜色编号无效。 ;

37、 错误: 函数被取消 输入默认对象颜色 真彩色(T)/配色系统(CO) :,2. 绘制图框,; = ; 程序功能:绘制国家标准图框A0-A4, 带装订。根据企业实际使用进行简化。 ; 参数说明:tfdm-图幅代码,整型数,取值为0-4。 ; 使用方法:带参调用,如(tka 4),表示绘制A4图幅 ; 设计时间: 2003年7月30日 ; 设 计 者: 符纯华 ; = (defun tka(tfdm) (commandosnapnone);关闭“对象捕捉” (cond (= tfdm 0) (do_tk2 841 1189 25 10) ;带参调用自定义函数do_tk2绘图框 (= tfdm 1

38、) (do_tk2 594 841 25 10) (= tfdm 2) (do_tk2 420 594 25 10) (= tfdm 3) (do_tk2 297 420 25 5) (= tfdm 4) (do_tk2 297 210 25 5) (T (prompt 没有你选择的图幅!参数为04,谢谢!) );cond );defun,;= 自定义函数do_tk2绘图框 = (defun do_tk2(b l a c) (setq p00 (0.0 0.0) (command “Clayer”“细实线层” ;换层作图 line p00 (polar p00 0 l) (polar (pol

39、ar p00 0 l)(/ pi 2)b) (polar p00 (/ pi 2)b) c ); command (command Clayer粗实线层 pline (setq pp0 (polar (polar p00 0 a) (/ pi 2) c) ) (polar pp0 0 (- l a c) (polar (polar pp0 0 (- l a c) (/ pi 2) (- b c c) (polar pp0 (/ pi 2) (- b c c) c ) ; command (command zoom all) ) ;defun,1.5对象属性及相关表处理函数的使用,AutoCAD

40、的每一个对象都有其专属的属性列表,如对象的颜色、所在层、颜色、句柄等。,1(entsel msg) 函数功能:提示用户通过指定一个点来选择单个对象(图元)。 参数说明:msg 用于提示用户的字符串。如果省略该参数,则提 示信息为“选择对象”。 返 回 值:表,其中第一个元素是用户所选对象的图元名,第二个 元素是用户选择对象时指定的拾取点的坐标值(用当前 UCS 表示)。,1.5.1对象属性相关函数功能,2(entlast) 函数功能:返回图形中最后那个未删除的主对象(图元) 名称。 返 回 值:对象名称。如果当前图形中没有对象,则返回 nil。 3(entget ename applist)

41、函数功能:获得对象(图元)的定义数据。 参数说明:ename 要查询的图元的名称。ename 可以为图 形或非图形图元。 applist 注册应用名的列表。,返 回 值:包含了 ename 对象定义数据的关联表,这同 时适用于图形对象和非图形对象。如果指定 了可选参数 applist,entget 函数还会返回与这 些应用名相关的扩展数据。该关联表中的每一 项都被指定了一个 AutoCAD的 DXF组码,来 描述图元数据的各种性质。 4(entmod elist) 函数功能:修改对象(图元)的定义数据。 参数说明:elist 与 entget 函数返回表相同格式的表。 返 回 值:如果成功,则

42、 entmod 返回 elist。如果 entmod 不能修改指定图元,则函数返回 nil。,1(car list) 函数功能:返回表的第一个元素。 参数说明:list 表。 返 回 值:list 中的第一个元素。如果表为空则返回 nil。 2(cadr list) 函数功能:返回表的第二个元素。 参数说明:list 表。 返 回 值:list 中的第二个元素。如果表为空或表中仅有 一个元素则返回 nil。,1.5.2用对象属性时需要用到的表处理函数,3(caddr list) 函数功能:返回表的第三个元素。 参数说明:list 表。 返 回 值:list 中的第三个元素。如果表为空或元素个数

43、 少于三个则返回 nil。 4(assoc element alist) 函数功能:从关联表中搜索一个元素,如果找到则返回 该关联表条目。 参数说明:element 关联表中的关键元素。 alist 要搜索的关联表。 返 回 值:如果成功则返回找到的关联表条目,如果找不到则返回 nil。,5(cons new-first-element list-or-atom) 函数功能:向表的头部添加一个元素,或构造一个点对 参数说明:new-first-element 要添加到表开始的元素。该 元素可以为原子或表。 list-or-atom 表或原子。 返 回 值:返回值与 list-or-atom 的

44、数据类型有关。如果 list-or-atom 为表,则 cons 返回表,且将 new-first-element 作为返回表中的第一项。如 果 list-or-atom 为原子,则 cons 返回包含 new-first-element 和 list-or-atom 的点对。,6(subst newitem olditem lst) 函数功能:在表中搜索某旧项,并将表中出现的每一 个旧项用新项代替,然后返回修改后所得 的表。 参数说明:newitem 原子或表。 olditem 原子或表。 lst 表。 返 回 值:表。其中用 newitem 替换了所有出现的 olditem。如果 lst

45、中未找到 olditem,subst 返 回原来的 lst。,1.(list expr.) 函数功能:将任意数目的表达式组合成一个表 参数说明:expr AutoLISP 表达式。 返 回 值:表。如果未提供表达式,则 list 返回 nil。,1.5.3应用举例,在已绘制的圆内自动生成圆的内接正六边形。 分析:本例的关键在于必须先取得圆的圆心坐标及半径值。,对一个圆,其数据为: (-1 . ) (0 . CIRCLE) (330 . ) (5 . 2F) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle)

46、(10 150.756 211.288 0.0) (40 . 70.0) (210 0.0 0.0 1.0),对本例而言,只需要取得数据表中的半径和半径即可。因而其思路是从数据表中取得圆心组码表(10 圆心坐标)和半径组码表(40 半径值),然后得到圆心坐标和半径即可。,(-1 . ) (0 . CIRCLE) (330 . ) (5 . 87) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . 0) (100 . AcDbCircle) (10 516.022 719.338 0.0) (40 . 310.2) (210 0.0 0.0 1.0),

47、stm,( (745.131 931.464 0.0),stm_data,(entget (car stm),(cdr (assoc 10 stm_data),(cdr (assoc 40 stm_data),程序执行的流程解释,(entsel 请选择圆:),(car stm),2.对一个圆对象,要求输入新的半径后就能改变圆的大小。,对本例而言,只需要更改数据表中的半径即可。因而其思路是构造一个新的半径组码表即(40 新半径值)代替旧半径组码表(40 . 70.0)即可。,1.6选择集及相关表处理函数的使用,1.6.1选择集的相关函数功能说明,1(ssadd ename ss) 函数功能:将对

48、象(图元)加入到选择集中,或创建新的 选择集。 参数说明:ename 图元名称。 ss 选择集。 如果不带参数调用 ssadd 函数,它将创建 不含任何成员的选择集(空选择集)。如果调用 本函数时,仅提供图元名参数 ename,它将创建 一个仅含该图元的选择集。如果调用本函数时同 时提供了图元名参数和选择集 ss,ssadd 将把指 定图元加入到该选择集中。 返 回 值:新建或修改过的选择集。,2(ssdel ename ss) 函数功能:从选择集中撤消对象(图元) 参数说明:ename 图元名称。 ss 选择集。 返 回 值:选择集的名称,如果指定图元不在选择集中, 则返回 nil。 3(s

49、sget sel-method pt1 pt2 pt-list filter-list) 函数功能:根据选定对象创建选择集 参数说明: sel-method 字符串,指定对象选择方法。常用 的选择方法有: C 窗交。 CP 圈交(指定多段线内和与该多段线相交的 所有对象)。 L 添加到数据库的最后一个可见对象。 P 最后一个创建的选择集。 W 窗口选择。,WP 圈围(指定多边形内的所有对象)。 X 整个数据库。如果指定了 X 选择方法, 而又 没有提供 filter-list 参数,则 ssget 选择数据 库中的所有图元,包括关闭、 冻结图层中 的图元和可见屏幕外的图元。 pt1 与选择相关

50、的点。 pt2 与选择相关的点。 pt-list 点表。 Filte r-list 关联表,指定对象的特性。 与 filter-list 相匹配的对象将被添加到选择集。,如果省略所有参数,则 ssget 函数给出“选择对象”提示,允许用户交互式地构造选择集。 如果仅提供了一个点,而没有提供对象选择方法,AutoCAD 假定用户拾取单个点来选择对象。 返 回 值:如果成功则返回创建选择集的名称。如果没有 选定对象则返回 nil。 4(sslength ss) 函数功能:求出一个选择集中的对象(图元)数目,并 将其作为一个整数返回。 参数说明:ss 选择集。,5(ssname ss index)

51、函数功能:返回选择集中由序号指定的那个对象(图元) 的图元名。 参数说明:ss 选择集。 index 整数(或实数),指定选择集中的一个 元素。选择集中的第一个元素的序 号为零 (0)。要获得选择集中第32767 个以后的图元,必须提供实数形式的 index参数。 返 回 值:如果成功则返回图元名。如果 index 为负数或 大于选择集中的最大序号,ssname 返回 nil。,6(ssmemb ename ss) 函数功能:测试某对象(图元)是否是选择集的成员。 参数说明:ename 图元名称。 ss 选择集。 返 回 值:如果 ename 是 ss 的成员,ssmemb 返回图元名 称。如

52、果 ename 不是成员,ssmemb 返回 nil。,1.6.2用选择集时相关的表处理函数,1(tblnext table-name rewind) 函数功能:在符号表中查找下一项。 参数说明:table-name 字符串,指定符号表。有效的 table-name 值为 LAYER、LTYPE、VIEW、 STYLE、 BLOCK、 UCS、 APPID、DIMSTYLE和 VPORT。 该参数不区分大小写。 rewind 如果指定该参数且其值不为 nil,则回绕符号 表且检索其中的第一个条目。,返 回 值:如果找到了一个条目,函数就会以点对表的形 式返回该条目的 DXF 类型码和值。如果符

53、号表 中没有条目了,函数返回 nil。本函数永远不会 返回已被删除的条目。,2(tblobjname table-name symbol) 函数功能:返回指定符号表条目的图元名。 参数说明:table-name 字符串,指定要搜索的符号表。 该参数不区分大小写。 symbol 字符串,指定要搜索的符号。 返 回 值:如果找到,则返回符号表项的图元名。,3(tblsearch table-name symbol setnext) 函数功能:在指定的符号表中搜索符号名。 参数说明:table-name 字符串,表示要搜索的符号表。 该参数不区分大小写。 symbol 字符串,表示要搜索的符号表。

54、该参数不区分大小写。 setnext 如果指定该参数且其值不为 nil, tblnext 函数的条目计数器就会被调 整,这样随后调用 tblnext 函数时, 它就会返回由该 tblsearch 调用所返 回的那个条目之后的条目。否则, tblsearch 不影响 tblnext 检索的条目 的顺序。 返 回 值:如果 tblsearch 函数找到了符号名为指定符号名 的一个条目,它就会以与 tblnext 函数相同的格 式返回该条目。如果没有找到这样的条目,它返 回 nil。,1.6.3应用举例,1编一个程序,先判断当前图形文件中是否有下列图层存在?若不存在,则建立这些图层。,2编写一个程序

55、,要求完成如下功能:在所选的所有对象中将圆改为同一半径。 程序设计思路:先构造选择集,然后从选择集中逐个取出每一个对象判断是否是圆对象,是则更新圆的半径。 由于更新圆的半径程序前面已学,本例重点就是从选择集中逐个取出每一个对象并进行判断。,1.7 文件读写,1.1.1读写文件的函数功能说明,1(open filename mode) 函数功能:打开一个文件,供其他 AutoLISP I/O 函数访问。 参数说明:filename 字符串,指定要打开文件的名称和扩展名。 如果没有指定文件的全部路径,则 open 假 定其路径为 AutoCAD 启动目录。 mode 指明文件的状态为打开文件用于读

56、、写或追 加。字符串可以包含下列字符之一: r 打开用于读操作。 w 打开用于写操作。如果 filename 不存在, 则创建新文件并打开它。如果文件名存 在,则覆盖其现有数据。传给一个已打 开文件的数据,只有在用 close 函数关闭 文件后才会真正被写入文件中。,a 打开文件用于追加操作,如果 filename 不存在,则创建一个新文件并打开它; 如果 filename 存在,则打开该文件并把 文件指针移到现有数据的尾部,用户写 入文件的数据追加到现有数据的后面。 返 回 值:如果成功,open 返回一个可由其他 I/O 函数 使用的文件描述符。如果指定了模式“r”且 filename 不存在,则 open 返回 nil。,2(close file-desc) 函数功能:关闭一个已打开的文件。 参数说明:file-desc 在 open 函数打开文件时获得的文件描述符。 返 回 值:如果 file-desc 参数有效,close 函数返回 nil;否则它返 回一个错误信息。,3(read-char file-desc) 函数功能:从键盘输入缓冲区或打开文件中读入一个字 符,并将该字符转换成十进制的 ASCII 码值 后返回 参数说明:f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论