AutoLISP
更新时间:2023-12-05 15:01:01 阅读量: 教育文库 文档下载
第10章 AutoCAD二次开发
10.2.2 AutoLISP表达式
AutoLISP处理的对象是符号表达式(简称表达式),是LISP程序的基本单元。表达式相当于其他编程语言中程序的语句。
(1)表达式构成
表达式是包含函数关键字,并按AutoLISP语言规则书写的字符串。字符串中可以有数、串和符号。数或串的值是数或串本身,符号的值是赋给该符号的值。多数情况下,表达式以表的形式存在,其格式如下:
(函数名 【参数】?)
表达式由左括号开始,右括号结束,表达式可以嵌套,不伦嵌套几层,其左右括号必须是配对的。表达式形式的表中,左括号之后的第一个元素必须是函数名。
(2)表达式的表示
大多数程序语言的表达式采用中缀表示法,即运算符在操作数中间,如:x=y+z。AutoLISP采用前缀表示法,将函数名或运算符放在所有操作数之前,如:(setq x (+ y z)) (3)表达式返回值
在LISP语言中,函数之间不存在是否优先的关系,求值的先后顺序只能通过表的层次来实现。最里层的表最先被求值,把求值的结果返回给外层的表,直至求值完毕。
例如,表达式(setq x(* (+ a b) c)),先求出最内层a与b之和,然后求出a,b之和与c的积,将求得的积赋给x,最后返回x的值。
(4)错误信息
在表达式运行过程中,如果输入的右括号不配对,则会显示错误提示:输入的列表有缺陷。Vlisp环境下支持自动修正缺失的括号功能。 10.2.3 AutoLISP数据类型、变量
AutoLISP语言有着丰富的数据类型、灵活的变量定义。 (一)、数据类型
AutoLISP的数据类型丰富,除了具有一般程序设计语言的整型、实型、字符串等数据类型之外,还有表、文件描述符、AutoCAD选择集、AuroCAD图元名、VLA对象等数据类型。
(1)整型(INT)
整型即整数型。由0~9数字、+、-字符组成,不允许出现其他字符,“十”号可省略,如+110,321,-30均是合法的整型数据。在目前使用比较多的32位计算机上,AutoLISP的整型数据用32位表示,其取值范围为-2 147 483 648到+2 147 483 648。如果用户输人的数据超出此范围,AutoLLSP会自动将整型数据转换为实型数据,但对于两个有效整数进行运算所产生的结果超出此范围的情况,最后会得到无效的结果。 (2)实型(REAL)
实型数据又称为浮点数,AutoLISP中为双精度,即保证有14位的有效精度。实数有小数和科学计数两种表示形式: ·小数形式
例如:0.123,-2.345但需要注意的是,与其他语言不同,AutoLLSP中对于绝对值小于1的实数不能直接以小数点开头,必须在小数据点前加上0,否则计算机会误认为是点对而出错。例如不能将0.123简写为.123 ·科学计数法形式
即数字后有一个e或E,而后跟数的指数。如1. 23E3表示1.23×10,同样也可表示为0.123E4或12.3e2。但要注意e或E之前必须有数字,且指数必须为整数,如E3、1.23E2.5、e均不是合法的指数形式。 (3)字符串(STRING)
字符串又称为字符常数,它是由双引号括起来的字符序列。字符串中字母的大、小写和空格符都有特定意义。字符串中字符的个数称为字符串的长度,最大为132,如果超出,则后面的字符无效。任何字符都可以用“\\nnn”的格式表示,其中反斜杠“\\”是ASCII码的前导标识字符,nnn是该字符八进制的ASCII码。例如,字符串ABCD也可表示为
\\101\\102\\123\\104。一些常用的控制字符,像反斜杠、双引号,除了可以用“\\nnn”的格式表示之外,还可以用转义字符格式表示为“\\\\”、“\\\”等特殊字符,见表10-1。
表10-1 用前导“\\”符号表示控制字符的方法
3
控制字符 反斜杠“\\” 双引号“\” ESC键 换行 回车 Tab键 用转义字符表示 \\\\ \\\\\e \\n \\r \\t 用ASCII码表示 \\134 \\042 \\033 \\012 \\015 \\011 注意:其中的字符e,n,r,t必须小写;在Visual LISP中转义字符\\ r 不能作为回车符使用,文字会紧跟在最后一个打印文字后面显示,需要打印回车符时可用(CHR 13 )来代替。
(4)表(LIST)
表是放在一对圆括号中的一个元素或用空格分隔的多个元素的组合,表中的元素可以是函数,也可以是上述3种数据类型,甚至是另一个表,因而表提供了在一个符号中存储大量相关数值的有效方法。表是LISP语言处理的对象,是Visual LISP基本数据结构。例如,(+ 1 2 3),(sin(* 2.3 pi)), ((A B) C (D E)),(0 \,()都是合法的表。
表中元素的个数称为表的长度。例如,表(+ 1 2 3)的长度为4,表 (sin ( * 2.3 pi))的长度为2,表((A B) C D)的长度为3,表()的长度为0。
用表可以很方便地构造出复杂的数据结构。例如, (2.5 2.2 1.6)可以表示为X等于2.5,Y等于2.2 , Z等于1.6的三维点。 (5)文件描述符(FILE)
文件描述符是在打开一个文件时Visual LLSP赋予该文件的一个代码,用来作为该文件的标识号。当AutoLISP函数需要访问一个文件时(读文件或写文件),首先通过该文件描述符去识别并建立联系,然后再进行相应的读写操作。例如, (setq file (open \,用于打开当前目录下的文件“file. dat”,使它可被其他函数所用,同时将该文件描述符的数值赋予file变量。
(6)图元名(ENAME)
图元名又叫实体名,是AutoCAD为图形对象指定的十六进制的数字标识。AutoLISP通过该标识找到该图形对象在图形数据库中的位置,以便对其进行访问或编辑。例如,(setq ent (entlast)) 是把图形中最后一个实体的实体名赋予变量ent。 (7)选择集(PICKSET)
选择集是一个或多个实体对象的集合。可以通过AutoLISP程序建立选择集或向指定的选择集添加或移除图形对象,通过选择集可以对其内部指定的成员进行访问或编辑。例如, (setq ss (ssget \是选择与对角顶点为 (1,1), (10,10)矩形区域相交的图形对
象,并赋予变量ss。 (8)VLA对象
VLA对象是ActiveX应用程序的主要组成部分。不仅直线、圆弧、多义线和圆等称为VLA对象,图层、组、块、视图、视口、图形的模型空间、图纸空间、线型和尺寸标注样式等也称为VLA对象,甚至连AutoCAD应用程序本身也被认为是VLA对象。 (二)、LISP变量
同其他编程语言一样,LLSP也用变量来存储数据,但Visual LISP中的变量同其他高级语言相比,还是有着很大的不同。 (1)变量的命名
Visual LISP把任何数据都看成是被求值的数据,因而函数与变量的标识(即函数名、变量名)也会被当成数据,称为符号,可理解成是一种特殊的数据类型。它一般由字母、数字及其它除系统保留(表10-2)外的可打印字符组成,但不能仅由数字组成,也不能包含空格。
表10-2 系统保留字符
保留字符 左或右括号() . ' \; ? 用途 用于表的定义 点对标识符 quote函数的简写 字符串界定符 程序注释标识符 显示操作符 AutoLLSP中,变量名最长可达100个字符,但为了程序的易读性及节约内存,变量名的长度尽量不要超过6个字符。如果一个变量名的长度超过6个字符,那么变量名不能用节点来存储,而是在节点中会有一个指向另一个包含实际符号名的内存指针,这样就要占用额外的内存,而且符号名越长,代码的执行速度就越慢。在AutoLISP中,符号的大小写是等效的。
(2)变量的数据类型
数据类型是变量的重要特征,它关系到存放变量的存储空间大小。大多数计算机语言在为变量赋初值前,都会对变量的数据类型作一定说明。而AutoLISP无须对变量做事先的类型说明,变量被赋予值的类型即变量的数据类型。
在程序运行过程中,同一变量在不同的时刻可以被赋予不同类型的值,即在程序运行的过程中可以改变变量的数据类型。例如:
(setq x 1) ;给变量x赋值1,变量x为整型
(setq x “text”) ;给变量x赋值text,变量x为字符串型 (3)预定义变量
AutoLISP对变量nil、T、PI、PAUSE进行了预定义,供用户在编写程序时直接使用。没有指定值的变量称为nil变量。nil与空字符串及0不同,nil既不是字符串,也不是一个整数0,它表示尚无定义。另外,nil作为逻辑变量的值,表示不成立,相当于false。每一个变量都占用一小部分内存,如果将某一变量赋值为nil,则相当于是取消该变量的定义,并释放该变量所占用的内存空间。T、PI及PAUSE均为常量。T为逻辑变量的值,表示成立,相当于true;PI表示一个实数型常量;PAUSE表示一个双反斜杠(\\\\)字符构成的字符串常量,常与Command函数配合使用,用于暂停,等候用户输入。
(4)变量的值域
AutoLISP所使用的变量也分为局部变量和全局变量。 局部变量是指用户在某一个函数中定义的变量,它在函数执行过程中值被保存,函数执行结束,变量则自动消失。局部变量由函数defun来定义。
全局变量是用setq函数定义的变量,它的值永久被保存,直到用户退出程序为止。
10.1 AutoLISP函数
AutoLISP提供功能齐全的各种函数。一般计算机语言所说的函数,AutoLISP同样称之为函数,一般计算机语言里的子程序、过程、运算符、程序流程控制的关键字,在AutoLISP里仍然被称之为函数。
AutoLISP将函数分为内部和外部函数。AutoLISP提供的或用AutoLISP定义的函数为内部函数,用ADS、ADSRX或ARX定义的函数为外部函数。在此,我们主要介绍常用的几种内部函数,其它函数参考附录。 10.3.1 赋值函数
AutoLISP系统提供了以下函数供用户来为变量赋值。 (1) setq函数
(setq sym1 expr1 sym2 expr2 sym3 expr3?) 返回值为最后一个变量的赋值。
例如: (setq n \此式将使x的值为1, y的值为2,n的值为ABC,并最后返回结果2。如果该表达式还有外层表达式,则该表达式返回的结果可参与运算。例如:(+1 (setq n \此式不仅进行上述赋值过程,还将(setq n \2)返回的结果2参与加法运算,得到结果为3。
(2) Set函数 (set sym expr)
函数返回值为变量的值。Set函数与setq函数类似,但set把其参数中sym与expr均当做表达式来看待,分别进行求值运算后再进行赋值操作,而setq则仅对参数expr进行表达式求值操作,将参数sym当做符号来赋值,并且set仅处理两个参数。例如,对符号“ABC”进行赋值操作:
(set ‘ abc 123) ;返回值为123
但不能如调用setq函数一样(set ABC 123)对abc求值,因为ABC在此仅是还未定义的符号。利用此性质,可将sym参数用一个表达式来描述,而setq函数这样则不行,如:
(set (read \返回值为123 (setq (read \显示出错信息 (3) quote函数
作用是禁止对表达式求值,而将表达式本身作为返回值返回,调用的格式为: (quote expr)
此函数使用频率较高,在程序中需要关注表达式本身而非表达式的求值结果时,需用此函数。AutoLISP提供此函数的简记符为“‘ ”,上述调用格式等效于’ (表达式)。例如:
(quote (* a 24)) ;返回值为“(* a 24)” ‘ (* a 24) ;返回值为“(* a 24)” (4) eval函数 (eval expr)
作用是求表达式的值,与quote函数的作用相反。
此函数运行时,先对expr参数进行首次求值,然后再对求值结果进行二次求值,并
将这第二次的求值结果作为函数的返回值。例如:
(eval (quote (+ 1.1 8))) ;返回值为9.1
表达式(quote(+ 1.1 8))的值为“(+1.1 8)\函数再对此进行求值得9.1,然后将此结果返回。 10.3.2 数据类型转换函数
AutoLISP中有各种数据类型,但对于程序设计来说,一般是在整数、实数和字符串这3种数据类型之间进行转换。AutoLISP提供函数来实现这3种数据类型之间的转换。不同数据类型之间进行转换的功能函数对应关系如表10-3所示。
表10-3 数据类型转换函数
整型(int) 实型(float) 字符串(string) 整型(int) \\ fix atoi 实型(float) 字符串(string) float itoa \\ angtos atof \\
上述函数的调用格式均为:
(函数名 变量)
例如将实型转化为整型的函数fix,该函数的参数可以是整型或实型,返回值为整型,但此函数的取整过程是舍掉小数部分,而非四舍五入,例:
(fix 3.6) ;返回值3 还有一类类型转换函数,不仅进行数据类型的转换,而且还有格式化的功能,即将整型、实型数值以及距离、角度等数值类型按照一定的格式转换成字符串。
(1) 整型或实型格式化函数rots
该函数把整数或实数按照指定的模式和精度将数值转换成字符串,调用格式为: (rtos number 【mode 【precision】】)
其中,参数number可以为整型或实型常数、变量或表达式;中括号为可选;参数mode为线性单位的格式编码,与AutoCAD的线性格式相对应,具体对应关系如表10-4所示。
表10-4 格式码与线性单位格式
rtos中的格式码 1 2 3 4 5 线性单位格式 科学计数 小数 工程(英尺+十进制英寸) 建筑(英尺+分数英寸) 分数
如果调用该函数时没有指定该参数值,则将采用系统变量lunits指定的当前线性单位格式。参数precision用来指定数值的显示精度,对于前3种格式,该参数用来指定小数点后的小数位数。对于后两种格式,用来设定最小分数的分母。如果调用时函数没有指定该参数值,则采用系统变量Luprec设定的当前精度值。
(2) 距离格式化函数distof
该函数实现同rtos函数相反的功能,即把表示距离的字符串按照指定的格式转换成实数,调用格式为:
(distof string【mode】) 其中,参数string必须是根据参数mode指定距离测量格式能正确解释的字符串;参数mode的用法同函数rtos中参数mode的用法,且设定的格式码与线性单位格式的对应关系
如表10-4所示。例如: (distof"1’ -1.25\\""3),返回值为13.25。
(3) 角度格式化函数angtos (angtos angle【mode 【precision】】)
该函数把以弧度为单位的角度按照指定的角度格式及精度转换成字符串,角度值的大小在【0,2π】之间。其中参数angle可以是整型和实型常数、变量及表达式;参数mode为角度格式编码,与AutoCAD的角度格式相对应,具体对应关系如表10-5所示。
表10-5 角度格式码与角度格式 angtos中的格式码 0 1 2 3 4 角度格式 十进制 度/分/秒 百分度 弧度 勘测单位 示例 15.5000 15d30’ 00 10’ -4.50\5’ -4 1/4\15 1/2\
如果调用函数时没有指定该参数的值,则采用系统变量aunits指定的当前角度格式。参数precision用来指定转换后小数点之后的位数,如果调用函数时没有指定该参数的值,则采用系统变量auprec设定的当前精度值。例如:
(angtos 1.0472 0 4) ;返回值60.001 (angtos 1.0472 1 4) ;返回值60d0’ 1\\\(4) 角度格式化为弧度函数angtof (angtof string【mode】)
该函数实现同angtos函数相反的功能,即把表示角度的字符串按照指定的格式转换成以弧度为单位的实数。其中,参数string必须是根据参数mode指定角度格式能够正确解释的字符串,既可以与angtos函数返回结果的格式相同,也可以是AutoCAD允许的从键盘输入的角度格式。参数mode的用法同函数angtos中参数mode的用法,且设定的角度格式编码与角度格式的对应关系也如表10-5所示。如果调用函数时没有指定该参数的值,则采用系统变量aunits指定的当前角度格式。例如:
(angtof\返回值1.0472 (angtof\返回值1.0472 (angtof\返回值1.0472 (5) 单位换算函数cvunit (cvunit value from to)
该函数把一种单位格式转换成另一种单位格式,其中参数value为要换算的数值或二维表、三维表,但数值类型必须为整型或实型,且不能为空。参数from为原来使用的单位,to为返回值使用的单位,这两个单位必须在CAD单位定义文件ACAD.unt (安装根目录\\UserDataCache\\Support)中已经定义。而且,转换的两种单位必须为同一类型,否则函数的返回值为空。例如:
(cvunit 1 \返回值60.0 (cvunit 1 \返回值0.348 10.3.3 逻辑函数
逻辑函数用于将表达式中的一项或者多项参数进行逻辑运算,运算的结果为真或假,AutoIdSP系统提供如下一些最基本的逻辑操作函数。 (1) AND函数
(and 【expr1】 【expr2】 【expr3】?)
该函数用于表达式的“逻辑与”运算,在参数表中,参数可以是一个AutoLISP表达式,也可以是由一个或者多个AutoLISP表达式。在计算时,只要这些参数表的值有一个为空(nil) , AutoLLSP就停止求值并返回空(nil ),只有当参数表中的所有参数都不为空时返回真(T);如果不带参数调用该函数也返回真(T)。例如:
(setq x 1 y 2)
(and 1 x y) ;返回值T (and 1 x y z) ;返回值nil (2) OR函数
(or 【exprl】 【expr2】 【expr3】?)
该函数用于表达式的“逻辑或”运算,用法基本同AND。在计算时,只要这些参数中有一个值非空,则返回真(T),当这些参数均为空时,返回值为空(nil );如果调用该函数时未提供任何参数,则返回空(nil)。例如:
(or 1 x z) ;返回值T (or 1 ‘ ()) ;返回值T (or z ‘ ()) ;返回值nil (3) NOT函数 (not item)
该函数用于表达式的“逻辑非”运算,NOT函数的<参数>仅有一项,该<参数>可以是一个AutoLISP表达式或由一个AutoLISP表构成。 在计算时,只要该参数的值为空,就返回真(T),非空则返回空( nil)。如果调用时不带参数,则提示出错信息。例如:
(not z) ;返回值T (not ‘ (x y)) ;返回值nil (4) NULL函数 (NULL item)
该函数作用是测试某一项是否为空(nil ),同NOT函数的功能大体相同,Null与NOT函数的区别在于,NULL函数一般用于表,而NOT函数则用于其他数据类型和某些类型的控制函数。例如:
(null '()) ;返回值为T 10.3.4 关系函数
在进行条件判断时,不仅仅需要从各参数的逻辑值进行判断,还需要对参数值本身进行判断,AutoLISP系统提供如下一些最基本的关系运算函数:
(1) = 函数
(=numstr 【numstr】 【numstr】 ??)
该函数比较两个参数的值是否相等,其中,参数的类型为数值型(整型、实型)或字符串型,参数的个数可以是多个。 只有当所有参数值均相等时函数返回值为T,否则返回值为nil。如果仅提供一个参数,则函数返回T;如果不提供参数,则提示出错。例如:
(= 10 10) ;返回值T (=\返回值nil (2) /= 函数
(/=numstr 【numstr1】【numstr2】??) 该函数比较两个参数的值是否不相等,其中参数的类型为数值型(整型、实型)或字符串型,参数的个数可以是多个,但同=函数不同的是,/=函数依次比较相邻两个参数的值,如果没有两个相邻参数值相等则返回T,否则返回空(nil)。如果仅提供一个参数,函数返回T;不提供参数,则提示出错。例如:
(/=\返回值T (/=\返回值nil (3) < 及 <= 函数 (< numstr 【numstr1】【numstr2】??) < 函数比较参数之间是否存在小于关系,其中参数的类型为数值型(整型、实型)或字符串型,参数的个数可以是多个,但进行比较时,各参数的数据类型应一致,否则提示出错。该函数同/=函数一样,依次比较相邻两个参数的值,如果每个参数值都小于它右边的参数值,则函数返回T,否则返回nil。如果仅提供一个参数,函数返回T,不提供参数,则提示出错。例如:
(< 1 2 3) ;返回值T (< 1 3 2) ;返回值nil
<=函数的用法同<函数,只是<=进行的是小于等于判断。
注意:在进行两个字符串比较时,<函数(<=函数)依次比较字符串系列中对应位置的字符的ASCII值。如果在某一位置小于关系成立,则返回T,否则一直比较下去直至字符串结束,若结束时仍未成立,则返回nil。对于两字符串长度不等的情况,<函数在比较至短字符串结束时,则认为长字符串的值大于短字符串的值。
(4) > 及 >= 函数 (< numstr 【numstr1】【numstr2】??〕 >函数比较参数之间是否存在大于关系,该函数的用法同<函数一样,依次比较相邻两个参数的值。如果每个参数值都大于它右边的参数值,则函数返回T,否则返回nil。>=函数的用法同>函数,>=函数进行大于等于判断。
(5) eq函数 (eq expr1 expr2)
该函数判断两个表达式是否为同一对象,其中参数expr1为用于比较的表达式,expr2为与expr1进行比较的表达式。该函数仅能接受两个参数,过少或过多均会提示出错。如果两表达式为同一对象则返回T,否则返回nil。
(6)equal函数
(equal expr1 expr2 【fuzz】)
该函数判断两个表达式的值是否相同,前两个参数的意义同eq函数一样,参数fuzz为实数,用于定义expr1和expr2之间的最大允许误差。如果表达式相等(等于同一个数值)或者两者相差在参数fuzz的范围内时,认为二者相等,返回T,否则返回nil。如果不提供参数Fuzz,则系统默认误差值为0。例如:
(equal 10.1 10.2 0.1) ;返回值T (equal 10.1 10.2) ;返回值nil 10.3.5 几何求值函数
这一类函数用于对几何数据的计算,如两点之的距离等。 (1) 距离函数 (distance p1 p2)
该函数计算p1、p2两点之间的距离,点可以是二维或三维的。例如: (distance ? (1 2 3) ? (4 5 6)) ;返回5.19615 (2) 坐标函数 (polar p1 ang dist)
该函数根据一点坐标、与另一点连线的角度和两点间距离来求取第二点坐标。角度单位为弧度,是从X轴正方向开始度量,逆时针为正,顺时针为负。例如:
(polar '(1 2 3) 1 10) ;返回(6.40302 10.4147 3.0) (3) 方位角函数 (angle p1 p2)
该函数根据p1、p2两点连线与X轴正方向形成的角度,度量时以逆时针方向为正,单位为弧度。例如:
(angle ? (1 2 3) ? (4 5 6)) ;返回0.785398 (4) 交点函数
(inters p1 p2 p3 p4【方式】)
该函数计算两直线的交点坐标。p1、p2为一条线段的两个端点,p3、p4为另一条线段的两个端点。“方式”为可选项,分为T、nil。方式为T时,判断交点是否在线段上,如果是,则返回交点坐标,否则返回nil;方式为nil时,允许交点在线段延长线上,返回交点坐标。如果两条线段无交点,返回nil。 10.3.6 交互函数
这种函数用于提供交互操作,让用户输入所需要参数或将信息显示在屏幕上。 (1) 整型数据输入 (getint [提示])
该函数等待输入一个整型数,提示为字符串,用于提示用户输入数据。输入数据范围为整型数据值域。例如:
(setq num (getint "\\n 请输入一个数字:")) (2) 实型数据输入 (getreal [提示])
该函数等待输入一个实型数据,与getint函数类似。 (3) 点数据输入
(getpoint [参考点] [提示])
访函数等待输入一个点的坐标。参考点为可选项,如果给定参考点,系统从参考点到当前光标所在位置画一条可拖动的直线。例如:
(setq p (getpoint ' (1 1 1) \请输入点:\(4) 角度输入
(getangle [参考点][提示])
该函数等待输入角度,以度表示,返回弧度。参考点作用同getpoint函数,此时可通过输入点来确定角度。角度大小为输入点与参考点连线同X轴正方向的夹角大小,如果不输入参考点则以原点为参考点。例如:
(setq ang (getangle \请输入方向:\
(setq ang (getangle ?(1 2 3) \请输入方向:\(5) 距离输入
(getdist [参考点] [提示])
该函数等待用户输入距离。可直接输入距离,也可以输入一点,把参考点与输入点的距离作为输入值,函数返回距离值,数据类型为实型。例如:
(setq dist (getdist \请输入距离:\
(setq dist (getdist ?(1 2) \请输入点:\(6) 输入控制
(initget [位值][关键字])
该函数控制输入的参数格式或类型,是一个输入初始化函数,总是返回nil。位值说明如表10-6所示。
表10-6 位值控制说明 位值 1(位0) 2(位1) 4(位2) 8(位3) 16(位4) 32(位5) 64(位6) 128(位7) 控制说明 不允许输入空值 不接受零值 不接受负值 不检查屏幕限定范围允许交互输入 返回三维点 用虚线画拖动线 计算两点距离时忽略z坐标(只用于getdist函数) 在其它控制前提下,允许任意输入 例如:
(initget (+ 1 2 4))
在这里使用了1、2、4的组合,限制只能输入正整数,如果输入不对,系统为自动提示重新输入,此例等同于(initget 7),即以1、2、4的和值作为位值。
(7) 关键字输入 (getkword [提示])
该函数要求输入是个关键字并返回设定的关键字,使用前必须先用initget设定关键字的字符表。例如:
(initget 7 “Yes No Nil”)
(setq d (getkword “\\n请输入关键字:”))
当用户输入Y、N、Nil时,返回值分别为Yes、No和Nil。 (8) 字符串输入 (getstring [cr][提示])
该函数等待输入字符串,同时返回此字符串,字符串的长度不能超过32个字符。如果cr存在,允许输入的字符串中带有空格,终止字符串只能用Enter键。例如:
(setq str (getstring T \请输入您的名字:\提示:请输入您的名字: 输入:张 三 返回:“张 三” (9) PRINT函数 (print [expr])
该函数将expr表达式求值后,把结果显示在文本屏幕上(命令提示行)。输出前自动换行,输出表达式值,再输出一空格,如果expr为空,则只起到换行作用。例如:
(print (+ 1 2)) ;返回 3 3,前一3为输出打印,后一3是函数返回值 (10) PRIN1函数
该函数与print函数类似,只是在输出打印前不换行,输出后不输出空格。例如: (prin1 (+ 1 2)) ;返回33 (11) Princ函数
该函数与prin1函数类似,不同的是princ函数输出的字符不加引号,返回值加引号,且字符串中的控制字符有控制作用。例如:
(princ \返回AUTOCAD\(prin1 \返回\
(print \返回\
10.3.7 流程控制函数
在上面内容已经介绍过的关系函数可以在两个操作数之间建立逻辑关系,而逻辑函数又可对这种逻辑关系进行操作。而进行这些操作的目的就是对程序执行流程进行控制。这里主要使用条件函数甚至条件循环函数。
(1) if函数
(if test thenexpr 【elseexpr】)
if函数测试条件值,如果指定条件为真,则执行条件后的第一个表达式;如果条件为假,则执行条件后的第二个表达式。其中参数test可以是逻辑函数与关系函数的返回值,也可以是其他AutoLLSP表达式,如果该条件表达式的值不为nil,则执行thenexpr,否则执行elseexpr。如果未指定elseexpr且条件表达式的值为nil,则函数返回nil。例如:
;求两数中较大的值 (setq x 1 y 2)
(if ( (progn 【expr1】 【expr2】?) 该函数连续执行多条语句,progn函数依次执行各表达式的值,并返回最后一个表达式的结果,如果没有表达式,则该函数返回nil。由于if函数在条件为真(或为假)时只能执行一条语句,所以progn函数常与if函数联用,这样可执行多条语句。例如: (setq oldscal (getvar \取系统变量\的值为默认比例因子 (if (equal oldscal 0.0 0.1) ;如果系统变量的值为0.0(容许误差为0.1) (progn ;条件成立,则做如下设置 (setq oldscal 100.0) ;首次运行,设默认比例因子为100 (setvar \系统变量userr1存储默认比例因子 ) ) (3) cond函数 (cond【(test1 resut1?)】?) 该函数进行多条件下情况处理,cond函数参数由表构成,可以是任意数目。该函数按顺序对每一个表的第一项求值,直到其中有一个<条件>的值不是nil为止,然后函数接着对该项的后续表达式求值,并且返回最后一个表达式的值。如果子表中仅有<条件>而没有<表达式>,则返回<条件>的值。如果调用时没有指定参数,则返回nil。cond函数相当于case类型的函数。一般情况下,使用T作为默认情况下<条件>,然后处理表达式。例如: (setq 标准角度 (cond ((<=角度 15) 0) ((<=角度 37.5) 30) ((<=角度 52.5) 45) ((<=角度 67.5) 60) ) ) 利用cond函数的多条件处理功能,可以用相当简洁的代码来实现较为复杂的程序功能。 (4) while函数 (while testexpr exprl 【expr2】?) 该函数对条件表达式testexpr求值,如果该值非空,则执行循环体中的功能表达式expr1,然后再测试该表达式的值,如果非空则重复这个过程,直至条件表达式的值为nil。其中循环体部分的功能表达式数目不限,函数返回最后一个执行的表达式的值。如果仅有条件testexpr而没有功能表达式,则相当于循环体部分为一个空操作。如果调用时没有指定参数,则提示出错。例如: (setq loopm T) (while loopm (setvar \设置对象捕捉方式为全部 (initget \定义关键字 (setq pt (getpoint \输入标注点>:\ (setvar \) (5) repeat 函数 (repeat int 【expr1】 【expr2】?) 该函数对循环体中的表达式进行指定次数的求值运算,其中参数int为一整型数据,表示循环次数,如果该数据大于0,则依次执行循环体部分的功能表达式,并返回最后执行的表达式的值。如果没有表达式语句或循环体部分一次也未执行,则返回值nil。例如: ;计算1+2+3+?+10 (setq i 0 sum 0) (repeat 10 (setq i (+ i 1)) (setq sum (+ sum i))) ;返回值55 LISP提供的流程控制函数还有很多,如原子测试函数atom等等,在此不再赘述,请参考附录。 10.3.8 文件处理函数 文件处理函数主要用于文件的打开、关闭及读写等操作。 (1) 打开文件函数 (open filename mode) 该函数用于打开一个文件,返回文件描述符。filename为文件名,mode为打开方式,必须用小写字母表示。文件名和方式都是以字符串表示。 方式有“r”、“w”、“a”三种,分别表示读、写、添加文件。例如: (open “newfile.dat” “w”) ;用写文件方式打开newfile.dat文件,无此文件则新建。 (2) 关闭文件函数 (close fil) 该函数将指定的文件关闭并返回nil,fil为已经打开的文件描述符。 (3) 查找文件函数 (findfile filename) 函数搜索指定的文件,返回完整的文件名和路径。Filenmae为要搜索的文件名,文件必须在CAD设定的搜索路径内。 (4) 读字符函数 (read-char [fil]) 该函数从打开的文件中读取一个字符,返回该字符的ASCII码值。Fil为打开的文件描述符。 (5) 读行函数 (read-line [fil]) 该函数从打开文件中,一次读取一行,文件指针指向下一行。当读到文件终止符时,返回nil,否则返回所读入的字符串。 (6) 写字符函数 (write-char ascnum [fil]) 函数将字符显示在屏幕上或写入已打开的文件中,并返回该字符的ASCII码值。 (7) 写行函数 (write-line str [fil]) 该函数将字符串显示在屏幕上或写到已打开的文件中。 10.3.9 表处理函数 表处理函数用于对数据表进行提取、合并、添加等操作,适用于处理大量数据。 (1)CAR与CDR函数 (car list)和(car list) CAR函数用于提取list表中的第一个元素,CDR函数用于提取list表中除第一个元素以处的其他元素组成的表,表可以是简单的表,也可以嵌套,如果表为空,则两个函数都返回nil。例如: (car '(1 2 3 4)) ;返回1 (car '((1 2) 3 4)) ;返回(1 2) (cdr '(1 2 3 4)) ;返回(2 3 4) (cdr '((1 2) 3 4)) ;返回(3 4) 这两个函数还可以组合使用,组合层次可达4层,组合顺序是从右到左求值,形式为CXR、CXXR、CXXXR、CXXXXR,其中X为A或D。例如: (cadr '(1 2 3 4)) ;相当于(car (cdr'(1 2 3 4))),返回2 (caar '((1 2) 3 4)) ;相当于(car (car'((1 2) 3 4))),返回1 (caddr '(1 2 3 4)) ;相当于(car (cdr(cdr'(1 2 3 4)))),返回3 通常,car用来获取二维或三维坐标的X坐标,cadr用来获取Y坐标,caddr用来获取三维点的Z坐标。 (2)NTH函数 (nth num list) 该函数用于提取list表中序号为num的元素。Num为非负整数,0表示第一个元素,1表示第二个元素,依次类推。如果num大于list中最后一元素序号,返回nil。例如: (nth 2 '((1 2) 3 4)) ;返回4 (3)LAST函数 (last list) 该函数返回list表中最后一个元素,list不能为空表。例如: (last '(1 2 3 4)) ;返回4 (4)CONS函数 (cons expr1 expr2) 该函数将表达式expr1添加到表达式expr2的前面构成新表。例如: (cons '(a b) '(1 2 3 4)) ;返回((A B) 1 2 3 4) (5)LIST函数 (list expr1 expr2 ??) 该函数将所有expr1、expr2、??表达式按原位置构成新表,常用于生成二维或三维坐标点对。例如: (list 1 2 '(3 4)) ;返回(1 2 (3 4)) (6)APPEND函数 (append list1 list2??) 该函数将所有list1、list2、??表中元素按原位置构成新表。例如: (append '(1) '(2) '(3 4)) ;返回(1 2 3 4) (7)SUBST函数 (subst new old list) 该函数从list表中搜索old项,将old项用new项替换,构成新表返回。若搜索不到old项,则返回原表。例如: (subst '2 'a '(1 2 3 4 2 3)) ;返回(1 2 3 4 2 3) (subst 'a '2 '(1 2 3 4 2 3)) ;返回(1 A 3 4 A 3) (8)LENGTH函数 (length list) 该函数测量list表的长度,即表中元素个数。例如: (length '(1 2 3 4)) ;返回4 (length '((1 2) 3 4)) ;返回3 (9)REVERSE函数 (reverse list) 该函数将表中元素顺序颠倒,构成一新表,例如: (reverse '((1 2) 3 4)) ;返回(4 3 (1 2)) 10.3.10 实体操作函数 实体是CAD预先定义的图形,如点、直线、圆、文字等。表10-7为CAD中常用实体。 表10-7实体类型 实体类型名 实体意义 point 点 line 直线 pline 多段线 circle 圆 arc 圆弧 rectang 矩形 text 文字 insert 插入块 其中,实体名并不是实体的名称,而是指针。通过这个指针,可以找到实体在图形库中的记录。 (1) 实体选择函数SSGET 该函数有两种操作方法,一种为直接在屏幕上选择,类似于CAD中的选择集命令;另一种为过滤选择,通过对所有图形进行筛选,将符合条件的图形纳入选择集。 ①直接在屏幕上选定 (ssget [style] [p1] [p2]) 其中,style为方式,有“W”、“C”、“L”、“P”等,p1和p2为与选择方式有关的两个点表。如果所有参数都省掉,那么用户可以以交互方式来选择图形,即CAD中的选择集命令。例如: (ssget \ ;选择上一次已经选择的实体 (ssget \ ;选择最后绘制的图元 (ssget (1 2)) ;选择通过点(1 2)的所有实体 (ssget \ ;交叉选择窗口(1 2)~(3 4)内的实体 函数返回“Selection set:n”,n为选择集编号。 ②过滤选择 (ssget \ 该函数扫描整个图形数据库,将所有与list所指定的实体类型和特征相符的实体选定,构成选择集。函数返回“Selection set:n”,n为选择集编号。 List为一个过滤表(联接表),能够识别的实体组代码如表10-8所示。 表10-8 部分实体组编码 实体组代码 0 2 6 7 含义 实体类型 块名 线型名称 用作正文、属性和属性定义的字型名 实体组代码 8 38 39 62 含义 图层名 Z向高度 厚度 颜色 例如:(ssget \ ;选择当前图形中所有实体类型为直线的实体构成选择集。 (ssget \ ;选择GCD图层上所有实体类型为点的实体,构成选择集。 (2)选择集长度测量函数 (sslength selection) 该函数返回一个表示选择集selection中实体数目的整型数值。例如: (sslength (ssget \(3)实体名检索函数 (ssname selection num) 该函数从选择集selection中检索第num个元素所表示的实体名。序号num为0时,表示第一个元素,1表示第二个,依次类推。例如: (ssname (ssget \(4)获得最后一个实体名 (entlast) 获得图形数据库中最后一个没被删除的实体,返回实体名。 (5)获得实体定义数据 (entget entname) 从当前图形数据库中获取实体名为entname的实体定义数据。例如: (entget (entlast)) (6)删除或恢复实体函数 (entdel entname) 该函数删除当前图形数据库中实体各为entname的实体定义,如果该实体已经被删除,则恢复该实体的定义。 10.3.11 编程操作函数 此类函数主要是自定义函数命令及程序化绘图操作。 (1) 函数名自定义函数 (defun funcname varilist expr ??) 该函数定义一个函数名为“funcname”的新函数,函数中可以包含中变量表varilist和表达式expr,类似于其它编程语言中函数或过程的定义。如果函数名前加“C:”,则可在CAD命令行输出函数名执行此函数,相当于定义了一个函数命令。例如: (defun myfun (x y)) ;定义函数myfun,有两个参数 (defun myfun (/ x y)) ;定义函数myfun,有两个局部变量 (defun myfun (x / y)) ;定义函数myfun,有一个参数和一个局部变量 (defun myfun ( )) ;定义函数myfun,没有参数 (defun c:myfun ()) ;定义函数及命令myfun,没有参数 注意,变量表中可定义两种变量:形式变量(参数)与局部变量,两种变量用“/”加一空格来分开,前面为形式变量,后面为局部变量。 (2) 函数执行函数 (apply func list) 该函数用于执行已经存在的函数,函数的参数就是指定的表。例如: (apply 'strcat' (\ ;返回“strcat” (3) 命令调用函数 (command comm para??) 该函数用于在LISP语言内部执行CAD命令。例如: (Command \ 先执行circle命令,圆心为(5,5),然后暂停以便屏幕上拖曳圆的半径。当拾取了所要的点(或键入所要的半径值)后,继续执行,画一条从5,5到7,5的直线。最后的\相当于输入一个空格,常用于结束命令。 AutoLISP函数很多,在此由于篇幅限制,只能介绍了有限几种常用函数,其它功能函数详细信息请参考附录:AutoCAD二次开发所用的Autolisp函数或AutoLISP帮助文件,在此不在赘述。 10.2 AutoLISP程序设计 在学习了如何使用AutoLISP函数后,就可以充分利用这些函数来调用AutoCAD的内部命令和访问系统图形数据库,实现对CAD图形的操作。AutoLISP函数可以在CAD命令行直接执行完成一些简单操作,但这种操作只是临时性的,一旦退出AutoCAD软件,执行过的函数操作就全部消失。如果需要将这些操作存在起来,那就要建立一个程序文件,将用户编写的程序存在在文件中,这个文件就是AutoLISP程序。 10.4.1 AutoLISP程序的编写与调用 AutoLISP程序的设计与其它程序语言的使用是一样的,都要先进行流程设计,再进行代码编写,最后进行调试。 设计一个程序的一般步骤如下: ① 根据所需要完成的功能,分析现有条件; ② 确定数学模型和所用条件与变量; ③ 编写程序流程,即确定执行步骤,通常用框图或伪代码表示; ④ 编写代码。 由于前三步与其它程序语言一样,所以在此只介绍代码的编写。我们可以用文本文件来建立AutoLISP程序文件,扩展名为.lsp。由于AutoLISP语言是解释性语言,所以文件中所包含的信息和图形编辑状态下交互输入的信息完全相同。 (1) 程序编写 AutoLISP程序文件可以用文本编辑器直接进行编辑。由前面学习我们知道,程序代码其实就是大量表和表达式的嵌套组合。例如:建立一个LISP文件“设置随层.lsp”,用文本编辑器打开,输入以下代码。 (defun c:tobylayer() ;定义函数与命令tobylayer (command \ ;执行选择命令并暂停,等待选择图形 (command \\\\\\\\\\\ ;将颜色、线型、线宽设置为随层,线型比例1 (princ) ) 注意:程序中“;”后面内容为注释。 编写完程序要仔细检查,看里面是否有语法错误和相互对应的左右括号。 (2) 程序加载 AutoLISP程序的加载可以用load函数和appload命令实现。 用load函数需要知道文件所在位置的绝对路径,比如,刚才我们写的程序文件在c盘program目录下,则用下列表达式来执行加载: (load \设置随层.lsp\。如果加载成功,系统会返回函数名。 右用appload命令装入,则在CAD命令行键入:appload回车,弹出如图10.1对话框,将文件找到加载即可。 (3) 程序调用 程序文件加载后,文件定义的函数与命令就可以在当前绘图环境中运行和调用。调用方法:在命令行输入定义的命令:tobylayer回车即可。如果未定义命令,则用(函数名)来调用:(tobylayer)。 10.4.2 利用AutoLISP进行CAD二次开发 利用AutoLISP进行二次开发,有以下几种方式:修改或完善已有函数完成特定任务;增加新函数实现新的功能;访问图形数据库进行图形实体编辑;程序化画图等等。 (1) 完善或修改现有函数 利用AutoLISP进行系统开发时,常遇到用内部函数无法完成的任务,但对已有函数进行少量优化就可以实现,这样,我们就可以对某些函数进行完善或修改。例如: 对于polar函数,采用点、角、距方式来获取一个点的坐标,其中角度必须以弧度给出,这在实际应用中多有不便,那么我们可以对此函数进行修改,使角度以度的形式给出,函数名定义为pola。程序代码如下: (defun pola(pp dd ss / d) ;定义函数名、形参和局部变量 (setq d (* (/ dd 180) pi)) ;将输入的角度转换成弧度 (polar pp dd ss) ;调用polar函数求出点坐标 ) (2) 增加新函数 在进行CAD的二次开发中,我们常会反复画某些基本图形,那么,如果将这些基本图形绘制编写成函数,就可方便地绘制这些图形。例如:以指定中心点和外接圆半径方式绘制五角星的程序代码如下: (defun c:wjx() ;定义函数命令 (setq os (getvar \ ;提取当前捕捉的总值; (setvar \ ;关掉捕捉; (setq int (getpoint\请指定图形中心点:\ ;给定五角星的中心点; (setq value (getdist \请输入外接圆半径:\ ;输入五角星外接圆的半径值; (get_pt) ;调用点计算子程序; (command\ ;利用pline命令将五角星画出来; (setvar \ ;将捕捉模式复原; (prin1) ) (defun get_pt() ;子程序用来计算五角星的五个点的坐标; (setq p1 (polar int (* pi 0.5) value)) (setq p2 (polar int (- (* pi 1.5) (* pi 0.2)) value)) (setq p3 (polar int (* pi 0.1) value)) (setq p4 (polar int (- pi (* pi 0.1)) value)) (setq p5 (polar int (+ (* pi 1.5) (* pi 0.2)) value)) ) 有了这个程序,加载进绘图环境,则随时可画五角星图形。 (3)访问图形数据库进行实体编辑 编辑CAD系统图形数据库的方法有两种,一种是直接调用CAD系统的图形编辑命令,二是通过访问图形数据库,改变其中实体的数据,实现图形实体的编辑。 ① 调用CAD命令 AutoCAD系统有丰富的图形编辑命令,在绘制程序时,合理地利用这些内部命令,可以简化程序编制,提高效率。例如:在拾取点断开线、弧或多义线等,可以调用系统的break命令,程序代码如下: (defun c:mybreak () (setvar \ (setq osnap_mode (getvar \ (setvar \ (setq pt1 (getpoint \指定点断开对象:\ (command \ (setvar \ (setvar \ (princ) ) ② 改变实体数据 在编辑文本时,除了调用CAD内部命令外,还可以访问图形数据库,获得实体的数据表,然后修改表中相应数据,然后生成新表替换旧表,达到编辑文本的目的。 例如:修改文本或块属性数据的程序代码如下: (defun c:changetxt(/ e ent en newt oldt ent1) (setq e (car (entsel \请选择文本或属性: \ (if (/= e nil) (progn (setq ent (entget e)) (cond ((and (= (cdr (assoc 0 ent)) \ (progn (setq en (entget (setq ent (entnext e)))) (setq oldt (cdr (assoc 1 en))) (setq newt (getstring T (strcat \ (if (= newt \ (setq ent1 (subst (cons (car (assoc 1 en)) newt) (assoc 1 en) en)) (entmod ent1) (entupd ent) )) ((= (cdr (assoc 0 ent)) \ (progn (setq oldt (cdr (assoc 1 ent))) (setq newt (getstring T (strcat \ (if (= newt \ (setq ent1 (subst (cons (car (assoc 1 ent)) newt) (assoc 1 ent) ent)) (entmod ent1) )) (T (princ \这不是文本或属性!\ ) ) ) (princ) ) 10.4.3 程序的自动加载与自动调用 在进行程序开发时,会发现很多子程序需要反复地调用,而每次调用前都要把这些程序文件加载,一旦忘记就会使用程序中断出错。因此,如果能让这些常用程序在AutoCAD启动时就自动加载进系统,就不会出现程序中断问题了。 AutoCAD软件系统每次启动,都会自动加载一个名为ACAD.LSP的文件。因此,用户可以把常用的LISP程序函数定义在ACAD.LSP文件中,就能保证CAD启动时,自动加载我们常用的程序。 另外一个途径是将程序文件加入到启动组,操作方法如下: (1) 键入appload,弹出图10.1加载与卸载应用程序对话框; (2) 点击“启动组”的“内容”按钮,弹出如图10.1启动组对话框; (3) 点添加,浏览文件,找到我们要自动加载的自定义常用程序文件添加进来即 可。 10.5.2 Visual LISP 操作界面 Visual LISP集成开发环境是在单独的窗口中运行的,用户必须启动Visual LISP才能在它的集成开发环境VLIDE ( Visual LISP interactive development Environment )中工作。可按如下步骤启动Visula LLSP: (1)先运行AutoCAD (2)在AutoCAD菜单中选择“工具”|“AutoLISP” |“Visual LISP编辑器”命令;或者在命令栏里输入:vlisp或vlide,回车。 注意:Visual LISP虽然包括自己的窗口和莱单集,但它不能独立于AutoCAD运行。也就是说必须先启动AutoCAD才能运行Visual LLSP。从Visual LISP集成开发环境中运行AutoLLSP程序时,还经常需要与AutoCAD图形进行交互、或在AutoCAD的命令窗口响应程序提示。 (1) 菜单区 菜单的操作和表达规则与AutoCAD类似。选择了菜单上的某项,将在状态栏上显示相关功能的简短提示。与AutoCAD菜单不同的是,Visual LISP的菜单是与当前操作自动相关联的智能化菜单,随着当前窗口和操作的变化,同一个菜单的内容可能不同。而且Visual LISP的菜单不能由用户定制。 各菜单功能,如表10-9所示。 表10-9 菜单功能 菜单 文件 编辑 搜索 视图 工程 调试 工具 窗口 帮助 菜单功能 新建,打开,保存等操作选项 通用编辑命令与括号匹配等 查找或替换字符串 设置要显示的窗口和界面工具 使用工程和编译程序 设置程序调试相关内容 设置Visual LISP中文本的格式和环境选项 显示进程中的窗口安排或激活LISP或AutoCAD窗口 提供Visual LISP相关的帮助 (2) 工具栏区 Visual LISP中一共有5个工具栏,如图10.5所示:调试、编辑、查找、检验和运行,各自代表功能不同的Visual LISP命令组,可以通过工具栏执行大部分菜单中列出的命令。将鼠标指针停在工具栏某按钮上几秒钟,将弹出说明该按钮功能的提示,而且在状态栏上还会显示对功能更详细的描述。 图10.5 Visual LISP工具栏 (3) 控制台窗口 控制台窗口是一个单独的,内容可以滚动的窗口。在控制台窗口中,可以像在AutoCAD命令行中那样输人AutoLISP表达式,也可以不用菜单或工具栏而直接在控制台窗口中输入很多Visual LISP命令。 在控制台窗口,可以输入和运行AutoLISP表达式并查看结果,这和AutoCAD命令栏所进行的操作相似,但也有一些不同。例如,在Visual LLSP中显示一个AutoLISP变量的当前值,只需在控制台的提示符下输人变量名,然后按Enter键;而要在AutoCAD命令窗口中观察变量值,则需在变量名前加一个惊叹号。 在控制台窗口中,也会显示AutoLISP运行的诊断信息及一些AutoLISP函数的结果。 图10.6 控制台窗口 (4) 跟踪窗口 在启动时,该窗口会显示Visual LISP当前版本的信息,如果Visual LISP在启动时遇到错误,它还会包含相应的出错信息。 (5) 状态栏 位于屏幕底部的状态栏中所显示的信息实时关联用户当前所做的工作,关注这个提示信息将有利于提高用户的工作效率。 (6) 文本编辑器 使用Visual LISP,大部分的时间是在生成或修改源程序,Visual LISP有专用的文本编辑器。每打开一个文件,Visual LISP将新开一个文本编辑窗口,并在这个窗口的状态栏上显示文件名。如果用户对文件进行了修改,Visual LISP将在状态栏上的文件名后加一个 星号“*”,保存或关闭文件之后星号消失。 Visual LISP文本编辑器不仅是一个书写工具,它还是Visual LISP编程环境的核心部分。在AutoCAD 2004版及以后版本中的Visual LISP文本编辑器,有如下的一些特色功能:语法结构着色、设置文本格式、括号匹配、执行表达式、多文件查找及对源代码进行语法检查等。 (7) 编译输出窗口 在进行程序加载时,该窗口会弹出,显示编译结果。如果程序有问题,窗口内会显示错误类型等信息,在错误提示上点右键|显示错误来源,可以反查错误的位置,但这个位置只能定位到哪一段程序。 (8) 其它窗口 除了上述窗口外,还有错误跟踪、跟踪堆栈、监视等窗口,可以在视图菜单中打开。 10.10 其它窗口 10.5.3加载和运行AutoLISP程序 在前一节中,已经介绍了在AutoCAD命令行中加载运行简单程序的办法。在这里,利用Visual LISP的集成开发环境来加载运行程序,可以充分使用Visual LISP提供的语法分析及运行调试功能,使得用户开发程序更方便。 (1) 打开一个AutoLISP程序 对于已经存在的AutoI.ISP程序,在需要用Visual LISP来编辑修改时,可以通过以下步骤来实现: 选择Visual LISP菜单“文件”|“打开文件”命令,之后在“打开文件编辑/查看”对话框中的“文件类型(T)”下拉列表框中选择“Lisp源文件”,如图3-4所示, 选择所要打开的文件,单击“打开”按钮。 之后,Visual LISP将生成一个新的编辑窗口,可阅读其代码,或者在Visual LISP中进行编辑修改及调试工作。 (2) 调试程序 新编写的程序或打开的程序需要进行调试,以确定程序有无语法错误或在有错误时查找问题所在。 ① 设置断点 在文本编辑器窗口内,对调试的程序进行分析,判断程序可能出错的地方设置断点,使程序到此暂停。操作如下:将光标移到断点的下一行,程序代码的左括号前面,单击“调试”工具条中的 图标,或在调试菜单中选择相应选项,设置断点。如果在此处已存在断点, 则进行上述操作会将此断点取消。 ② 调试程序 运行程序,当程序在断点处停止运行,进入调试状态,如图10.12所示调试工具条的最 后一个图标被激活,利用工具条上各图标按键,可以进行逐层表达式的执行,以查看程序运行过程。 图10.12 调试工具条 ③ 跟踪表达式的求值结果 在调试过程中,可以跟踪查看表达式的求值结果。点击 图标,可添加监视,对任意 变量或表达式进行结果显示。执行“调试”|“监视最新结果”操作,打开监视窗口,用户可查看最新的表达式运算结果。 (3) 加载并运行程序或程序片断 用户调试或运行程序时,有时仅仅只需要运行其中某一片断,这在其他大多数编译器中往往需要将此片断独立成一个单独的文件再编译运行。在Visual LISP集成开发环境中,就不用如此繁琐,仅需进行如下简单的操作即可: ①激活含有所调程序的文本窗,用鼠标单击该文本窗的任何位置即可。 ②在文本窗的编辑窗口中,选定要加载的几行源代码,如图 ③选择Visual LISP菜单中“工具”|“加载选定代码”命令,或者直接单击工具栏上的按钮(如图10.12所示)。 (4) 加载并运行整个程序 如果用户需要将整个程序调人运行,可按照下列步骤来加载并运行整个程序: ①激活含有所要加载程序代码的文本窗。 ②在Visual LISP菜单中选择“工具”|“加载编辑器中的文字”命令,或者直接单击工具栏上的相应按钮。 ③加载完成后,控制台窗口中将会显示一条信息,说明调入程序的结果,如图10.13所示。 ④在控制提示符$下,输入括号内含函数名的形式并按Enter键。例如运行函数C:zbbz,输人的形式为_$(c:zbbz)。 在程序运行要求用户输入相关数据时,Visual LISP会将控制交给AutoCAD,并提示输入相关参数。函数运行结束后,控制将返回Visual LISP。 附录:AutoCAD二次开发所用的autolisp函数。 一、数学运算功能函数 1.l(十 数值 数值…)返回:累计实数或整数数值 1.2(一 数值 数值…)返回:差值 1.3(* 数值 数值…)返回:所有数值乘积 1.4(/ 数值 数值…)返回:第一个数值除以第二个以后数值的商,如果两数都是整数时,结果以整数表示 1.5(l十 数值)返回:数值十l l. 6(1— 数值)返回:数值一l l.7(abs 数值)返回:数值的绝对值 1.8(atan 数值)返回:反正切值 1.9(cos 角度)返回:角度的余弦值,角度值为弧度 1.10(exp 数值)返回:数值的指数 1.11(expt 底数指数)返回:底数的指数值 1.12(fix 数值)返回:将数值转换为整数值 1.14(gcd 数值1 数值2)返回:两数值的最大公因数 1.15(log 数值)返回:数值的自然对数值 1.16(max 数值 数值…)返回:数值中的最大值 1.17(min 数值 数值…)返回:数值中的最小值 1.18 pi 常数∏,其值约为3.1415926 1.19(rem 数值 1数值 2)返回:M数值的相除的余数 l.20(sin 角度)返回:角度的正旋值,角度值为弧度 1.21(sqrt 数值)返回:数值的平方根 二、检验与逻辑运算功能函数 2.l(= 表达式1 表达式2)比较表达式1是否等于式2,适用数值及字符串 2.2 (/= 表达式1 表达式2)比较表达式1是否大于等于表达式2 2.3(< 表达式1 表达式2) 比较表达式1是否<小于表达式2 2.4(<= 表达式1 表达式2)比较表达式1是否<一小于等于表达式2 2.5(> 表达式1 表达式2) 比较表达式1是否>大于表达式2 2.6(>= 表达式1 表达式2) 比较表达式1是否大于等于表达式2 2.7 (~ 数值)返回:数值的位 not值,(1的补码) 2.8 (and 表达式1 表达式2…)返回:逻辑and的结果 2.9(boole 函数 整数 整数…)返回:位式布尔运算 2.10(eq 表达式1 表达式2)比较表达式1与表达式2是否相同,适用列表比较(实际相同) 2.11(equal 表达式 1表达式 2【差量】)比较表达式 1与表达式 2是否相同,差量可省略(内容相同) 三、转换运算功能函数 3.l(angtof 字符串【模式】)返回:角度值的字符串转成实数 3.2(angtos 角度【模式【精度】】)返回:角度转成的字符串值 3.3(atof 字符串)返回:字符串转成实数值 3.4 (atoi 字符串)返回:字符串转成整数值 3.5 (cvunit 数值 原始单位 转换单位)返回:数值转换单位后的值转换根据acad.nut文件 3.6(distof 字符串 【模式】)返回:根据模式将字符串转成实数值 3.7(itoa 整数)返回:整数转成字符串 3.8(rtos 数值 模式【精度】)返回:实数转成字符串 3.9 (trans 点 原位置 新位置【位移】) 返回:转换坐标系统值 四、列表处理功能函数 4.1 (append 列表 列表……) 结合所有列表成一个列表 4.2(assoc 关键元素 联合列表)根据关键元素找寻联合列表中关系信息 4.3 (car 列表)返回列表中的第一个元素,通常用来求X坐标 4.4(cadr 列表)返回列表中的第二个元素,通常用来求y坐标 4.5(caddr 列表)返回列表中的第三个元素,通常用来求Z坐标 4.6(cdr 列表)返回:除去第一个元素后的列表 4.7(cons 新元素 列表)返回:将新元素添加到列表 4.8(foreach 名称 列表 表达式)返回:将列表的每一元素对应至名称再根据表达式执行响应 4.9(length 列表)返回:列表内的元素数量 4.10(list 元素 元素…)返回:将所有元素合并为一列表 4.11(listp 元素)返回:判断元素是否为一串 4.12(mapcar函数 列表1列表2…)返回:将列表1、列表2列表的元素配合函数,求得新列表 4.13(member 关键元素列表)返回:根据关键元素(含似后的列表 4.14(nth n 列表)返回:列表的第n个元素 4.15(reverse 列表)返回:将列表元素根据顺序颠倒过来的列表 4.16(subst 新项旧项列表)返回:替换新旧列表后的列表 五、字符串、字符、文件处理函数 5.l(ascii 字符串)返回:字符串第一个字符的“ASCII”码 5.2 (chr 整数)返回:整数所对应的ASCII单一字符串 5.3(close 文件 名称)关闭文件 5.4(open 文件名 模式)返回:打开文件代码,准备读取或写入信息 5.5(read 字符串)返回:列表中的字符串的第一组元素 5.6(read-char【文件代码】)返回:通过键盘或文件中读取单一字符 5.7(read-line 【文件代码】)返回:经由键盘或文件中读取一行字符串 5.8(strcase 字符串【字样】)返回:转换字符串大小写 5.9(strcat 字符串1字符串2…)返回:将各字符串合并为一个字符串 5.10(strlen 字符串)返回:字符串构成的字符数(即字符串长度) 5.11(substr 字符串 起始 长度)返回:取出于字符串? 5.12(wcmatch 字符串 格式)返回:T或 nil,将字符串与通用字符进行比较 5.13(write-char数值【文件代码】)返回:将一ASCII字符写到文件或屏幕 15.14(write-line字符串【文件代码】)返回:将字符串写到文件或屏幕上 六、等待输入功能函数 6.l (getangle 【基点】 【提示】)请求输入十进制角度数值,响应一个弧度值提示及参考点可有可无 6.2(getcorner 基点【提示】)请求输入另一矩形框对角点坐标 6.3(getdist 【基点】【提示】)请求输入一段距离 6.4(getint 【提示】)请求输入一个整数值 6.5(getkword 【提示】请求输入“关键词” 6.6(getorient 【基点】【提示】)请求输入十进制角度,响应一弧度值不受angbase、angdir影响 6.7(getPoint 【基点】【提示】)请求输入一个点的坐标 6.8(getreal 【提示】请求输入一个实数 6.9(getstring 【提示】)请求输入一个字符串 6.10(initget 【位】字符串)设定下次getxxx函数的有效输入 七、几何运算功能函数 7.l(angle 点1 点2)取得两点的角度弧度值 7.2(distance 点1 点2)取得两点的距离 7.3(inters 点1 点2 点3 点 4【模式】)取得两条线的交点 7.4(osnap 点 模式字符串)按照捕捉模式取得另一坐标点 7.5(polar 基点 弧度 距离)按照极坐标法取得另一坐标点 7.6(textbox 对象列表)取得文字字符串的两个对角点坐标 八、对象处理功能函数 8.l(entdel 对象名称)删除或取消删除对象 8.2(entget 对象名称【应用程序列表】)取出对象名称的信息列表 8.3 (entlast) 取出图形信息中的最后一个对象 8.4(entmake 对象列表)建立一个新的对象列表 8.5(entmod 对象列表)根据更新的信息列表更新屏幕上元体 8.6(entnext 【对象名称】)找寻图面中的下一个对象 8.7(entsel 【提示】)请求选取一个对象,响应包含对象名称及选点坐标的列表; 8.8(entupd 对象名称)更新屏幕上复元体图形 8.9(handent 图码)返回:图码的元体名称 8.10(nentsel【提示】)返回:BLOCK所含副元体对象信息列表 8.11(nentselp 【提示】【点】)返回:BLOCK所含副元体对象信息似4*4矩形表示) 九、选择集、符号表处理函数 9.l(ssadd 【对象名称】【选择集】)将对象加入选择集或建立一新选择集 9.2(ssdel 对象名称选择集)将对象自选择集中移出 9.3(ssget 【模式】【点 1】【点 2】取得一个选择集 9.4(ssget ”X” 【过滤列表】)取得根据过滤列表所指定范围的选择集 9.5(sslenth 选择集)计算选择集的对象个数 9.6(ssmemb 对象名称选择集)响应对象名称是否包含于选择集内 9.7(ssname 选择集索引值)根据索引值取出选择集中的对象名称 9.8(tblnext 符号表名称【T】)检视符号表,有效的符号表:”LAYER”、”LTYPE”、”VIEW”、 ”STYLE”、”BLOCK” 9.9(tblsearch 符号表名称 符号)在符号表中搜寻符号 十 、AutoCAD相关查询、控制功能函数 10.l(command ”AutoCAD命令”…)超重量级函数,调用执行 AutoCAD命令 10.2(findfile 文件名)返回:该文件名的路径及文件名 10.3(getfiled 标题 内定档名 扩展名 旗号)通过标准 AutoCAD文件对话 DCL对话框获得文件 10.4(getenv ”环境变量”)取得该环境变量的设定值,以字符串表示 10.5(getvar ”系统变量”)取得该系统变量的设定值,以字符串表示 10.6(setvar ”系统变量”值)设定该系统变量的值 10.7(regapp 应用类项)将目前的AutoCAD图形登记为一个应用程序名称 十一、判断式、循环相关功能函数 11.1(If <比较式> <表达式1> 【表达式2】 检算比较式结果,如果为真,执行<表达式1>,否则执行<表达式2> 11.2( repeat 次数 【< 表达式> <表达式>…】)重复执行 N次表达式 11.3(While <比较式> <表达式>…) 当条件成立则执行表达式内容 11.4(cond <比较式 1> <表达式 1> 多条件式的 if整合功能 <比较式2> <表达式2> <比较式3> <表达式3>) 11.5 ( prong 表达式1 表达式2…) 连接其中的表达式为一组,常用于配合if、cond等函数 十二、函数处理、定义、追踪与错误处理功能函数 12.l(*error* 字符串)程序错误时的警示信息 12.2(alert 字符串)以对话框式显示出警告字符串 12.3(apply 功能函数列表)将功能函数与列表结合后执行 12.4(defun 名称 自变量列表表达式_.)自定函数或子程序 12.5(eval 表达式)返回:表达式的执行结果 12.6(exit)强制退出目前的应用程序 12.7(lambda 自变量表达式)定义未命名的函数 12.8(progn 表达式1 表达式2…)连接其内的表达式为一组,常用于配合if、cond等函数 12.9(quit)强制退出目前的应用程序 12.10(tablet 代码 【列1列2列3方向】)取用或建立对数字板的校调 12.11(trace 函数…)对函数设定追踪标记,辅助检错 12.12(untrace 函数…)对函数设定解除追踪标记 十三、显示、打印控制功能函数 13.l(gfaphscr)作图环境切换到图形画面 13.2(grclear)暂时清除模前的屏幕画面 13.3(grdraw起点终点颜色【亮显】)暂时性的画出一条线 13.4(grread【追踪】)由输入设备读取追踪值 13.5(grtext位置字符串【亮显】)将字符串显示在状态列或屏幕菜单上 13.6(grvecs向量列表【转置矩阵】)暂时性的画出多条线 13.7(menucmd字符串);提供在 AlltOLISP中调用各菜单 13.8(Prinl【表达式【文件代码】】将表达式打印于命令区或已打开的文件句柄字符则以“\\”为前缀展开 13.9(pinc【表达式【文件代码】】除句柄字符则不以”\\”为前缀展外开其余同Prinl 13.10(print【表达式【文件代码】】除表达式会往下一新行列出,及空一格外其余同prinl 13.11(prompt信息)将信息显示于屏幕的命令区,并随后响应一个nil信息 13.12(redraw【对象名称【模式】】)重绘整张图或根据对象名称重绘该图形 13.13(terpri) 在屏幕上显示新列 13.14(textscr) 作图环境切换到文字画面 13.15(textpage)清除文字画面文字类似 DOS的cls命令 13.16(vports)返回:窗口组态列表 十四、符号、元素、表达式处理功能函数 14.l(atom元素)如果元素不是列表,响应T,否则为nil 14.2(atoms-family格式闲号列表】)返回:一组己定义函数的符号列表 14.3(boundp表达式)返回:T或 nil,响应表达式是否有值存在 14.4(minusp元素)返回:T或n儿 元素是否为负值 14.5(not元素)返回:T或n儿 判定元素是否为ni1 14.6(null元素)返回:T或nil判定元素是否被赋予nil值 14.7(numberp元素)返回:T或nil,元素是否为整数或实数 14.8(quote表达式)响应表达式未检算前状态,同“?”功能 14.9(set符号 表达式)将表达式结果设定给带单引号?符号 14.10(setq符号1 表达式1【符号2表达式2】…)设定表达式结果给各符号 14.11(type元素)返回:元素的信息型态 14.12(zerop元素)返回:T或nil,元素是否为0值 十五、ADS、ARX、AutoLISP加载与卸载函数 15.l(ads)返回:目前加载ADS程序列表 15.2(arx)返回:目前加载 ARX程序列表 15.3(arxload应用程序【出错处理】))返回:加载 ARX程序 15.4(arxunload应用程序【出错处理】))返回:卸载 ARX程序 15.5(ver) 返回:目前 AutoLISP版本字符串 15.6(load LSP文件名【加载失败】)加载 AutoLISP文件(*.lsp) 15.7 (xload应用程序【错处理】)加载ADS应用程序 15.8 (xunloa应用程序【出错处理】)卸载 ADS应用程序 十六、内存空间管理函数 16.l(alloc数值)以节点数值设定区段大小 16.2(expand数值)以区段数值配置节点空间 16.3(gc)强制收回废内存 16.4(mem)显示目前的内存使用状态 16.5(xdroom对象名称)返回对象扩展信息允许使用的内存空间 16.6(xdsize列表)返回对象扩展信息所占用的内存空间 十七、其它重要的功能函数 17.l(acad_colordlg 颜色码 旗号)显示出标准 AutoCAD颜色选择对话框 17.2(acad_helpdlg 求助文件名 主题)显示出标准 AutoCAD求助对话框 17.3(acad_strlsort字符串列表)作字符串列表排序 17.4(bherrs) 取得 bhatch与 bpcly失败所产生的错误信息 17.5(bhatch点【选择集【向量】】)根据 Pick point选点方式调用 bhatch命令,绘制选集区域的剖面线 17.6(bpoly点【选择集【向量】】)根据Pick point选点方式调用bpoly命令并产生一定域Polyline 17.7(cal计算式字符串)执行如 CAL计算功能 十八、ADS、ARX外部定义的3D函数 18.1(align自变量 1 自变量 2....)执行如 ALIGN命令各选项顺序 18.2(c:3dsin模式3DS文件名)导入3DS文件 18.3(C:3dsout模式3DS文件名)输出3DS文件 18.4(c:background模式【选项】)设定渲染背景 18.5(C:fog模式【选项】)设定渲染的雾效果 18.6(C:light模式【选项】)设定渲染的灯光控制 18.7(c:lsedit模式【选项1】设定渲染的景物控制 18.8(C:lslib模式【选项】)管理景物图库 18.9(c:matilb模式 材质 材质库名)管理材质数据库 18.10(c:mirror3d 自变量1 自变量2……)执行如MIRROR3D命令 18.11(C:psdrap模式)根据模式设定值(0或1),传唤psdrap命令 18.12(C:psfill对象名称 图案名称【自变量1【自变量2】】)以POStSCript图案填满 18.13(c:psin文件名 位置 比例)插入一个Postscript(*.eps)文件 18.14(c:render【渲染文件】)执行渲染效果 18.15(C:rfileopt格式 自变量1 自变量2 自变量3…)设定执行渲染选项 18.16(c:replay影像文件名 影像类别【选项】)展示影像文件TGA、BMP、TIF 18.17(C:rmat模式 选项)控管材质建立、贴附、编辑、分离 18.18(c:rotate3d自变量 1 自变量2…)执行如 ROTATE3D命令各选项顺序 18.19(C:rpref模式 选项【设定】)渲染环境设定 18.20(c:saveimg影像文件名影像类别【选项】)储存图像文件TGA、BMP、TIF 18.21 (c:scene模式 【选项】) SCENE场景管理 18.22(C:setuv模式 选集 自变量1 自变量2…)SETUV贴图模式管理 18.23(C:showmat自变量1)显示对象的材质贴附信息 18.24(C:solprof自变量 1 自变量工..)建立 3D实体的轮廓影像 18.25(C:StatS【渲染信息文件】)显示渲染信息统计信息 十九、ADS、ARX外部定义的数据库相关函数 19.l(c:aseadmin自变量1 自变量2…)管理外部数据库 19.2(c:aseexportt自变量1 自变量2…)输出信息 19.3 (c:aselinks自变量1 自变量2…)连接对象与信息 19.4(c:aserow自变量1 自变量2…)管理外部信息表格 19.5(c:aseselect自变量1 自变量2…)建立外部信息与对象选集 19.6 (c:asesqled自变量 1 自变量2…) 执行SQL程序
正在阅读:
AutoLISP12-05
新湘教版八年级数学下册3.3.1 用坐标表示轴对称09-06
国际海上避碰规则(中文版)05-12
部编二年级上册词语积累03-15
苹果iPhone 5(16GB)参数05-19
中药真伪的性状(经验)鉴别方法04-28
诊疗常规(1)06-22
大学英语六级单词复习资料0206-19
党务工作者赴白色学习心得体会总结10-20
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 文学理论与批评实践作业答案
- 中班会唱歌的生日蛋糕-中班会唱歌的生日蛋糕
- 生化复习题(大专)
- 2017朝阳初三一模物理试题和答案 - 图文
- 施工单位质量承诺书
- 第六分册 第二篇 第二十章 建筑料放射性核素镭、钍、钾模拟试卷(A)
- 数学建模实验一
- 少先队知识竞赛题
- 《朗读者》里董卿的每段开场语
- 洞口作业安全技术交底
- 议论文写作中辩证思维能力的培养
- 厉鹗《樊榭山房词集》
- 2019高考物理复习验证牛顿运动定律实验专题练习(含解析)精品教育 doc.doc
- 数据库实验报告
- 大纲版高一英语总复习
- 2017年青海省基金从业资格:期货市场的基本功能考试试卷
- 六年级上册数学选择判断题
- 2018高三年级模拟考试语文试题汇编之新型语言表达题
- 关于印发河南城建学
- 2016年秋季西南大学网络法学《金融证劵法》作业答案资料