文档库 最新最全的文档下载
当前位置:文档库 › AUTO LISP函数参考5

AUTO LISP函数参考5

AUTO LISP函数参考5
AUTO LISP函数参考5

AUTO LISP函数参考

4实体数据函数

下列函数可让用户检索和修改定义实体的数据,所有函数都用实体名指定要操作的实体.

4.1(entdel<实体名>)

如果由<实体名>指定的实体在当前图中,它就被删掉,如果在这次编辑中该实体已被删除,那么它将被重新恢复出来(从当前图中).退出图形编辑程序时,被删除的实体便从图中

彻底清除掉了,所以ENTDEL只能在删除实体的那次编辑过程中使实体再恢复.ENTDEL只对

主实体进行操作.对属性和多义线的顶点是不能脱离其双亲实体而予删除的(可使用COMM AND函数执行ATTEDIT或PEDIT命令来达到这一目的).

例如:

(setq e1(entnext));置E1为图中第一个实体的名

(entdel e1);删去实体E1

(entdel e1);不删除(恢复)已被删去的实体E1

4.2(entget<实体名>)

从数据库中检索到名为<实体名>的实体,并以表形式返回,此表包含实体的定义数据表的结果以LISP的关联表形式编制,用ASSOC函数可以容易地从中检索每一项.表中的对象是用AutoCAD的DXF组码形式定义的,它们是为实体数据的每个部分准备的.例如,用下列命令序列画线,然后再检索此线:

对下面的例子,我们假定:

.当前层是"0",

.当前线型是"CONTINUOUS"(缺省值),

.当前Z向高度是零(缺省值),

.实体标号功能被关闭,而且

.FLATLAND系统变量值为零.

假设用下列命令画一条线:

Command:LINE

From point:1,2

To point:6,6

To point:RETURN

然后可以用下述命令为线检索实体数据:

Command:(setq a(entget(entlast)))

假定系统变量FLATLAND为零(即要求3D点).这样,将把A置为下表(为了可读,作了缩进排列):

((-1.)

(0."LINE");Entity type

(8."0");Layer

(101.02.00.0);Start point

(116.06.00.0);End point

)

表的开头-1项包含这个所代表的实体名.下面描述的ENTMOD函数将用这种表来识别要修改的实体.

表示某一值的点对表可以很容易地用ASSOC提取,再用CDR分离出它们的值.实体中各部分的编码是DXF所用的那些编码,在AutoCAD参考手册的附录C中有描述.和DXF一样,实体题头项(实体的颜色和线型,属性跟随标志,厚度,及实体标号)只有在不为缺省值时才被输出.

和DXF不同的是,任选的实体定义字段不管是否和它们的缺省值相等都将被输出.这样做的

意图是为了简化处理;对于使用那种操作和处理它们的通用程序,可以总是假设这些字段是

存在的.另外与DXF不同的是,三维坐标是被组合成一个点值表,如(101.02.03.0),而不

象DXF格式中所出现的三个独立的10,20和30组值.

注意,点的子表不同于以上所述的点对型的.我们约定,子表的CDR即为组值,由于点是由两个实数(或三个函数)组成的一个表,所以使得整个组为一个三元素(或四元素)表.这

个组的CDR即为代表此点的表.因此,这便保证了CDR总能返回组值的这个约定.

当编写函数来处理这些实体表时,必须保证它们与子表的顺序无关.使用ASSOC能保证达到这个要求.包含实体名的-1组使得修改操作只须诉诸于实体表,也避免了在平行(另外的)结构内保持实体名的要求.在多义线或属性集最后的SEQEND实体中包含-2组,它的CDR

是这个实体的排头的实体名.这样,查到SEQEND,就能从子实体序列中找到排头,然后用SEQ END实体中-2组的CDR作为实体名,从而由此获得相关联的主实体.

下面的例子表示一个更复杂的实体数据.对此例,我们假定当前的UCS处在WCS中关于Z 轴逆时针旋转40度的位置,实体标号的功能是打开状态和系统变量FLATLAND为零.

Command:LINETYPE

?/Create/Load/Set:SET

New entity linetype:DASHED

?/Create/Load/Set:RETURN

Command:COLOR

New entity color:BLUE

Command:LAYER

?/Make/Set/New/On/Off/Color/Ltype/Freeze/Thaw:MAKE

New current layer<0>:ANNOTATION

?/Make/Set/New/On/Off/Color/Ltype/Freeze/Thaw:RETURN

Command:TEXT

Start point or Align/Center/Fit/Middle/Right/Style:2,2

Height<0.2000>:0.3

Rotation angle<0>:30

Text:So long,and thanks for all the fish!

Command:(setq ed(entget(setq e(entlast))))

在这种情况下,E将被置为TEXT的实体名,而ED被置为它的实体表(如下示).查找Auto CAD参考手册中的附录C就能知道这个表的具体含意.

((-1.)

(0."TEXT");Entity type

(8."ANNOTANTION");Layer

(6."DASHED");Linetype

(62.5);Color

(5."7E");Handle

(102.02.00.0);Start point

(40.0.3);Height

(1."So long,and thanks for all the fish!")

(50.0.523599);Rotation angle(radians)

(41.1.0);Width factor

(51.0.0);Obliquing angle

(7."STANDARD");Text style

(71.0);Generation flags

(72.0);Justification

(110.00.00.0);Alignment point

(2100.0-0.6427880.766044);Extrusion direction vector

)

所有与实体有关的点均以实体坐标系的形式表达(ECS),对于点(point),线(Line),三

维线(3DLine),三维面(3DFace),三维多义线(3DPolyline),三维网格(3DMesh),和标注(D imension)实体,而对于所有其余实体,其实体坐标(ECS)则可从通用坐标系(WCS)和实体本

身的延伸方向(组代码为210)中导出.当用非通用坐标系绘制实体时(如上例中的Text),需

将点值变换为通用坐标或当前的用户坐标(UCS),这可通过TRANS函数来实现.用上面的Tex t实体为例:

(setq p(cdr(assoc10ed)))可能返回(2.02.00.0)

将文本实体的起点赋给P,即Text实体的实体坐标(ECS),(注意按这种形式返回的点与在用ENTGET时设置的当前用户坐标系无关).现在:

(trans p e0)可能返回(2.01.532091.28558)

这里用e作为"from"转换码,将文本实体的起点从其实体坐标形式转换为通用坐标形式.

如果系统变量FLATLAND是非零值并且上例中的实体是在与通用坐标系(WCS)等效的用户

坐标系中绘制的,则ENTGET返回的有关点值将是二维通用坐标(2D WCS)形式,并具有

一个组代码为38的组值,该组值用以定义实体的Z向高度(如果为非零值的话),同时210组值(延伸方向)将被取消.

4.3(entmod<实体表>)

ENTMOD接受由ENTGET返回的那种格式的表(<实体表>),为此实体更新其在数据库中信

息,该实体名由<实体表>中的-1组指定.因此,AutoLISP更新数据库的基本方法就是用ENTG GET提取实体,修改定义该实体的表(注意,AutoLISP的SUBST函数对这种操作非常有用),而用ENTMOD更新数据库中的实体.例如:

