图形数据编辑函数.ppt
《图形数据编辑函数.ppt》由会员分享,可在线阅读,更多相关《图形数据编辑函数.ppt(46页珍藏版)》请在三一办公上搜索。
1、第八章图形数据编辑函数,8.1基本概念实体实体是AutoCAD预定义的图形元素,也成图形。实体类型名有POINT、LINE、CIRCLE、ARC、TEXT等。在AutoCAD中有一些实体为复杂实体,例如带属性的插入块和多义线。每个复杂实体在图形中都有一个主实体和若干个子实体。主实体和子实体都有实体类型名。实体名实体名实际上是一个指向AutoCAD图形编辑程序维护的文件指针,通过该指针,AutoCAD能够找到该实体在当前图形数据库中的记录和向量(例如在屏幕显示)实体名在不同的图形编辑期间是变化的。(type 实体名)返回 ENAME实体标号实体标号是唯一的、固定不变的标识符,在不同的图形编辑期间
2、不变,与实体一起存入图形文件。,选择集是实体的有序集合。(type 选择集)返回 PICKSET注意:实体名和选择集只能从图形编辑期间从AutoCAD获得,并且在图形编辑期间才有效,当退出AutoCAD的图形编辑状态,他们被自动删除。只有实体标号和实体一起存入图形文件。在AutoCAD2000中,一个AutoLISP应用程序最多有128个选择集,不同版本个数不同。8.2选择集操作函数(ssget sel-method pt1 pt2 pt-list filter-list)选择集中可以包含图纸空间和模型空间两个空间中的对象,但该选择集用于其操作时,那些在当前无效的空间中的对象会被 ssget
3、过滤掉。由 ssget 函数返回的选择集中仅包含主图元(不包含属性和多段线顶点)。参数sel-method 字符串,指定对象选择方法。,说明:(ssget pt1)如果几个实体过点pt1,也只选择一个实体。(ssget L)可见最后生成的实体,不一定是最后生成的实体。,pt1、pt2和pt-list二维和三维点等效,所谓通过和相交是在构造平面上的投影。例如:(setq p1(0.0,0.0)p2(5.0 5.0)p3(4.0 1.0)(setq ss(ssget F(list p1 p2 p3)当选择集不再使用时,把它设为nil,释放内存。(setq ss nil)选择集过滤器表filter-
4、list图元过滤器表是一个使用 DXF 组码的关联表,其格式与由 entget 返回的表的格式相同。除了图元名(组码-1)、句柄(组码 5)和扩展数据代码(大于 1000 的组码)以外,函数 ssget 可识别其他所有组码。如果在过滤器表中使用了无效的组码,则 ssget 将其忽略。要想用扩展数据搜索对象,可使用组码-3。,例题:(setq ss(ssget(0.TEXT)或(setq ss(ssget(list(cons 0 TEXT)(setq layname FLOOR)(setq s(ssget x(list(cons 0 CIRCLE)(cons 8 layname)提示用户选择要加
5、入选择集的对象:(ssget)创建通过点(2,2)的对象的选择集:(ssget(2 2)创建一个选择集,该选择集由最近所选择的对象组成:(ssget _P)创建一个选择集,该选择集由交叉窗选而成,交叉窗口的对角顶点是(0,0)和(1,1):(ssget _C(0 0)(1 1),创建一个选择集,该选择集由从(0,0)到(5,5)的窗口中包含的所有对象组成:(ssget _W(0 0)(5 5)通过指定过滤器,可以获得由指定类型、图层或颜色的所有对象构成的选择集。下例返回的选择集仅包含隐含选择集中的蓝色直线(这些对象是在 PICKFIRST 有效时选取的):(ssget _I(0.LINE)(6
6、2.5)下例中需要将点表传递给 ssget 函数。pt_list 变量不能包含定义零长度线段的点。创建点表:(setq pt_list(1 1)(3 1)(5 2)(2 4)创建一个选择集,该选择集由 pt_list 所定义的多边形包含或与之相交的所有图元组成:(ssget _CP pt_list)创建一个选择集,该选择集由 pt_list 所定义的多边形包含的所有蓝色线段组成:(ssget _WP pt_list(0.LINE)(62.5),过滤表中的通配符与函数wcmatch相同。通配符定义#(磅值符号)匹配任意单个数值字符(at)匹配任意单个字母字符.(句号)匹配任意单个非字母数值字符*
7、(星号)匹配任意字符序列,包括空字符串,它可以出现在任何位置,包括开头、中间和结尾处?(问号)匹配任意单个字符(波浪号)如果它是模式字符串的第一个字符,则匹配除此字符串之外的任意字符串.匹配括号中的任意一个字符,如“FLR1-5,8.匹配不在括号中的任意单个字符如A-G,X-Z-(连字符)用在括号里面,用来指明单个字符的取值范围,如1-5,(逗点)分隔两个模式字符串(单引号)特殊转义字符(按字义读取随后的字符)*,*,例如(ssget X(6.DASH*)过滤表的关系运算符如果没有指定关系运算符,对过滤器中的每一项都隐式使用等式测试。对于数字组(整数、实数、点和矢量),通过-4组码指定一种关系
8、。4组码的值是字符串,指定过滤器表中下一组的测试运算符。,按位运算符“&”和“&=”只对值为整数的组有效。(integer_group&filter)/=0),也就是说 integer_group 屏蔽位中有任一位为 1 时,按位与“&”就为真。只有(integer_group&filter)=filter),也就是说 integer_group 所有屏蔽位全为 1 时,按位屏蔽相等“&=”才为真(在 integer_group 中可能也设置了其他位,但不作检测)。,说明对于点组,对X、Y、和Z坐标测试可以组合成单个字符串,只需将每个运算符用逗号分开,例如,*方向矢量(210组)只能使用“”、
9、“”、“!”运算符。不能用关系运算符测试字符串,而应该用通配符测试。例如(ssget X(0.CIRCLE)(-4.=)(40.2.0)选择集过滤器表的逻辑分组运算符通过逻辑分组运算符,可以创建更复杂的多层嵌套关系测试。选择集过滤器表中的分组运算符,分组运算符不分大小写。(ssget X(-4.)(-4.)(-4.OR)分组运算符不允许在-3 组中。-3 组中指定的多个应用程序名隐式地使用 AND 运算符。如果用其他分组运算符测试扩展数据,指定单独的-3 组并根据需要将其分组。要选择包含“APP1”或“APP2”应用程序之一(非全部)的扩展数据的所有圆,请输入下列内容:,(ssget X(0.
10、CIRCLE)(-4.)通过将后续分组运算符设置为符号,可以简化其编码方式。上一个样例可改写为下列代码(注意在下面的样例中必须显式地引用每个表):(setq(-4.XOR)(ssget X(list(0.CIRCLE),选择集操作函数1、测试选择集长度函数sselngth(sslength ss)返回选择集含主实体的个数,整型。ss 选择集,不能为nil2、实体名检索函数ssname(ssname ss index)返回选择集ss中第index(从零排,整型)个主实体名,若index为负数或大于选择集ss中最大的实体编号,返回nil。3、向选择集中加入新实体函数ssadd(ssadd enam
11、e ss)ename 实体名 ss 选择集1)(ssadd)返回一个空选择集2)(ssadd ename)返回只包含ename的选择集3)(ssadd ename ss)将ename加入到选择集ss中,并排在最后,同时返回加入实体后的选择集,同时ss为引用传递。如果ename已在ss中,ssadd无操作,且不报告任何错误信息。,例如:已知选择集ss的长度为3,en实体不在其中。(sslength ss)返回3(ssadd en ss)返回新的ss,没有必要写成(setq ss(ssadd en ss)(sslength ss)反回44、从选择集中移出实体函数ssdel(ssdel ename
12、ss)从选择集ss中移出实体ename,返回修改后的选择集。若实体ename不在ss中,ssdel返回nil。5、测试实体是否是选择集的成员函数ssmemb(ssmemb ename ss)若实体ename是选择集ss的成员,ssmemb返回ename,否则返回nil,8.3实体名和选择集和AutoCAD一起使用对于AutoCAD的实体选择提示,输入实体名和选择集(前加感叹号!)都是有效的。例题:命令:(setq ss(ssget x(0.LINE)(8.0)命令:erase选择对象:!ss(前加感叹号!)找到 3 个选择对象:命令:8.4实体名操作函数实体名搜索函数entnext,(entn
13、ext ename)返回图形中的下一个对象(图元)名参数ename 现有图元的名称。返回值如果不带参数调用 entnext 函数,它返回数据库中第一个未被删除的图元名。如果带参数 ename 调用该函数,它返回数据库中 ename 图元后的下一个未被删除的图元名。如果数据库中不存在下一个图元,它返回 nil。entnext 函数既可以返回主图元,又可以返回子图元。样例(setq e1(entnext);设置 e1 为图形中一个图元的名称(setq e2(entnext e1);设置 e2 为 e1 后的图元的名称 注意ssget 函数所形成的选择集中只包含主图元,不包含块属性或多段线顶点。可以
14、通过调用 entnext 函数遍历复杂图元的子图元来访问复杂图元的内部结构。获取子图元名后,可以象处理其他图元一样处理子图元。获取子图元名后,还可以用以下方法找到它的主图元:调用 entnext 函数直至找到 SEQEND 图元,该图元的-2 组中即包含了它的主图元名。,返回图形中最后那个未删除的主对象(图元)名称(entlast)entlast 函数经常用于获得刚用 command 函数加入到图形中的新图元的图元名。该函数选择的图元不一定要显示在屏幕上,也不一定要处于解冻状态。返回值对象名称。如果当前图形中没有对象,则返回 nil。样例将变量 e1 设为添加到图形中的最后一个图元的名称:命令
15、:(setq e1(entlast)如果应用程序需要最后那个未删除图元(主图元或子图元),可用以下函数代替 entlast。,(defun lastent(/a b)(if(setq a(entlast)获取最后一个主图元(while(setq b(entnext a)如果随后有子图元,循环(setq a b)直至最后一个子图元)a 返回最后一个主图元)或子图元 提示用户通过指定一个点来选择单个对象(图元)(entsel msg)参数msg 用于提示用户的字符串。如果省略该参数,则提示信息为“选择对象”。返回值表,其中第一个元素是用户所选对象的图元名,第二个元素是用户选择对象时指定的拾取点的坐
16、标值(用当前 UCS 表示)。entsel 函数返回的拾取点不一定在所选对象上,它返回的是选择对象时十字光标的位置。拾取点和对象之间的关系依赖于拾取框的尺寸和当前缩放比例。,样例下面的 AutoCAD 命令说明了 entsel 函数的使用方法及其返回的表:命令:line 起点:1,1 下一点:6,6 下一点:ENTER 命令:(setq e(entsel 请选择一个对象:)请选择一个对象:3,3(3.0 3.0 0.0)有时候在操作一个对象时,不但需要选中一个对象,同时还需要知道指定的点。例如在 AutoCAD 中的 Object Snap 以及 BREAK、TRIM 和 EXTEND 命令中
17、就是这样。entsel 使得 AutoLISP 程序可以实现这种操作。它通过选取点的方式来选取单个对象。entsel 函数支持它前面通过调用 initget 函数设置的关键字(区分关键词和临时捕捉方式,临时捕捉方式优先)。,命令:(initget End)nil命令:(setq en(entsel n选择实体:)选择实体:eEnd命令:(initget End)nil命令:(setq en(entsel n选择实体:)选择实体:end于(250.165 87.4175 0.0)命令:,命令:line指定第一点:4,4指定下一点或 放弃(U):6,4指定下一点或 放弃(U):命令:(setq e
18、n(entsel)选择对象:5.5,4(5.5 4.0 0.0)命令:break选择对象:!en 或(list(entlast)(5.5 4.0 0.0)(5.5 4.0 0.0)指定第二个打断点 或 第一点(F):5.4,4命令:,根据对象(图元)的句柄返回它的对象(图元)名(handent handle)handent 函数既可以返回图形对象的名称,又可以返回非图形对象的名称。参数handle 表示图元句柄的字符串。返回值如果调用成功,handent 函数返回在当前编辑任务期间与该图元句柄相关联的图元名。如果传给 handent 函数一个没有被当前图形的任何图元使用的句柄,它会返回 nil
19、。handent 函数可以返回在当前编辑任务期间被删除的对象的名称,然后用户可以调用 entdel 函数恢复它。在不同的编辑任务期间同一个图元的对象名可能会不同,但图元的句柄却保持不变。(AutoCAD2000中系统变量handles为只读)样例命令:(handent 5A2)在不同的编辑任务中对同一个图形同样地执行上述代码,可能会返回不同的图元名。一旦获取到图元名,就可以用它调用与图元有关的函数来处理该图元。,5.4实体数据函数获得对象(图元)的定义数据(entget ename applist)参数ename 要查询的图元的名称。ename 可以为图形或非图形图元。applist 注册应用
20、名的列表。返回值包含了 ename 对象定义数据的关联表,这同时适用于图形对象和非图形对象。如果指定了可选参数 applist,entget 函数还会返回与这些应用名相关的扩展数据。该关联表中的每一项都被指定了一个 AutoCAD 的 DXF 组码,来描述图元数据的各种性质。请注意 AutoLISP 所用的 DXF 组码与 DXF 文件中的组码稍有不同。关于 AutoLISP 的 DXF 组码的详细信息,请参见 DXF Reference。,样例在本例中,当前图形应用下列(缺省)条件:图层为 0 线型为 CONTINUOUS(连续)标高为 0用户用下列命令绘制了一条直线。命令:line 指定第
21、一点:1,2 指定下一点:6,6 指定下一点:ENTER,应用程序调用下列的 AutoLISP 函数可获取并打印该直线的定义数据:(defun C:PRINTDXF()(setq ent(entlast);设置 ent 为最新图元(setq entl(entget ent);设置 entl 为最新图元的数据关联表(setq ct 0);设置 ct(计数器)为 0(textpage);切换到文本屏幕(princ nentget of last entity:)(repeat(length entl);重复次数为表中成员数(print(nth ct entl);表中每个成员后换行(setq ct(
22、1+ct);计数器加一)(princ);静默退出),打印结果如下:entget of last entity:(-1.)图元名(0.LINE)图元类型名(330.)图元名(5.69)句柄(100.AcDbEntity)子类标记(67.0)空间(410.Model)空间(8.0)图层名(100.AcDbLine)图元类型名(10 1.0 2.0 0.0)线段起点(11 6.0 6.0 0.0)线段终点(210 0.0 0.0 1.0)延伸方向,;计算地板采暖的管长(defun c:len(/s l i en pt1 pt2)(setq s(ssget(0.LINE)(if s(progn(set
23、q l 0.0 i-1)(while(setqi(1+i)en(ssname s i)(setq pt1(cdr(assoc 10(entget en)(setq pt2(cdr(assoc 11(entget en)(setq pt1(trans pt1 en 1)pt2(trans pt2 en 1);转换为用户坐标(setq pt1(list(car pt1)(cadr pt1);变二维(setq l(+l(distance pt1 pt2)(princ n管长:)(princ l)(princ),修改对象(图元)的定义数据(entmod elist)entmod 函数更新由 elist
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形 数据 编辑 函数
链接地址:https://www.31ppt.com/p-5949683.html