1、5.1 选择集的处理所谓选择集是指图形中选定的部分图元或所有图元的集合。Auto LISP提供了选择以下六种有关选择集的处理函数:1)ssget-创建选择集2)ssadd-把图元加到选择集中3)ssdel-从选择集中删除图元4)sslength测定选择集中的图元数5)ssname-从选择集中获取图元名6)ssmemb-测试图元是否为选择集成员5.1.1 创建选择集n调用格式1:(ssget 方式 点1 点2)有如下形式:n1)(ssget)不带任何参数,请求进行一般图元选择。n2)(ssget (20 35)-选择通过点“20,35”的图元。n3)(ssget “L”)-选择最新加入数据库的图
2、元。n4)(ssget “P”)-选择前一次已选择过的图元。n5)(ssget “W”(0 0)(5 5)-选择窗口内的图元。n6)(ssget “C”(0 0)(5 5)-选择窗口涉及的图元。n7)(ssget “wp”点1 点2)-多边形窗口方式选择。n8)(ssget “cp”点1 点2)-多边形窗叉方式选择。n9)(ssget “F”点1 点2)-折线方式选择。n10)(ssget “X”)-选择全部图元。调用格式2:(ssget “X”过滤表)n例如:n(ssget“x”(0 .“CIRCLE”)-选择所有的圆。n(ssget “x”(8 .“3”)-选择层3上的所有图元。n(ssg
3、et “x”(0 .“CIRCLE”)(8 .“3”)(62 .1)n-选择层3上红颜色的圆。n说明:n1)用ssget函数只能选择主图元,而不能选择子图元。n2)选择集可以保存于AutoLISP变量中。如:n(setq s1(ssget “x”(0 .“LINE”)(8.“3”)n3)选择集中的图元是唯一的。n4)当前图形中建立的选择集数量不能多于128个,如果超过这个极限,则ssget函数将返回nil。过滤DXF码组码 意义 数据类型 应用0 图元类型 字符串 (0 .“CIRCLE”)2 插入块名 字符串 (2 .“BLOCK”)3 尺寸图元方式 字符串 (3 .“TOLERANCE”)
4、6 线形名 字符串 (6 .“CONTINUOUS”)7 字型名 字符串 (7 .“STANDARD”)8 层名 字符串 (8 .“BLOCK”)38 标高 实型 (38 .5.0)39 厚度 实型 (39 .8.0)62 颜色号 整型 (62 .1)构造选择集举例:(setq a1(ssget (0 .“TEXT”);选择文本加入选择集(setq a2(ssget (0 .“LINE”);选择线图元加入选择集(setq a3(ssget “L”(0 .“CIRCLE”);选择最近画的一个圆(setq a4(ssget “P”(8 .“1”);选择前一个选择集中1层上 的 图 元(setq a
5、5(ssget “X”(62 .3);选择绿色图元加入选择集(setq a6(ssget “X”(0 .“CIRCLE”)(8 .“2”)(62 .1);选择2层上红色圆加入选择集(1)通配符模式n过滤器序列中指定的符号名称可包含通配符模式,常用的通配符如下:n?匹配任何单个字符n 匹配任何单个字母n#匹配任何单个数字n.匹配除字母和数字之外的任何单个字符n*匹配任何字符串,包括null串n-匹配连字符范围内的字符,如1-5n通配符可单独使用,也可组合使用,其中最常用的是“*”n和“?”。例如:n(setq s(ssget“X”(8.“A*”);表示层名第一个子母为A的所有层均被加入选择集。(
6、2)关系测试n=等于n!=/=不等于n 大于n=大于等于n*恒为真n&位与n&=位屏蔽n例如:(setq s(ssget“X”(0.“CIRCLE”)(-4.”)n(40.20.0);所有半径大于20的圆加入选择集。(3)逻辑分组n通过应用逻辑分组运算符,可以创建更为复杂的多层嵌套关系测试。n逻辑分组运算符如下:n 与运算,测试一个或多个DXF组n 或运算,测试一个或多个DXF组n 异或运算,测试两个DXF组n 非运算,测试一个DXF组n例如:n(setq s(ssget“X”(-4.“”)n表示创建由1层或2层上的图元组成的选择集。5.1.2 操作选择集n1)(ssadd 图元名选择集);向
7、选择集中加入图元n建立空集-(setq s1(ssadd)n建立只有一个图元的选择集-n (setq s2(ssadd 图元名)n2)(ssdel 图元名选择集);从选择集中删除图元n3)(sslength 选择集);获取选择集中图元个数(说明:使用sslength应保证所构造的选择集不为nil.)n4)(ssname 选择集序号);获取选择集中图元名n5)(ssmemb 图元名选择集);测试指定图元是否为 n 选择集中成员。是则返回该图元名,否则返回nil.n若要释放选择集s,可执行:(setq s nil)5.1.3 选择集操作函数实例n例1:选择屏幕上要保留的图形,删除其它为被选种的图形
8、。n(defun c:remainder(/s1 s2 s3 n ent)n(setq s1(ssget)s2(ssget“x”)n(if(not s1)(command“erase”s2“”)n (progn(setq s3(ssadd)n 0)n (repeat(sslength s2)(setq ent(ssname s2 n)n (if(not(ssmemb ent s1)(ssadd ent s3)n (setq n(1+n);repeatn (command“erase”s3“”“redraw”);progn n);ifn);end例2:改变现行图形中所有文本的尺寸大小n(defu
9、n c:chtxt(/a ts n index b1 b c d b2)n(setq a(ssget“X”(0.“TEXT”)n(setq ts(getdist“nEnter new text size:”)n(setq n(sslength a)n(setq index 0)n(repeat n(setq b1(entget(ssname a index)n (setq index (+index 1)n (setq c(assoc 40 b1)n (setq d(cons(car c)ts)n (setq b2(subst d c b1)n (entmod b2);repeatn);end
10、5.2 处理图元对象nAutoLISP提供了下列用于图元对象处理的函数:nEntlast 获取图形数据库中最后一个图元名nEntnext 获取图形数据库中下一个图元名nEntsel 选择图元并获取图元名nHandent 获取带有指定句柄的图元名称nNentsel 选择图元并获取子图元名nNentselp 获取子图元名nEntget 获取图元数据表nEntmod 更新图元数据nEntupd 更新复杂图元的屏幕显示nEntmake 创建图元nEntdel 删除指定图元5.2.1 获取图元名称n 图元名是一个指向AutoCAD图形编辑程序的文件指针,只有通过图元名,才能对图形数据库中图元进行访问、编
11、辑和修改。因此,在对图元进行编辑修改之前,获取图元名是非常重要的。n1.按图元顺序获取图元名称n(entnext)-获取图形数据库中第一个图元名称n(entnext 图元名)-获取该图元之后的图元名n(entlast)-获取最后一个图元的名称n例如:(setq e1(entnext)n返回:n(setq e2(entnext e1)返回:第二个图元名n(setq e(entlast)返回:最后一个图元名2.按图元位置获取图元名称n(entsel 提示串)-返回:(图元名坐标点表)n(entsel)-提示串缺省将出现:Select objects:n例:编程在屏幕上画一条线和一个圆,并过圆心向直
12、线作垂线。n(defun c:ents()n(command line(10 10)(80 80)n(command circle 30,100 40)n(setq pt1(cadr(entsel select a line:)n(setq pt2(cadr(entsel setlect a circle:)n(setq pt3(osnap pt2 cen)n(command line pt3(osnap pt1 per)n);end程序运行结果:3.图元句柄及其用法n由于在每次绘图时图元名都可能变化,这使得在某些场合应用图元名不方便。而图元句柄在图形整个生命周期中都是不变的,因此,如果应用程
13、序在不同时刻必须引用同一图形中的同一对象时,最好使用图元句柄。n调用格式:(handent 图元句柄)n功能:返回当前编辑期间使用的与图元句柄对应的图元名。n例:(handent “5A2”)返回:n4.获取子图元名n(nentsel 提示串);返回复杂图元的子图元名n(nentselp 图元上指定点);同上5.2.2 修改图元数据n1)获取图元数据表n调用格式:(entget 图元名)n功能:返回一个该图元名定义的图元的数据表。n例如:在屏幕上用“CIRCLE”命令画了一个圆,其中圆心坐标点为“200,200”,半径为50。n 为了在屏幕上以缩进形式显示该图元数据表的内容,变成如下:n(de
14、fun c:pe()n(setq a(entlast)aa(entget a)c 0)n(textscr)(princ nData of last entity:)n(repeat (length aa)n(terpri)(princ(nth c aa)(setq c (1+c);repeatn(princ);end程序运行后,图元数据表显示如下:nData of last entity:n(-1.)n(0.CIRCLE)n(330.)n(5.2D)n(100.AcDbEntity)n(67.0)n(410.Model)n(8.0)n(100.AcDbCircle)n(10 200.0 200
15、.0 0.0)n(40.50.0)n(210 0.0 0.0 1.0)2)修改、更新图元数据na)接受修改的图元数据表-entmodn调用格式:(entmod 图元数据表)n例如:在屏幕上用“LINE”命令画一直线,已知起点坐标为“2,2”,终点坐标为“8,8”。编程修改端点的数据:n(setq e(entlast);获取图元名n(setq el(entget e);获取该图元的数据表n(setq el(subst (11 20.0 9.0)(assoc 11 el)el);修改n(entmod el);接受新的数据表n说明:entmod不能更改图元的类型和图元句柄;n 图元数据表中须修改的数
16、据在执行entmod之前n 必须存在。b)更新复杂图元屏幕图象-entupdn调用格式:(entupd 图元名)n功能:使修改了图元数据的图形在屏幕上更新显示。n主要用于复杂图元的更新,对于简单图元用entmot函数即可更新。n注意:在执行entupd函数之前,必须先执行entmod。n例如:设图中最后一个图元是一条有若干顶点的多义线,n若要修改多义线的第一个顶点,可编程如下:n(setq e1(entlast);置e1为多义线的图元名n(setq e2(entnext e1);置e2为多义线的第一个顶点n(setq ed(entget e2);置ed为顶点数据表n(setq ed(subst
17、 (10 100.0 200.0)(assoc 10 ed)ed)n(entmod ed);改变ed中的顶点位置,修改数据库n(entupd e1);重新生成多义线图元e1.5.2.3 增加图元和删除图元n1)用entmake函数创建图元n调用格式:(entmake 图元数据表)n功能:根据提供的图元数据表创建图元。n例如:创建一个多义线的图元,其顶点为(10,10)、n(10,20)、(20,20),颜色为红色,位于1层上。n(entmake(0.“polyline”)(62.1)(8.1)(66.1)n(entmake(0.“vertex”)(10 10.0 10.0 0.0)n(entmake(0.“vertex”)(10 10.0 20.0 0.0)n(entmake(0.“vertex”)(10 20.0 20.0 0.0)n(entmake(0.“seqend”)n2)用entdel删除指定图元n调用格式:(entdel 图元名)