(setq en(entnext));置EN为图中第一个实体的名

(setq ed(entget en));置ED为实体名为EN的实体数据

(setq ed

(subst(cons8"0")

(assoc8ed);改变ED中的图层组的组值

ed;为图层"0"

)

)

(entmod ed);修改图中实体EN的图层ENTMOD对它要做的更改加了一此限制.首先,不能更改实体的类型和实体标号(如果要这样做,则先用ENTDEL删除它,再用COMMAND函数建立一个新的实体).实体表引用的所有对象在执行ENTMOD之前必须是AutoCAD已知的.因此文本类型、线型、形状和块名,在ENTMOD 修改实体表之前必须预先定义好.这个规定的一个例外就是层名,如果在实体表中用到还

没有定义的层,那么ENTMOD将用"LAYER NEW"命令和层的标准缺省值产生一个新层.

对于那些使用浮点值的字段(如厚度thickness),ENTMOD可以接受一个整数,但它会自动将其转变成浮点值.同样;如果为那些整数型实体数据段(如颜色码)指定了一个浮点值,

则ENTMOD也会自动将其截断成整数来处理.

正如DXFIN对DXF文件中的数据处理一样,ENTMOD对提供给它的表也进行一致性检查.如

果检测出严重错误,且严重到数据库已无法更新,则返回nil.否则,ENTMOD将返回作为变元

送给它的表.ENTMOD将不会改变内部字段,如:实体中SEQEND实体中的-2组中的实体名---

对更改这样字段的企图被作为无效处理.

更新主实体时,ENTMOD既修改这个实体,又更新它在屏幕上的图象(包括子实体).当使

用ENTMOD更新子实体(多义线的顶点或块的属性)时,子实体将只在数据库中被更新,但是

屏幕上的图象不会被重新显示.当对给定子实体的所有修改完成后,就可以用下面描述的ENTUPD函数来更新屏幕上的图象.

4.4(entupd<实体名>)

如上所述,当使用ENTMOD对多义线顶点或块属性进行修改后,整个复合实体并不在屏幕上更新.例如,如果修改某条复杂多义线上的100个顶点,那么当每个顶点更改时都对多义

线进行重新计算和重新显示,这样会使工作速度变得不可接受地缓慢.ENTMOD函数可用于

在屏幕上更新经修改的多义线或块.可以用多义线或块中的任何部分的实体名调用ENTUP D.它没有必要是领头实体--ENTMOD将会找到头.虽然ENTUPD是用于多义线和具有属性的块,但实际上也可被其它任何实体调用.它将总是重新生成屏幕上的实体,包括所有的子实体.

例如,设图中第一个实体是一条有若干顶点的多义线,那么:

(setq e1(entnext));置E1为多义线的实体名

(setq e2(entnext e1));置E2为多义线的第一个顶点

(setq ed(entget e2));置ED为顶点的数据

(setq ed

(subst'(101.02.0)

(assoc10ed);改变ED中的顶点位置为1,2

ed

)

)

(entmod ed);移动图中的顶点

(entupd e1);重新生成多义线实体E1

4.5限制

实体名和选择集只对图形编辑过程有效,它们是在图形编辑过程中从AutoCAD取得的.另外在执行PLINE和ATTEDIT命令的过程中企图执行下列操作,则会返回nil,而且不执行

所要求的函数.

ENTMOD修改一个现存实体

ENTUPD重新生成一个经修改的复杂实体

ENTDEL恢复和重新生成一个删去的实体

5将实体名和选择集与AutoCAD一起使用

对于AutoCAD的实体选择提示,用实体名和选择集输入是有效的.因此,对由AutoLISP命名的实体可以用AutoCAD命令进行操作.在"Select object:"提示下AutoLISP可以提供一个实体名,它指定了单个实体,或者一个选择集,它选择了集中的所有实体.凡在AutoCAD允

许使用"Last"选择项的地方,用AutoLISP给出实体名或选择集也是有效的(不管实体是否

可见,它们都具有与拾取一个实体相同的效果,但却不必指定一个拾取点).

在AutoCAD允许使用指点目标方式进行选择的地方,ENTSEL返回的那种格式的表将被选择过程接收.它们从表中选择实体,指定表中的点作为它们的拾取点.这就允许AutoLISP

将这种形式的实体拾取点传送给如BREAK,FILLET,CHAMFER,TRIM和EXTEND这样的命令.注意,只要命令允许拾取点,ENTSEL型格式的表也可用于其它选择.

6对处理曲线拟合和样条拟合多义线的说明

当使用ENTNEXT逐步通过多义线的各顶点时,可能会碰到一些不是有意建立的顶点,这些

是辅助顶点,是PEDIT的Fit和Spline选择项自动插入的.用户可能想略去这些辅助顶点,因

为在下次对多义线使用PEDIT的Fit和Spline时会取消对这些辅助点作的变动.

从多义线实体的组标号70中,用户可看出多义线是曲线拟合(位值为2)的还是样条拟合(位值为4)的.如果未设置这两种位值,则多义线的所有顶点都是正常的.如果设置了曲线

拟合位(2),则多义线的辅助顶点将具有其组标号70设置的位值1.以表示这些顶点是在曲

线拟合过程中插入的.如果您想使用ENTMOD来移动这种多义线的顶点,并使用PEDIT来重新拟合曲线,那么您应该略去这些辅助的顶点.

同样,如果多义线实体的样条拟合标记位值置为4,则会对各顶点进行分类,有些顶点的标记位值为1(在曲线拟合时插入,若系统变量SPLINESEGS为负),有些顶点的位值为8(在样条拟合时插入),所有其他顶点的位值都为16(样条骨架的控制点).同样,如果您使用ENTMOD 来移动顶点,然后想重新拟和样条,那么只应该移动作为控制点的那些顶点.

7符号表访问函数

函数,它们能够读取(也只能读取)增加了两个分别由AutoCAD的图层、线型、赋名视图,字型和块定义所组成的符号表.这两个新函数是TBLENXT和TBLSERCH,它们的描述如下.

7.1(tblnext<表名>[<第一个>])

本函数用于扫描整个符号表.第一个变元是一个字符串,它表明你想访问的符号表名.

有效的表名包括"LAYER"、"LTYPE"、"VIEW"、"STYLE"、"BLOCK"、"UCS"和"VPORT".

字符串不一定要大写.如果给出第二个变元且求值结果不为nil,则反绕回符号表头且返回

表中第一项;否则,返回表中下一项.当到表尾时,则返回nil.被删去的表项不再返回.

当找到一项后就返回一个如DXF类型的代码点对表,很像ENTGET函数的返回值.例如, (tblnext"Layer"T);检索第1个图层

将返回:

((0."LAYER");符号类型

(2."0");符号名

(70.0);标志

(62.7);颜色号,如层被开闭则为负

(6."CONTINUOUS");线型名

)

注意,这里没有"-1"组.AutoCAD会记住从每个表中最后返回的项,每次调用TBLNEXT将自动地返回下一项.开始扫描表时,必须保证第二变元为非nil值,这样函数才能绕回表头

