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