图形数据编辑函数.ppt

上传人:za****8 文档编号:13208009 上传时间:2020-06-08 格式:PPT 页数:46 大小:270.51KB
返回 下载 相关 举报
图形数据编辑函数.ppt_第1页
第1页 / 共46页
图形数据编辑函数.ppt_第2页
第2页 / 共46页
图形数据编辑函数.ppt_第3页
第3页 / 共46页
点击查看更多>>
资源描述
第八章图形数据编辑函数,8.1基本概念8.1.1实体实体是AutoCAD预定义的图形元素,也成图形。实体类型名有POINT、LINE、CIRCLE、ARC、TEXT等。在AutoCAD中有一些实体为复杂实体,例如带属性的插入块和多义线。每个复杂实体在图形中都有一个主实体和若干个子实体。主实体和子实体都有实体类型名。8.1.2实体名实体名实际上是一个指向AutoCAD图形编辑程序维护的文件指针,通过该指针,AutoCAD能够找到该实体在当前图形数据库中的记录和向量(例如在屏幕显示)实体名在不同的图形编辑期间是变化的。(type实体名)返回ENAME8.1.3实体标号实体标号是唯一的、固定不变的标识符,在不同的图形编辑期间不变,与实体一起存入图形文件。,8.1.4选择集是实体的有序集合。(type选择集)返回PICKSET注意:实体名和选择集只能从图形编辑期间从AutoCAD获得,并且在图形编辑期间才有效,当退出AutoCAD的图形编辑状态,他们被自动删除。只有实体标号和实体一起存入图形文件。在AutoCAD2000中,一个AutoLISP应用程序最多有128个选择集,不同版本个数不同。8.2选择集操作函数(ssgetsel-methodpt1pt2pt-listfilter-list)选择集中可以包含图纸空间和模型空间两个空间中的对象,但该选择集用于其操作时,那些在当前无效的空间中的对象会被ssget过滤掉。由ssget函数返回的选择集中仅包含主图元(不包含属性和多段线顶点)。参数sel-method字符串,指定对象选择方法。,说明:(ssgetpt1)如果几个实体过点pt1,也只选择一个实体。(ssgetL)可见最后生成的实体,不一定是最后生成的实体。,pt1、pt2和pt-list二维和三维点等效,所谓通过和相交是在构造平面上的投影。例如:(setqp1(0.0,0.0)p2(5.05.0)p3(4.01.0)(setqss(ssgetF(listp1p2p3)当选择集不再使用时,把它设为nil,释放内存。(setqssnil)8.2.1.1选择集过滤器表filter-list图元过滤器表是一个使用DXF组码的关联表,其格式与由entget返回的表的格式相同。除了图元名(组码-1)、句柄(组码5)和扩展数据代码(大于1000的组码)以外,函数ssget可识别其他所有组码。如果在过滤器表中使用了无效的组码,则ssget将其忽略。要想用扩展数据搜索对象,可使用组码-3。,例题:(setqss(ssget(0.TEXT)或(setqss(ssget(list(cons0TEXT)(setqlaynameFLOOR)(setqs(ssgetx(list(cons0CIRCLE)(cons8layname)提示用户选择要加入选择集的对象:(ssget)创建通过点(2,2)的对象的选择集:(ssget(22)创建一个选择集,该选择集由最近所选择的对象组成:(ssget_P)创建一个选择集,该选择集由交叉窗选而成,交叉窗口的对角顶点是(0,0)和(1,1):(ssget_C(00)(11),创建一个选择集,该选择集由从(0,0)到(5,5)的窗口中包含的所有对象组成:(ssget_W(00)(55)通过指定过滤器,可以获得由指定类型、图层或颜色的所有对象构成的选择集。下例返回的选择集仅包含隐含选择集中的蓝色直线(这些对象是在PICKFIRST有效时选取的):(ssget_I(0.LINE)(62.5)下例中需要将点表传递给ssget函数。pt_list变量不能包含定义零长度线段的点。创建点表:(setqpt_list(11)(31)(52)(24)创建一个选择集,该选择集由pt_list所定义的多边形包含或与之相交的所有图元组成:(ssget_CPpt_list)创建一个选择集,该选择集由pt_list所定义的多边形包含的所有蓝色线段组成:(ssget_WPpt_list(0.LINE)(62.5),8.2.1.2过滤表中的通配符与函数wcmatch相同。通配符定义#(磅值符号)匹配任意单个数值字符(at)匹配任意单个字母字符.(句号)匹配任意单个非字母数值字符*(星号)匹配任意字符序列,包括空字符串,它可以出现在任何位置,包括开头、中间和结尾处?(问号)匹配任意单个字符(波浪号)如果它是模式字符串的第一个字符,则匹配除此字符串之外的任意字符串.匹配括号中的任意一个字符,如“FLR1-5,8.匹配不在括号中的任意单个字符如A-G,X-Z-(连字符)用在括号里面,用来指明单个字符的取值范围,如1-5,(逗点)分隔两个模式字符串(单引号)特殊转义字符(按字义读取随后的字符)*,*,例如(ssgetX(6.DASH*)8.2.1.3过滤表的关系运算符如果没有指定关系运算符,对过滤器中的每一项都隐式使用等式测试。对于数字组(整数、实数、点和矢量),通过-4组码指定一种关系。4组码的值是字符串,指定过滤器表中下一组的测试运算符。,按位运算符“设置e1为图形中一个图元的名称(setqe2(entnexte1);设置e2为e1后的图元的名称注意ssget函数所形成的选择集中只包含主图元,不包含块属性或多段线顶点。可以通过调用entnext函数遍历复杂图元的子图元来访问复杂图元的内部结构。获取子图元名后,可以象处理其他图元一样处理子图元。获取子图元名后,还可以用以下方法找到它的主图元:调用entnext函数直至找到SEQEND图元,该图元的-2组中即包含了它的主图元名。,8.4.2返回图形中最后那个未删除的主对象(图元)名称(entlast)entlast函数经常用于获得刚用command函数加入到图形中的新图元的图元名。该函数选择的图元不一定要显示在屏幕上,也不一定要处于解冻状态。返回值对象名称。如果当前图形中没有对象,则返回nil。样例将变量e1设为添加到图形中的最后一个图元的名称:命令:(setqe1(entlast)如果应用程序需要最后那个未删除图元(主图元或子图元),可用以下函数代替entlast。,(defunlastent(/ab)(if(setqa(entlast)获取最后一个主图元(while(setqb(entnexta)如果随后有子图元,循环(setqab)直至最后一个子图元)a返回最后一个主图元)或子图元8.4.3提示用户通过指定一个点来选择单个对象(图元)(entselmsg)参数msg用于提示用户的字符串。如果省略该参数,则提示信息为“选择对象”。返回值表,其中第一个元素是用户所选对象的图元名,第二个元素是用户选择对象时指定的拾取点的坐标值(用当前UCS表示)。entsel函数返回的拾取点不一定在所选对象上,它返回的是选择对象时十字光标的位置。拾取点和对象之间的关系依赖于拾取框的尺寸和当前缩放比例。,样例下面的AutoCAD命令说明了entsel函数的使用方法及其返回的表:命令:line起点:1,1下一点:6,6下一点:ENTER命令:(setqe(entsel请选择一个对象:)请选择一个对象:3,3(3.03.00.0)有时候在操作一个对象时,不但需要选中一个对象,同时还需要知道指定的点。例如在AutoCAD中的ObjectSnap以及BREAK、TRIM和EXTEND命令中就是这样。entsel使得AutoLISP程序可以实现这种操作。它通过选取点的方式来选取单个对象。entsel函数支持它前面通过调用initget函数设置的关键字(区分关键词和临时捕捉方式,临时捕捉方式优先)。,命令:(initgetEnd)nil命令:(setqen(entseln选择实体:)选择实体:eEnd命令:(initgetEnd)nil命令:(setqen(entseln选择实体:)选择实体:end于(250.16587.41750.0)命令:,命令:line指定第一点:4,4指定下一点或放弃(U):6,4指定下一点或放弃(U):命令:(setqen(entsel)选择对象:5.5,4(5.54.00.0)命令:break选择对象:!en或(list(entlast)(5.54.00.0)(5.54.00.0)指定第二个打断点或第一点(F):5.4,4命令:,8.4.4根据对象(图元)的句柄返回它的对象(图元)名(handenthandle)handent函数既可以返回图形对象的名称,又可以返回非图形对象的名称。参数handle表示图元句柄的字符串。返回值如果调用成功,handent函数返回在当前编辑任务期间与该图元句柄相关联的图元名。如果传给handent函数一个没有被当前图形的任何图元使用的句柄,它会返回nil。handent函数可以返回在当前编辑任务期间被删除的对象的名称,然后用户可以调用entdel函数恢复它。在不同的编辑任务期间同一个图元的对象名可能会不同,但图元的句柄却保持不变。(AutoCAD2000中系统变量handles为只读)样例命令:(handent5A2)在不同的编辑任务中对同一个图形同样地执行上述代码,可能会返回不同的图元名。一旦获取到图元名,就可以用它调用与图元有关的函数来处理该图元。,5.4实体数据函数获得对象(图元)的定义数据(entgetenameapplist)参数ename要查询的图元的名称。ename可以为图形或非图形图元。applist注册应用名的列表。返回值包含了ename对象定义数据的关联表,这同时适用于图形对象和非图形对象。如果指定了可选参数applist,entget函数还会返回与这些应用名相关的扩展数据。该关联表中的每一项都被指定了一个AutoCAD的DXF组码,来描述图元数据的各种性质。请注意AutoLISP所用的DXF组码与DXF文件中的组码稍有不同。关于AutoLISP的DXF组码的详细信息,请参见DXFReference。,样例在本例中,当前图形应用下列(缺省)条件:图层为0线型为CONTINUOUS(连续)标高为0用户用下列命令绘制了一条直线。命令:line指定第一点:1,2指定下一点:6,6指定下一点:ENTER,应用程序调用下列的AutoLISP函数可获取并打印该直线的定义数据:(defunC:PRINTDXF()(setqent(entlast);设置ent为最新图元(setqentl(entgetent);设置entl为最新图元的数据关联表(setqct0);设置ct(计数器)为0(textpage);切换到文本屏幕(princnentgetoflastentity:)(repeat(lengthentl);重复次数为表中成员数(print(nthctentl);表中每个成员后换行(setqct(1+ct);计数器加一)(princ);静默退出),打印结果如下:entgetoflastentity:(-1.)图元名(0.LINE)图元类型名(330.)图元名(5.69)句柄(100.AcDbEntity)子类标记(67.0)空间(410.Model)空间(8.0)图层名(100.AcDbLine)图元类型名(101.02.00.0)线段起点(116.06.00.0)线段终点(2100.00.01.0)延伸方向,;计算地板采暖的管长(defunc:len(/slienpt1pt2)(setqs(ssget(0.LINE)(ifs(progn(setql0.0i-1)(while(setqi(1+i)en(ssnamesi)(setqpt1(cdr(assoc10(entgeten)(setqpt2(cdr(assoc11(entgeten)(setqpt1(transpt1en1)pt2(transpt2en1);转换为用户坐标(setqpt1(list(carpt1)(cadrpt1);变二维(setql(+l(distancept1pt2)(princn管长:)(princl)(princ),8.5.2修改对象(图元)的定义数据(entmodelist)entmod函数更新由elist的-1组中指定的图元名的数据库信息。AutoLISP更新数据库信息的基本方法是,先用entget函数获得图元的定义数据,修改定义图元的表,然后用entmod函数来更新数据库中的图元。entmod函数既可以修改图形对象,又可以修改非图形对象。参数elist与entget函数返回表相同格式的表对于那些使用浮点值的图元域(如厚度),entmod函数可以接受整数,并将其转换成浮点数。与此类似,对于使用整数的图元域(如颜色代码),如果提供的是浮点数,entmod函数会切除其小数部分,将其转换成整数。返回值如果成功,则entmod返回elist。如果entmod不能修改指定图元,则函数返回nil。,样例下列命令获取图元的特性,然后修改图元。将变量en1的值设置为图形中的一个图元的名称:命令:(setqen1(entnext)将图元en1的图元数据保存在变量ed中:命令:(setqed(entgeten1)(-1.)(0.CIRCLE)(5.4C)(100.AcDbEntity)(67.0)(8.0)(100.AcDbCircle)(103.453736.216350.0)(40.2.94827)(2100.00.01.0)将ed中的图层组从图层0改为图层1:命令:(setqed(subst(cons81)(assoc8ed)ed)(-1.)(0.CIRCLE)(5.4C)(100.AcDbEntity)(67.0)(8.1)(100.AcDbCircle)(103.453736.216350.0)(40.2.94827)(2100.00.01.0)修改图形中en1图元的图层:命令:(entmoded)(-1.)(0.CIRCLE)(5.4C)(100.AcDbEntity)(67.0)(8.1)(100.AcDbCircle)(103.453736.216350.0)(40.2.94827)(2100.00.01.0),entmod的使用限制关于entmod函数所作的修改有一些限制:不能改变一个图元的类型和句柄。如果一定要这样做,只能先调用entdel函数删除它,然后调用command或entmake函数创建新图元。entmod函数不能修改内部域,如SEQEND图元的-2组中的图元名,如果试图作这样的修改,将会被系统忽略。不能使用entmod函数修改视口图元(viewport)。可以将图元的空间可见性改为0或1(视口对象除外)。如果用entmod函数修改了块定义中的图元,该修改会影响图形中该块的所有实例。在用entmod函数修改顶点图元前,应先读出或写入多段线的头部。如果最近处理的多段线图元不是该顶点所在的多段线,可能会丢失宽度信息(40和41组)。警告!可以用entmod函数修改块定义中的图元,但这样做可能会生成引用自身的块,导致AutoCAD系统崩溃。,用entmod修改主实体时,修改结果会显示在屏幕上显示出来,当修改子实体时,修改结果不会显示在屏幕上,必须调用entupd函数。elist中的文字样式、线性、行和块在当前图形中被定义,但参照的层可以没被定义(entmod可以利用缺省值创建一个新层),;改变所选择的文本度(defunc:chgtext(/ssindextxhel)(setqss(ssget(0.TEXT)(setqindex0)(initget(+124)(setqtxh(getdistn输入新的字高:)(ifss(repeat(sslengthss)(setqel(entget(ssnamessindex)index(1+index)(setqel(subst(cons40txh)(assoc40el)el)(entmodel)(princ),8.5.3更新对象(图元)的屏幕显示(entupdename)参数ename需要更新的图元的名称。返回值更新的图元(ename)。如果无可更新,则返回nil。更新多段线和块如果使用entmod修改多段线顶点或块属性,则在屏幕上不会更新全部图元。entupd函数可以在屏幕上更新修改后的多段线或块。以多段线或块的任一部分的图元名为参数,都可以调用该函数。该函数重新生成屏幕上的该图元(包含所有子图元)。注意如果对嵌套图元(块内的图元)或包含嵌套图元的块使用entupd函数,则有些图元可能不能重生成。要确保顺利完成重生成操作,必须调用REGEN命令。,样例假定图形中的第一个图元是有若干个顶点的三维多段线,那么下面的代码可以修改并重新显示多段线:(setqe1(entnext);将e1设为多段线的图元名(setqe2(entnexte1);将e2设为第一个顶点(setqed(entgete2);将ed设为顶点数据(setqed(subst(101.02.0)(assoc10ed);将ed中顶点的位置ed;修改为(1,2)(entmoded);移动图形中的顶点(entupde1);重生成多段线图元e1,8.5.4删除对象(图元)或恢复先前删除的对象(entdelename)如果由ename参数指定的图元当前在图形中,则删除该图元。如果在本次编辑任务中该图元已被删除,entdel函数将恢复该图元。只有在图形退出图形编辑环境时,被删除的图元才会真正从图形中清除。entdel函数既可以删除图形对象,又可以删除非图形对象。参数ename要删除或恢复的图元的名称。返回值图元名。使用说明entdel函数仅能处理主图元。属性和多边形的顶点不能独立于它们的父图元而被删除。可以通过调用command函数执行ATTEDIT或PEDIT命令来修改子图元。不能删除块定义中的图元。但可以调用entmake函数来完全重新定义一个块,以去掉想要删除的图元。,样例获取图形中第一个图元的名称并将其指定给变量e1:命令:(setqe1(entnext)删除名为e1的图元:命令:(entdele1)恢复名为e1的图元:命令:(entdele1),8.6符号表处理函数,8.6.1在符号表中查找下一项(tblnexttable-namerewind)重复使用tblnext时,它每次通常会返回指定表中的下一个条目。tblsearch函数可以设置要检索的下一个条目。如果提供了可选参数rewind且其值不为nil,那么函数就会回绕到该符号表的起始位置,从而获得它的第一个条目。参数table-name字符串,指定符号表。有效的table-name值为LAYER、LTYPE、VIEW(命名的视图表)、STYLE、BLOCK、UCS、APPID(注册的应用表)、DIMSTYLE和VPORT(视区表)。该参数不区分大小写。rewind如果指定该参数且其值不为nil,则回绕符号表且检索其中的第一个条目。返回值如果找到了一个条目,函数就会以点对表的形式返回该条目的DXF类型码和值。如果符号表中没有条目了,函数返回nil。本函数不会返回已被删除的条目。,样例检索符号表中的第一个图层:命令:(tblnextlayerT)(0.LAYER)(2.0)(70.0)(62.7)(6.CONTINUOUS)返回值的含义如下:(0.LAYER)符号类型(2.0)符号名(70.0)标志(图层的开、关、冻结、解冻)(62.7)颜色代码,如果图层是被关闭的,颜色代码为负值(6.CONTINUOUS)线型名称注意上述返回表中没有-1组。AutoCAD会记住从每个符号表中最近一次所返回的条目,每次对某符号表调用tblnext函数时它会返回该表中的下一个条目。所以,每次开始扫描一个表时,应该确保提供了不为nil的第二个参数,这样才能回绕到数据库中该表的开头,从而获得该表中的第一个条目。,由块表中检查出的条目中包含了一个-2组,其组值是该块定义中的第一个图元的图元名(如果有的话)。因此,假定当前图形中有一个名为BOX的块,那么:命令:(tblnextblock)(0.BLOCK)(2.BOX)(70.0)(109.02.00.0)(-2.)返回值的含义如下:(0.BLOCK)符号类型(2.BOX)符号名(70.0)标志(109.02.00.0)原点坐标X,Y,Z(-2.)第一个图元entget和entnext函数可以接受-2组中的图元名,但其他的图元访问函数不接受该图元名。例如,不能用ssadd函数将其加入到一个选择集中。通过以-2组中的图元名为参数调用entnext函数,可以扫描组成块定义的各个图元。在块定义的最后一个图元之后,再调用entnext函数将返回nil。如果一个块定义中不包含图元,那么tblnext函数所返回的-2组的组值是该块的endblk图元的图元名。注意由于vports函数可以返回当前VPORT表信息,所以使用vports函数来检索VPORT信息可能比用tblnext函数更方便一些。,LAYERgroupcodesGroupcodeDescription100Subclassmarker(AcDbLayerTableRecord)2Layername70Standardflags(bit-codedvalues):1=Layerisfrozen;otherwiselayeristhawed.2=Layerisfrozenbydefaultinnewviewports.4=Layerislocked.16=Ifset,tableentryisexternallydependentonanxref.32=Ifthisbitandbit16arebothset,theexternallydependentxrefhasbeensuccessfullyresolved.64=Ifset,thetableentrywasreferencedbyatleastoneentityinthedrawingthelasttimethedrawingwasedited.(ThisflagisforthebenefitofAutoCADcommands.ItcanbeignoredbymostprogramsthatreadDXFfilesandneednotbesetbyprogramsthatwriteDXFfiles.)62Colornumber(ifnegative,layerisoff)6Linetypename290Plottingflag.Ifsetto0,donotplotthislayer370Lineweightenumvalue390HardpointerID/handleofPlotStyleNameobject,BlockgroupcodesGroupcodeDescription0Entitytype(BLOCK)5Handle102Startofapplication-definedgroupapplication_name.Forexample,ACAD_REACTORSindicatesthestartoftheAutoCADpersistentreactorsgroup.(optional)application-definedcodesCodesandvalueswithinthe102groupsareapplicationdefined(optional)102Endofgroup,(optional)330Soft-pointerID/handletoownerobject100Subclassmarker(AcDbEntity)8Layername100Subclassmarker(AcDbBlockBegin)2Blockname,70Block-typeflags(bitcodedvalues,maybecombined):1=Thisisananonymousblockgeneratedbyhatching,associativedimensioning,otherinternaloperations,oranapplication.2=Thisblockhasnon-constantattributedefinitions(thisbitisnotsetiftheblockhasanyattributedefinitionsthatareconstant,orhasnoattributedefinitionsatall).4=Thisblockisanexternalreference(xref).8=Thisblockisanxrefoverlay.16=Thisblockisexternallydependent.32=Thisisaresolvedexternalreference,ordependentofanexternalreference(ignoredoninput).64=Thisdefinitionisareferencedexternalreference(ignoredoninput).10BasepointDXF:Xvalue;APP:3Dpoint20,30DXF:YandZvaluesofbasepoint3Blockname1Xrefpathname4Blockdescription(optional),8.6.2在指定的符号表中搜索符号名(tblsearchtable-namesymbolsetnext)参数table-name字符串,表示要搜索的符号表。该参数不区分大小写。symbol字符串,表示要搜索的符号。该参数不区分大小写。setnext如果指定该参数且其值不为nil,tblnext函数的条目计数器就会被调整,这样,随后调用tblnext函数时,它就会返回由该tblsearch调用所返回的那个条目之后的条目。否则,tblsearch不影响tblnext检索的条目的顺序。返回值如果tblsearch函数找到了符号名为指定符号名的一个条目,它就会以与tblnext函数相同的格式返回该条目。如果没有找到这样的条目,它返回nil。样例下面的命令搜索名为“standard”的文字样式:命令:(tblsearchstylestandard)(0.STYLE)(2.STANDARD)(70.0)(40.0.0)(41.1.0)(50.0.0)(71.0)(42.0.3)(3.txt)(4.),;定义一个函数,调用它时,返回一个表,包含指定符号表中的所有符号名(defuntblname(tbl/newtblnames)(setqnew(cdr(assoc2(tblnexttblt)(whilenew(setqtblnames(consnewtblnames)new(cdr(assoc2(tblnexttbl)tblnames),plinetype系统变量类型:整数型保存位置:注册表初始值:2指定AutoCAD是否使用优化的二维多段线。PLINETYPE控制如何使用PLINE命令创建新多段线以及是否转换早期版本图形中的现有多段线。0打开旧图形时不转换其中的多段线;PLINE创建旧格式的多段线(图元类型为POLYLINE)1打开旧图形时不转换其中的多段线;PLINE创建优化的多段线(图元类型为LWPOLYLINE)2打开旧图形时转换其中的多段线;PLINE创建优化的多段线,优化AutoCADR13或早期版本创建的二维多段线和关联填充自R14版起,AutoCAD以一种优化格式创建二维多段线和关联填充,这种优化格式可以节省内存和磁盘空间。请使用CONVERT命令更新AutoCADR13及其早期版本创建的填充图案或多段线。命令行:convert输入要转换的对象类型图案填充(H)/多段线(P)/全部(A):输入h转换图案填充、p转换多段线、a都转换图案填充转换图形中的所有图案填充。输入对象选择选项选择(S)/全部(A):输入s选择要转换的特定对象,输入a转换图形中的所有对象多段线转换图形中的所有多段线。输入对象选择选项选择(S)/全部(A):输入s选择要转换的特定对象,输入a转换图形中的所有对象全部转换图形中的所有图案填充以及多段线。输入对象选择选项选择(S)/全部(A):输入s选择要转换的特定对象,输入a转换图形中的所有对象AutoCAD将显示以下消息中的一个或两个:几个图案填充对象已转换几个多段线对象已转换,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!