并返回第一项.

在"BLOCK"表中有一个组代码为-2的实体名,它是该块定义中的第一个实体的名.这样,如果已知一个块名叫BOX:

(tblnext"block");检索块定义

可能返回:

((0."Block");符号类型

(2."Box");符号名

(70.0);标志

(10.9.0000002.0000000.000000);X,Y,Z的原点

(-2.<实体名:40000126>);第一个实体

)

"-2"组中的实体名只能被ENTGET和ENTNEXT所接受,其它实体访问函数是不能访问的.这就是说,不允许用ENTMOD修改或用SSADD、ENTSEL将其收进某一选择集.依靠-2组的实体名,可以用ENTNEXT扫描构成块定义的各个实体;ENTNEXT对块定义中的最后一个实体名返回nil.

如果系统变量FLATLAND为零,TBLNEZT对三维点将总以四元表的形式返回,如(100.0 2.03.0).如果FLATLAND为非零值,则三维点按三元表(二维)形式返回,但这时将有一个组

码为30的点对表,用以说明点的Z向高度值.

7.2(tblsearch<表名><符号>[<顺序状态>])

此函数搜索用<表名>指定的符号表(同TBLNEXT一样),寻找由<符号>指定的符号名.两个名称都能自动转换成大写字母.如果找到了给定的符号名,有关该项的信息用TBLNEXT一

样的格式返回.如果找不到该项,则返回nil.例如:

(tblsearch"style""standard");字型检索

将返回:

((0."STYLE");符号类型(2."STANDARD");符号名字

(70.0);标志

(40.0.000000);固定字高

(41.1.000000);字宽因子

(50.0.000000);倾斜角

(71.0);生成标志

(3."txt");主字体文件

(4."STYLE");大字体文件

)

一般TBLSEARCH不影响被TBLNEXT检索的符号表顺序,但若TBLSEARCH操作无误,且可选变

元<顺序状态>存在并为非空值,则会调整TBLNEXT的检索顺序,使得下次调用TBLNEXT能返回紧随在这次调用TBLSEARCH之后的表项.

变元<顺序状态>的这一功能对于处理VPORT符号表是极有用的,因为在特定的设置情况下,所有的视窗均具有同一名称.例如,要在名为"4VIEW"的设置中寻找并处理每一视窗,可

使用如下程序段:

(setq V(tblsearch"VPORT""4VIEW"T));寻找第一个视窗

(while(and V(=(cdr assoc2V))"4VIEW"))

...处理视窗...

(setq V(tblnext"VPORT"));取得下一个视窗)

如果系统变量FLATLAND为零,TBLNEXT对三维点将总以四元素的形式返回,如(101.0 2.03.0),如果FLATLAND为非零值,则三维点按三元表(二维)形式返回,但这时将有一个组

码为30的点对表,用以说明点的Z向高度值.

8对图形屏幕的输入设备的访问

这一节讲述的AutoLISP函数允许从AutoLISP直接对AutoCAD图形屏幕的输入设备进行访

问,使得用AutoLISP完成的命令可以和用户进行交互,就像用户和AutoCAD交互一样.这些

命令可能会把屏幕图形搞乱,但用户可用下列命令恢复:

(grtext)

(redraw)

所以没有必要担心.这些函数只提供给有经验的应用程序开发者使用.大多数AutoLISP 应用程序将不必用到这些函数.还需提请这些函数的用户注意,这些函数的操作可能会直

接随着AutoCAD的发行版本的变化而更改,因此,AutoDISK公司不能保证使用这些函数的应用程序的向上兼容性.使用GRTEXT和GRREAD函数的应用程序也许不能在所有的硬件配置上以同样效果工作,除非开发者非常认真地遵循下面介绍的有关它们的使用规则.

8.1(grclear)

这个函数清空当前视窗(在单屏幕系统中,它先从文字屏幕转换图形屏幕).但命令/提

示、状态和菜单区保持不变.图形屏幕的原来内容可以用REDRAW函数恢复.

8.2(grdraw<起点><终点><颜色>[<加亮>])

GRDRAW在当前视窗中的两点之间画一条矢量线.<起点>和<终点>是两个二维或三维点(两个实数或三个实数的表),它们指定当前用户坐标系中矢量的两个端点.若矢量线超出当

前显示区,它们将被修剪以适合于屏幕.矢量将以整数<颜色>变元指定的颜色画出,-1指定"XOR涂描"方式,它复盖它画过的地方,当被复盖时就抹掉它自己.如果任选项<加亮>变元(整数)存在并且为非零值,矢量就加以加亮的形式画出,就象显示设备加亮所选择的目标一样(通常以虚线形式).如果省略了<加亮>项,或者提供的值为零,则使用通常的显示方式.

8.3(grtext[<框区><文本>[<加亮>]])

利用GRTEXT,AutoLISP可以将文本写到AutoCAD图形屏幕的文本区上.如果调用它时有<框区>变元,且其范围从0到屏幕菜单框区最大编号减一,那么它将在指定的屏幕菜单框区内显示字符串变元<文本>.如果<文本>太长放不进菜单框区,则将它截尾,如果太短则填加

空格.如果提供了任选的整数变元<加亮>,则加亮(若变元为非零值)指定菜单框区内的文字,或去掉(若变元为零值)指定菜单框区内的文字加亮态(注意,加亮另一个菜单框区将自

动地去掉已被加亮的框区的加亮显示态).当往菜单框区写东西时,文本须先在无<加亮>方

式下写,然后才可做加亮显示.对和原来写到菜单框区的文本相同的字符串,必须提供加亮

或去掉加亮的变元.如果不注意这些规则,将会导致AutoLISP程序在不同的显示设备上产

生不同的结果操作.注意,这个函数只不过能在屏幕菜单区内显示所提供的文本;它并不改

变被其覆盖的屏幕菜单项.

另外,某些显示器上采用重新涂覆菜单项来实现加亮菜单框区的操作,故用GRTEXT写字可能会导致将用户加亮菜单框区时的菜单项内容恢复出来.还有一些显示器,当用REDRAW, REGEN等命令或执行屏幕切换时;会自动重写菜单区内容.然而对大部分显示器,用GRTEXT

往屏幕菜单区内写字可保留到直至调用下页屏幕菜单为止.

如果调用GRTEXT时其框区编号为-1,文本将被写到屏幕的方式状态行上.方式状态行的长度因显示器的类型而不同(除IBM彩色图形适配器之外,大多数显示器至少允许40个字符).当<文本>太长以致不能容纳在状态行可用空间内,GRTEXT将对它进行截尾.

如果使用的框区号为-2,将把文本写到坐标状态行上.注意,如果坐标跟踪处于打开态,一旦定标器发送新的一组坐标值,写到该处的文本值将被复盖掉.对于-1或-2菜单框区号, <加亮>变元不起作用.

最后,如果调用GRTEXT时不加任何变元,就能将屏幕上所有的文本区域恢复到它们的标准数值状态.

8.4(grread[<跟踪>])

利用GRREAD,用户可以直接读AutoCAD的输入设备,任选变元<跟踪>指定了是否跟踪定标

器的移动.只有非常特殊的命令才会用到这个函数--AutoLISP的大多数输入应该通过各种

各样的"GETxxx函数",如GETSTRING,GETREAL等.<跟踪>变元如果存在且不为nil,那么当定标器移动时,就能从它那儿返回坐标值,而不需要按选择按钮.这就是AutoCAD用于实现拖

曳的机制.

GRREAD返回一个表,它的第一个元素是指定输入类型的编码.第二个元素既可能是一个整数,也可能是一个点表,这取决于输入类型.表中第一个元素编码方式如下:

2键盘字符----第二个元素为ASCII码.

3选择的点----作为表的坐标

4屏幕菜单单元选择----第二个元素作为菜单框区号.

5第二个元素为拖曳方式坐标.只有当第二个变元指定了且不为nil时,才返回.

6BUTTONS(按钮)菜单项选择----第二个元素为按钮号.

7数字化TABLET1菜单项----第二个元素为菜单项编号.

8数字化TABLET2菜单项----第二个元素为菜单项编号.

9数字化TABLET3菜单项----第二个元素为菜单项编号.

10数字化TABLET4菜单项----第二个元素为菜单项编号.

11数字化AUXI菜单项----第二个元素为菜单项编号.

12第二个元素作为与定标器按钮对应的坐标返回.总是跟随类型6的返回表.

13由键盘输入选择加亮屏幕菜单项.返回的第二个元素是菜单项编号.

当返回表中的第二项为点值时,系统变量FLATLAND的当前设置状态会自动决定其返回形式.如FLATLAND为零,则返回点值为与当前用户坐标系统对应的三维坐标;否则为二维坐标.当GRREAD正在运行时,若输入了CTRL-C,就能从键盘上中止AutoLISP程序.任何其它输入将直接传送给GRREAD,使得它能完成对输入设备的控制.

附录A错误信息

当AutoLISP检测到一个错误时,它就停止执行当前正在执行的函数而去调用用户定义的

错误处理函数*ERROR*.如果用户没有定义自己的错误处理函数(即*ERROR*的约束值为nil),标准的错误处理便以下列格式显示信息:

error:message(错误信息)

接下来显示函数的历程报告.如果用户定义了自己的错误处理函数*ERROR*,则把message

作为仅有的变元传给*ERROR*函数.

1.用户程序错误

下面是错误信息表,当编写和调试AutoLISP函数时经常能见到这些信息.大部分信息指出了典型的LISP程序错误,例如:

.函数或符号名拼写错误;

.函数变元的个数或类型错误;

.括号不匹配;

.引号不匹配(字符串没有终止符);

.函数没有执行完就试图使用它的结果.尽管这些信息通常指出的是用户程序的错

误,但有时也可能是由于AutoLISP本身的程序产生的错误.如果系统报告了错误

而你又在你的程序中没有找到任何错误,请你填写一份错误报告(Bug Report)寄

Autodesk公司.

atomlist modified after function swap(函数交换后,修改了atomlist表)一个表达式修改了ATOMLIST表.在VMON函数被激活以后,这是不允许的.

AutoCAD rejected function(AutoCAD不接受的函数)

传送给AutoCAD函数的变元不合法(如:在函数SETVAR中用了只读的系统变量或在函

数TBLNEXT中用了无效的表名),或函数本身在当前的正文中不合法.例如,不能在

COMMAND函数中使用用户输入函数GETxxx.

bak argument type(变元类型有错)

传送给函数的变元类型不正确(例如,不能把一个整型数传给函数STRLEN).

bad association list(关联表有错)

提供给ASSOC函数的关联表不能由"(key value)"表组成.

bad entmod list(entmod表有错)

传送给ENTMOD的变元不是一个合适的实体数据表(如同ENTGET返回的那样的表).

bad entmod list value(entmod表值有错))

传送给ENTMOD的关联表中的一个子表包含错误的值.

bad formal argument list(形式变元表有错)

当AutoLISP计算函数时,它测到一个非法的形式变元表.也许此函数根本不是一个

函数,而是一个数据表.

bad function(函数有错)

表中的第一个元素不是一个合法的函数名.也许它是一个变量名或一个数.这个信

息也可能表明函数的定义有问题,不要忘记所需要的形式变元表.

bad list(表有错)

一个构造有错的表传给了函数.如果实型数以一个小数点开头,也会产生这种错误;

这种情形下必须在小数点前面加一个零.

bad node(结点有错)

TYPE函数遇到了非法类型的项.

bad node type in list(表中出现错误的结点类型)

FOREACH函数遇到了非法类型的项.

bad point argument(点变元有错)

一个定义不合适的点(两个实数的表)被传送给需要点的函数.请注意,实型数不能

以小数点开头;在这种情况下必须在小数点前面加一个零.

bad point value(点值有错)

一个定义不合适的点(两个实数的表)被传送给需要点的函数.请注意,实型数不能

以小数点开头;在这种情况下必须在小数点前面加一个零.

bad ssget list(ssget表有错)

传送给(SSGET"X")的变元不是一个合适的实体数据表(就象ENTGET返回的那样的表).

bad ssget list volue(ssget表值有错)

传送给(SSGET"X")的关联表中的一个子表有不正确的值.

base point is required(需要基点)

GETCORNER函数被调用时,没有传给所需要的基点变元.

boole arg1<0or>15(boole的第一个变元<0或>15)

BOOLE函数的第一个变元必须是从0到15之间的整数.

can't evaluate expression(不能计算表达式)

这个错误可能是由于小数点位置不合适和表达式的形式不合适而产生的.

Can't open(file)for input--LOAD failed(装入失败)

LOAD函数中描述的文件没找到,或用户无权访问这个文件.

Can't reenter AutoLISP(不能再进入AutoLISP)

AutoCAD与AutoLISP的通讯缓冲区正被当前运行的函数使用,直到这个函数执行完,

别的函数才能被调用.

console break(控制台中断)

当函数正在运行时用户输入了CTRL-C

divide by zero(零做除数)

零做除数是不允许的.

divide orerflow(除法溢出)

非常小的数做除数,导致了错误的商.

extra right paren(多余的右括号)

遇到了一个或多个多余的右括号

file not open(文件没打开)

I/O操作的文件描述符不是一个已打开文件的描述符.

file read-insufficiont string space(读文件时字符串空间不够))

读文件时,字符串空间已满,参看第6章.

file size limit exceeded(文件容易超限)

(只对基于UNIX的系统)文件的大小已超过操作系统规定的文件容量限制.

Floating--point exception(浮点错误)

(只对基于UNIX的系统)操作系统检测到了浮点运算的错误.

Function cancelled(被取消的函数)

用户键入CTRL-C来回答输入提示.

function undefined for argument(函数的变元超出限定范围)

传送给LOG或SQRT的变元超出范围.

function undefined for real(函数的变元没定义为实型数)

一个实型数作为变元传给了需要整型数的函数.例如:(LSH val1.2).

improper argument(变元不合适)

传给GCD的变元为负数或零.

inappropriate object in function(函数中有不正确的对象)

一个构造有错的函数被VMON分页函数检查出来了.

incorrect number of arguments(变元个数不对)

QUOTE函数只需要一个变元,但却给了它几个变元.

incorrect number of arguments to a function(传给函数的变元数有错误)用户定义的函数的变元数与在DEFUN中说明的形式变元数不匹配.

incorrect request for command list data(不正确地申请命令表数据)

遇到了COMMAND函数,但由于另外一个正运行的函数而不能被激活.

input aborted(输入中止)

遇到了错误或过早的遇到了文件结束标志,而引起了文件输入的结束.

insufficient string space(字符串空间不够)

没有足够的堆空间来容纳指定的文本字符串.参看第六章.

invalid argument(非法变元)

变元类型的不合适,或变元超出范围.

invalid character(非法字符)

表达式中含有非法字符.

invalid dotted pair(非法的点对)

点对是包含由"空格--句号--空格"结构隔开的两个元素构成的表.如果实数以一个

小数点开头也可能产生这个错误;在这种情况下必须在小数点前面加一个零.

invalid integer value(非法的整型值)

遇到了一个数比最小的整数小,或比最大的整数大则产生这样的错误信息.

LISPSTACK Overflow(LISPSTACK溢出)

AutoLISP的栈空间溢出,这可能是因为函数递归太多或函数变元表太大造成的.为

此可把LISPSTACK的环境变量值加大.

melformed list(残缺的表)

从文件中读一个表,没有读完就过早地结束了.

melformed string(残缺的字符串)

从文件中读一个字符串,没有读完就过早地结束了.

misplaced dot(点的位置不对)

如果一个实型数以小数点开头,会发生此类错误,这时,必须在小数点前面加一个零.

null function(空函数)

试图计算一个定义为nil的函数.

quit/exit abort(quit/exit中止)

这是调用QUIT或EXIT函数的结果.目前在AutoLISP中不再使用这两个函数了.

too few argments(变元太少)

传给内部函数的变元数太少.

too many arguments(变元太多)

传给内部函数的变元数太多.

2内部错误

下面的错误信息一般应很少出现,如果你经常遇到这样的错误,就可能是AutoLISP系统本身的内部错误了.这种情况下你最好以填写错误报告(Bug Reprot)的形式告诉Autodesk

公司.

Bad dgument to system call(系统调用错误)

(只对基于UNIX的系统)操作系统检测到一个由AutoLISP产生的错误的系统调用.

Bus error(总线错误)

(只对基于UNIX的系统)操作系统检测到一个总线错误.

COMREG re-use overflow(COMREG再用溢出)

COMREG swopin failure(COMREG换入失败)

COMREG swopout failure(COMREG换出失败)

在VMON函数分页期间出现了AutoCAD与AutoLISP的通讯错误.

could not open page file(不能打开分页文件)

VMON函数的分页文件不能被打开

Double lock(双锁)

Double unlock(双解锁)

在VMON函数分页期间出现了AutoCAD与AutoLISP的通讯错误.

error swapping in function(换进函数错误)

error swapping out function(换出函数错误)

VMON函数分页期间出现了I/O错误.

Hangup(挂起)

(只对基于UNIX的系统)操作系统检测到了"挂起"(hangup)信号.

illegal instruetion(非法指令)

(只对基于UNIX的系统)操作系统检测到一个非法的机器指令.

segmentation violation(段越界)

(只对基于UNIX的系统)操作系统检测到一个企图对当前进程的存贮区域以外地址

进行访问的错误.

unexpected signal nnn(非预期的信号)nnn

(只对基于UNIX的系统)从操作系统收到了一个非预期的信号.

LISP函数大全

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 函数整数整数…)返回:位式布尔运算AutoLisp函数2/8 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 字符串)返回:字符串转成整数值

AutoLISP 基础——认识自定义函数

AutoLISP基础——认识自定义函数 (本文由LL_J?认识自定义函数?和?Autolisp编程心得?两篇巨著合成,并融入了其他人的一些经验,以快速打通你的任督二脉——自贡黄明儒注) 一、初识Lisp 在AutoCad命令输入(+ 1 2 3),回车返回6,如下 命令: (+ 1 2 3) 6 恭喜你,你已经会写Lisp程序了。这里,我们用到了一个系统定义的函数+,这个函数的作用就是对后面的数字求和。 上式一对英文括号组成的表达式,称之为表,Lisp语言也称为表的语言。表有两种形式,一种是?口袋式?表;一种是?函数式?表。前者如’(0 0)表示一个2维点,前面加’表示此表不求值。如果不加‘,则通常是认为是?函数式?表。?函数式?表如下: ①结构特点:左括号(紧跟函数,函数所需要的参数,右括号)结束。 ②函数是指:系统定义的函数、自定义的函数、匿名函数lambda。如 ((lambda(x y z) (* x y z)) 3 4 5)是合理的。 ③参数可以是:数字(整数、实数)、字符串、T、nil、表(如果此 表是表、函数,就构成了复杂表,这就是lisp程序)、函数。 ④表可以作为函数的参数。如(+ 1 (- 5 2) 3)中,表(- 5 2)就作为+函数 的参数。 ⑤表的返回值也可以传递给其它变量,如(setq x (+ 1 2 3)) ⑥接受输入参数,如(- 5 2)中,-函数接受5和2两个参数。 二、什么是函数 函数一词最早来源于数学,维基百科这样说:函数是将唯一的输出值赋予每一输入的"法则"以及该输出值与对应输入值的集合。 在计算机领域,对函数并没有一个完整的定义,百度百科有这样一句话:"许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,所以,函数也可以说是许多代码的集合,这就是程序中的函数。 综合以上描述,我们可以看到"函数"的基本组成: 输入值:一般称为参数; 表达式:函数体,是代码的集合,共同组成上面所说的"法则";

AUTO LISP函数参考5

AUTO LISP函数参考 4实体数据函数 下列函数可让用户检索和修改定义实体的数据,所有函数都用实体名指定要操作的实体. 4.1(entdel<实体名>) 如果由<实体名>指定的实体在当前图中,它就被删掉,如果在这次编辑中该实体已被删除,那么它将被重新恢复出来(从当前图中).退出图形编辑程序时,被删除的实体便从图中 彻底清除掉了,所以ENTDEL只能在删除实体的那次编辑过程中使实体再恢复.ENTDEL只对 主实体进行操作.对属性和多义线的顶点是不能脱离其双亲实体而予删除的(可使用COMM AND函数执行ATTEDIT或PEDIT命令来达到这一目的). 例如: (setq e1(entnext));置E1为图中第一个实体的名 (entdel e1);删去实体E1 (entdel e1);不删除(恢复)已被删去的实体E1 4.2(entget<实体名>) 从数据库中检索到名为<实体名>的实体,并以表形式返回,此表包含实体的定义数据表的结果以LISP的关联表形式编制,用ASSOC函数可以容易地从中检索每一项.表中的对象是用AutoCAD的DXF组码形式定义的,它们是为实体数据的每个部分准备的.例如,用下列命令序列画线,然后再检索此线: 对下面的例子,我们假定: .当前层是"0", .当前线型是"CONTINUOUS"(缺省值), .当前Z向高度是零(缺省值), .实体标号功能被关闭,而且 .FLATLAND系统变量值为零. 假设用下列命令画一条线: Command:LINE From point:1,2 To point:6,6 To point:RETURN 然后可以用下述命令为线检索实体数据: Command:(setq a(entget(entlast))) 假定系统变量FLATLAND为零(即要求3D点).这样,将把A置为下表(为了可读,作了缩进排列): ((-1.) (0."LINE");Entity type (8."0");Layer (101.02.00.0);Start point (116.06.00.0);End point ) 表的开头-1项包含这个所代表的实体名.下面描述的ENTMOD函数将用这种表来识别要修改的实体. 表示某一值的点对表可以很容易地用ASSOC提取,再用CDR分离出它们的值.实体中各部分的编码是DXF所用的那些编码,在AutoCAD参考手册的附录C中有描述.和DXF一样,实体题头项(实体的颜色和线型,属性跟随标志,厚度,及实体标号)只有在不为缺省值时才被输出. 和DXF不同的是,任选的实体定义字段不管是否和它们的缺省值相等都将被输出.这样做的

lisp功能函数

一、数学运算功能函数 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坐标

AutoLISP详细讲解

AutoLISP详细讲解 关于AutoLISP AutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。 除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD 软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。 AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。 现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。 在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk 公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。 数学运算 任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。 1.加法 格式(+ num1 num2 num3…) 此函数(+)计算加号(+)右边所有数字的和(+ num1 num2 num3…)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是

AutoCAD二次开发所用的autolisp函数

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的补码)

autolisp多段线处理函数集

;;164.1 [功能] 曲线是否封闭 ;;164.2 [功能]使多段线封闭 ;;164.3 [功能] 多段线端点列表 ;;164.4 [功能] 矩形中点坐标 ;;164.5 [功能] 参数param处的切线方向的角度;;164.6 [功能] 参数param处的法线方向的角度;;164.7 [功能] 曲线一点的切线方向的角度;;164.8 [功能] 曲线一点的法线方向的角度;;164.9 [功能] 去除多段线重点 ;;164.10 [功能] 判断点是否在曲线上 ;;164.11 [功能] 曲线长度 ;;164.12 [功能] 多段线子段数量 ;;164.13 [功能] 曲线中点 ;;164.14 [功能] 曲线一点的参数param ;;164.15 [功能] 参数param处的坐标 ;;164.16 [功能] 多段线第n子段的起点坐标;;164.17 [功能] 多段线第n子段的终点坐标;;164.18 [功能] 多段线所点击子段的两端点列表;;164.19 [功能] 多段线所点击点最近的一个顶点;;164.20 [功能] 多段线所点击子段param(索引) ;;164.21 [功能] 多段线所点击子段的起点坐标;;164.22 [功能] 多段线所点击子段的终点坐标

;;164.23 [功能] 多段线所击点离起点近 ;;164.24 [功能] 多段线所点击子段否是直线(返回nil是弧) ;;164.25 [功能] 求多段线上的弧段(圆或圆弧也有效)的圆心by caoyin ;;164.26 [功能] 求多段线上的弧段(圆或圆弧也有效)的圆心 ;;164.27 [功能] 判断多段线是否有圆弧(凸度/=0)的子段 ;;164.28 [功能] 判断多段线是否有圆弧(凸度/=0)的子段 ;;164.29 [功能] 连接线、弧成多段线 ;;164.30 [功能] 构造矩形by highflybird ;;164.31 [功能] 点表生成多段线 ;;164.32 [功能] 3D多段线 ;;164.33 [功能] 多段线反向(起点反成终点) byzml84 ;;164.34 [功能] 多段线删除顶点 ;;164.35 [功能] 多段线增加顶点 ;;164.36 [功能] 多段线修改顶点 ;;164.37 [功能] 多段线拷贝子段 ;;164.38 [功能] 修改多段线子段 ;;164.39 [功能] 修改多段线子段为直线 ;;164.40 [功能] 点在封闭多段线内返回T,其余nil By 狂刀 ;;164.41 [功能] 点在封闭多段线内返回T,其余nil By SmcTools ;;164.42 [功能] 判断点在封闭曲线内外,自交曲线不适用By Gu_xl ;;164.43 [功能] 点在封闭多段线内返回T;线上0;外nil ;;164.44 [功能] 多段线弧段全改为直线段

Autolisp编程心得

Autolisp编程心得 1.养成良好的书写习惯 众所周知,Lisp是一种表结构语言,括号必须成对出现,在调试时往往为遗漏了一个括号大 费周折,所以,养成一个好的编程习惯是学好Lisp所必须的。 ⑴选择一个较好的编辑器,这是一个基本条件,建议使用Visual Lisp编辑器或Lisplink 等 专用编辑器,此类编辑器可以对函数突出显示。 ⑵按Lisp(DCL)专有格式书写,并经常对程序进行“格式化”,及时发现语法错误,并有利于调试是查找错误。 ⑶使用自定义函数,并辅助以适当得注释,在较大程序中按功能使用自定义函数可以使得程序条理化。 2.函数中循环与转移的使用 在高级语言中一般有类似“goto”的语句实现转移,在AutoLisp中没有转移的函数。我们可 以使用自定义函数实现转移,用if及cond辅助实现条件转移。 当我们需要实现在满足一定条件时进行循环的功能,一般使用while函数,但有时需要判断的条件较复杂时,使用while函数往往不能实现或使得程序不够简洁。这时我们可以使用“转移”, 将需要实现的功能作为(子)函数,使用恰当,可以在程序中任意“转移”。 一般认为,当一段代码在不同处重复使用时,我们才会使用子函数定义,其实,利用函数的更大的优点是使得程序更加结构化。这就使得我们不必拘泥于程序中的循环语句,而使用函数的循环调用,辅助适当的判断,实现“转移”,如A->B->A。当然也可以进行自身调用,构成一个“标准的”循环。 如例一中,“程序执行完毕返回”与“空选返回”两种情况如果使用循环语句,其条件是完全不同的,而将函数本身作为子函数调用,程序简洁明了。 3.initget函数中关键字“ ”(空格)的使用 空格可以被用作关键字,一般多用来定义鼠标右键退出。 ⑴当用户输入函数不支持控制位(如entsel、nentsel、nentselp)时,可直接使用“(initget " ")”。 ⑵当用户输入函数支持控制位(如getpoint等)时,可使用“(initget 1 " ")”禁止空输入,而将回车等空输入作为关键字使用。 ⑶当同时使用其它关键字时,应该将空格作为一系列关键字的最后一个,用 “(initget "C ")”(两个空格)调用,否则无效。 见例一。 ************************************************ ;;例一 (defun ett_ct()

lisp函数

函数大全 一、数学运算功能函数 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 函数 整数 整数…)返回:位式布尔运算

autolisp教程

第十四章 AutoLISP 14.1 关于AutoLISP AutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。第一篇关于LISP的参考文献是由John McCarthy 在1960年4月的《ACM通讯》中发表的。 除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD 软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCAD R2.18及更高版本才可以使用AutoLISP语言。 AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。 现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。 在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk 公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。 14.2 数学运算 任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。 269

Lisp常用函数

Lisp常用函数 Lisp 语法及变量皆不分大小写(case insensitive)。 NIL 空串行,相当于'() 。另外真伪值表示时,T 表真,NIL 表伪。只要是任何不是NIL (空串行) 的值,真伪值都表示真。 QUOTE CODE: (QUOTE 参数) 将参数直接传回,不做任何评估动作。可用' (单引号)取代 SETQ, SETF, LET CODE: (SETQ 参数1 参数2) (SETF 参数1 参数2) (LET ((变量1名称变量1的值) (变量2名称变量2的值) ........ ) 变数1,2...的作用范围,既程序执行叙述 ) SETQ, SETF 将参数1的值连结至参数2。LET 只有在作用范围内有效。 注:SetQ => set quote; SetF => set form 注:全域变数习惯用两个* 把变量名称包起来,例如*globe-variable* CAR, CDR CODE: (CAR 串行参数) (CDR 串行参数) CAR 取得参数串行的第一个元素;CDR 取得扣掉第一个元素之后的新串行。

CONS CODE: (CONS 参数1 参数串行2) 把参数1 加到参数串行2 的第一个元素,产生出新的串行。 对任一串行A 而言,(CONS (CAR A) (CDR A)) 即为 A 。 注:如果第二个参数不是串行,则会产生出点对,故少用。 APPEND CODE: (APPEND 参数串行1 参数串行2 ........ ) 合并若干参数串行,形成新的串行。 注:如果最后一个参数不是串行,也会形成尾巴是带点的串行,故少用。LIST CODE: (LIST 参数1 ........ ) 将若干参数,当作是新串行的元素,形成新串行。 注:APPEND 除了最后一个之外的参数皆需为串行,而LIST 不用。NULL CODE: (NULL 参数) 判断参数是否为空串行(NIL)。 ATOM, LISTP, NUMBERP, ZEROP CODE: (ATOM 参数) (LISTP 参数) (NUMBERP 参数) (ZEROP 参数)

CADLISP函数

CADLISP语言 数据类型 1.表 2.文件描述符 3.实体名 4.选择集 5.内部函数(Auto LISP子程序) 赋值与数值计算函数 1.(1+ 数) 加1函数 2.(1- 数) 减1函数 3.(abs 数)求绝对值 4.(max数数……)求最大数 5.(min数数……)求最小数 6.(sqrt数)求平方根 7.(expt数幂)乘方 8.(exp 幂)e的任意次方 9.(log数)对数 10.(sin 角)正弦函数 11.(cos角)余弦 12.(atan数1[数2])反正切函数 13.(rem数1 数2)求余数 14.(gcd数数……)最大公约数 15.(~ 整数)求补注:用pi表示圆周率π 16.(logand数数……)按位逻辑”与”函数 17.(logior数数……)按位逻辑”或”函数 18.(~ 数)按位逻辑”非”函数 19.(and 表达式……)逻辑”与”函数 20.(or 表达式……)逻辑”或”函数 21.(not 表达式)逻辑”非”函数 22.(lsh 数位数)位移函数 23.(boole 方式数1 数2……)布尔运算。方式有16种,如1为and,6为xor(异或),7为or,8为not等。 24.(= 原子原子……)等于函数 25.(/= 原子原子)不等于函数 26.(< 原子原子)小于函数 27.(<= 原子原子)小于等于函数 28.(> 原子原子)大于函数 29.(>= 原子原子)大于等于函数 30.(atom 项)原子测试

31.(listp 项)表测试 32.(boundp 原子)原子值测试 33.(null 项)空测试 34.(numberp 项)数值测试 35.(minusp 项)负值测试 36.(zerop 项)零测试 37.(eq 式1 式2)相同表达式测试 38.(equal式1 式2)相等测试 39.(wcmatch 字符串模式)字符匹配测试 分支与循环 1.(if 条件式1[式2])若条件为真,则执行式1;否则执行式2。 2.(cond(条件1 式1……)(条件2 式2……)……)分支函数。如:(cond((minusp a)(- a))(T a))求a的 绝对值。注:cond是AutoLISP中最基本的条件函数,由它为核心构成的自定义函数可以实现循环和递归等功能。 3.(repeat 次数式1 式2 ……)重复函数。将多个表达式重复执行多次。 4.(while 条件式1 式2 ……)循环函数。条件为真,执行表达式。否则结束循环。如:(setq s 0 a 1)(while(< a 101)(setq s(+ s a))(setq a(1+ a)))(print s) 计算0~100之间所有整数的和。 5.(progn 式1 式2 ……)求多个表达式值函数。在只能用一个表达式的地方,使用他可完成多个表达式的计算。 如if 语句中 字符串与类型转换函数 1.(ascii 字符串)ASCII码转换 2.(chr 整数)字符转换 3.(strcat 字符串……)字符串连接 4.(strlen 字符串……)字符串长度测试 5.(substr 字符串起点 [长度])取子字符串。如果不设置长度,则取到最后一个字符。 6.(strcase 字符串 [方式])字符串大小写转换。若指定了方式且非空(NIL),则把所有的字母转换为小写; 否则转换为大写。 7.(float 数)整型变实型 8.(fix 数)实型变整型 9.(itoa 整型数)整型变字符串 10.(atoi 字符串)字符串变整型 11.(atof 字符串)字符串变实型 12.(angtos 角方式精度)角度单位转换。“角”是以弧度为单位的实数,转换为其它单位,返回一个字符串。 该字符串是以“方式”和“精度”的要求,按AutoCAD的系统变量UNITMODE(单位模式)对“角”进行处理得到的,“精度”为小数点后的位数。“方式”有:0为度,1为度/分/秒,2为梯度,3为弧度等。 13.(rtos 数方式精度)实数计数制转换。方式:1为科学计数法,2为十进制,3为工程制(英寸与小数英寸), 4为建筑制(英寸与分数英寸) 14.(cvunit 值旧单位新单位)单位制转换。单位名称可以是acad.unt文件中给出的任意单位格式,否则返回 NIL (trans 点旧坐标系新坐标系)坐标转换。坐标:0为WCS(世界坐标系),1为UCS(用户坐标系),2为DCS(显示坐标系) 表处理函数 1.(quote 表达式)引用函数。作用:告诉程序不要对后面的表达式求值。如:(quote(x y z))可简写为’ (x y z) 2.(car 表)取表中的第一个元素 3.(cdr 表)取子表函数。返回除第一个元素以外的所有元素组成的新表 4.由car与cdr组合而成的函数

常用有关对话框-AutoLISP函数

1.装入指定的DCL文件的函数load_dialog 格式:(load_dialogdclfile) 功能:在AutoCAD的搜索路径上寻找指定的DCL 文件并载入文件。与unload_dialog函数相对应。 2.卸载指定的DCL文件的函数unload_dialog 格式:(unload_dialogdcl_id) 功能:根据指定的DCL 文件句柄将相关联的DCL 文件从内存中卸掉。 其中,dcl_id表示的是DCL 文件句柄,用来标识DCL 文件。 3.初始化对话框函数new_dialog 格式:(new_dialogdlgnamedcl_id [action [screen-pt]]) 功能:初始化一个新的对话框并显示它,同时指定一个默认的动作。 其中,dlgname是新对话框名称;dcl_id是用load_dialog所取得的值,用来标识DCL 文件。用户可以为对话框定义一个默认动作,即格式中的action。screen_pt指定的是对话框的左上角在屏幕上的坐标,这也是可选项。用这一项可以使对话框在先前的关闭位置重新打开。 4.启动对话框的函数start_dialog 格式:(load_dialogdclfile) 功能:开始对话框并接受用户输入。 它必须在调用了new_dialog后才能调用,其返回值是一个传递给done_dialog的整数。用户按下了“OK”键,其值为1;按下“CANNEL”键,其值为0;如果所有的对话框都被term_dialog 终止,则返回-1 值。 5.终止显示当前对话框函数done_dialog 格式:(done_dialog [status]) 功能:停止显示对话框,该对话框为前一个new_dialog所指定的对话框。 其中,status 可有可无,有则必为一个正整数,该参数作为函数(start_dialog) 的返回值,以代替按钮的返回值。(done_dialog) 会返回一个表示对话框位置的二维点,可供后续的函数调用。 6.终止当前所有对话框的函数term_dialog 格式:(term_dialog) 功能:用于终止嵌套对话框。 如果应用程序在DCL 文件打开时终止运行,系统会自动调用该函数。 7.动作表达式初始化函数action_tile 格式:(action_tile key action_expression) 功能:使用用户定义的动作代替对话框中的默认动作或代替控件的动作属性。 其中,key 是一个字符串,它用来命名一个控件。action_expression也是一个字符串,用来命名动作表达式。 8.设置指定控件值的函数set_tile

AutoLisp功能函数大全

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

AutoLISP基础入门案例,很受用

单元一:AutoLISP主角潇洒登场 一. AutoLISP 是何方神圣? 1.AutoLISP是AutoCAD的最佳拍檔! 2.AutoLISP内含于AutoCAD软件内,不用另外花钱买! 3.AutoLISP是强化AutoCAD最好、最直接的『程序语言』! 4.AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短 的时间内,写出令人惊讶、赞叹的功能! 5.若说AutoLISP的出现,是替AutoCAD 创造一片天的『最大功臣』,实不 为过一点也不夸张! 6.AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅 力无穷! 二. AutoLISP 程序语言的特质分析: 学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序! 三.撰写AutoLISP 的动机? 1.欲强化AutoCAD 原有指令时. 2.欲创造更有用的AutoCAD 新指令. 3.欲简化繁琐的环境设定或绘图步骤时. 4.欲处理参数式绘图时.

5.欲做图面资料读文件、写文件. 6.欲做AutoCAD 简报展示时. 7.欲达到真正灵活掌控AutoCAD 时. 8.欲提升自己跨上AutoCAD 高手列车时. 四.AutoLISP 的效益评估? 1. 对公司负责人或设计主管而言: A. 也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沈思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』! B.若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受 训,学习更好的设计技巧与创意呢?! C.千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍 了公司计算机化进步的罪魁祸首 D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关AutoCAD 支持软件。 2. 对设计人员而言:

lisp对话框

目录 第一篇.基本知识 (2) 第1节基本知识 (2) 第2节定义档 (2) 第3节批注 (3) 第4节对话框定义文件的内容模式 (3) 第5节练习 (4) 第二篇开启对话框 (5) 第1节AutoLISP函数加载DCL定义文件函数 (5) 第2节对话框开启方式 (6) 第3节编辑框组件(edit_box) (6) 第4节练习 (7) 第三篇设定及取得对话框组件内的值 (8) 第1节AutoLISP函数设定组件的值 (8) 第2节练习 (9) 第3节练习 (9) 第4节AutoLISP函数组件指定动作 (10) 第四篇按钮及核取框(切换钮) (11) 第1节按钮组件(button) (11) 第2节核取框(切换钮)组件(toggle) (12) 第3节练习 (12) 第五篇横列、直行、空白及文字组件 (15) 第1节横列(row)及直行(column)组件 (15) 第2节空白(spacer)组件 (15) 第3节字符串组件(text) (17) 第4节文字段落组件(paragraph) (17) 第六篇滑杆(滚动条)组件 (18) 第1节滑杆(滚动条)组件(slider) (18) 第2节练习 (19) 第七篇按钮及影像按钮组件 (21) 第1节自订按钮 (21) 第2节练习 (22) 第八篇清单选框 (25) 第1节清单选框组件(list_box) (25) 第2节AutoLISP函数开始处理清单选框或弹出式选框 (25) 第3节练习 (26) 第九篇下拉(弹出)式清单选框 (29) 第1节下拉式(弹出式)清单选框组件(popup_list) (29) 第2节练习 (30) 第十篇选台钮组件 (32) 第1节选台钮组件(radio_button) (32) 第2节练习 (33)

AutoLISP 函数大全

一、数学运算功能函数 l(+数值数值…) 返回:累计实数或整数数值 2(-数值数值…) 返回:差值 3(*数值数值…) 返回:所有数值乘积 4(/数值数值…) 返回:第一个数值除以第二个以后数值的商 5(l+ 数值) 返回:数值+l 6(1- 数值) 返回:数值-l 7(abs数值) 返回:数值的绝对值 8(atan数值) 返回:反正切值 9(cos角度) 返回:角度的余弦值,角度值为弧度 10(exp数值) 返回:数值的指数 11(expt底数指数) 返回:底数的指数值 12(fix数值) 返回:将数值转换为整数值 13(float数值) 返回:将数值转换为实数值 14(gcd数值1数值2) 返回:两数值的最大公因数 15(log数值) 返回:数值的自然对数值 16(max数值数值…) 返回:数值中的最大值 17(min数值数值…) 返回:数值中的最小值 18pi 常数∏,其值约为3.1415926 19(rem数值1数值2) 返回:M数值的相除的余数 20(sin角度) 返回:角度的正旋值,角度值为弧度 21(sqrt数值) 返回:数值的平方根 二、检验与逻辑运算功能函数 l(=表达式1表达式2) 比较表达式1是否等于式2,适用数值及字符串 2(/=表达式1表达式2) 比较表达式1是否大于等于表达式2 3(<表达式1表达式2) 比较表达式1是否<小于表达式2 4(<=表达式1表达式2) 比较表达式1是否<一小于等于表达式2 5(>表达式1表达式2) 比较表达式1是否>大于表达式2 6(>=表达式1表达式2) 比较表达式1是否大于等于表达式2 7(~数值) 返回:数值的位not值,(1的补码) 8(and表达式1表达式2…) 返回:逻辑and的结果 9(boole函数整数整数…) 返回:位式布尔运算 10(eq表达式1表达式2) 比较表达式1与表达式2是否相同,适用列表比较(实际相同) 11(equal表达式1表达式2[差量])比较表达式1与表达式2是否相同,差量可省略(内

相关文档