《CAD二次开发之图形数据库》由会员分享,可在线阅读,更多相关《CAD二次开发之图形数据库(34页珍藏版)》请在金锄头文库上搜索。
1、第第9章章 访问和修改图形数据库访问和修改图形数据库 9.1 9.1 获取取图元的名字元的名字 AutoCADAutoCAD的的图形形是是由由多多个个图形形对象象组成成的的,最最基基本本的的图形形对象象称称作作图元元。图元元之之间是是以以链表表的的形形式式存存储的。每个的。每个图元都有一个用元都有一个用1616进制表示的唯一的名字。制表示的唯一的名字。 entnextentnext函函数数可可以以获取取图形形库第第一一个个图元元的的名名字字或或指定指定图元的下一个元的下一个图元的名字。元的名字。 entlastentlast函函数数可可以以获取取图形形库最最后后一一个个,即即最最新新生生成的成
2、的图元的名字。元的名字。 通通过entnextentnext函函数数,可可以以访问到到图形形库的的每每一一个个图元。元。 假定本作假定本作业依次依次绘制了一条直制了一条直线、一个、一个圆和一个和一个圆弧。弧。(setq e1(entnext)(setq e1(entnext);返回;返回图形形库第一个第一个图元即元即这条直条直线的的图元名元名,并将其,并将其赋给了了变量量e1e1。(setq e2(entnext e1)(setq e2(entnext e1);返回;返回图形形库e1e1的下一个的下一个图元即元即这个个圆的的图元名元名,并将其,并将其赋给了了变量量e2e2。(setq e3(e
3、ntnext e2);返回图形库;返回图形库e2的下一个图元即即这个的下一个图元即即这个图弧的图元名图弧的图元名,并将其赋给了变量,并将其赋给了变量e3。 (setq (setq e4(entlast)e4(entlast);返返回回图形形库最最后后一一个个图元元即即这个个图弧弧的的图元名元名,并将其,并将其赋给了了变量量e1e1。 因因为圆弧弧既既是是第第3 3个个图元元,也也是是最最后后一一个个图元元,所所以以e3e3和和e4e4记录的是同一的是同一图元的名字。元的名字。【例例9-19-1】绘制制下下图所所示示的的4 4个个带有有中中心心线的的螺螺纹孔孔。要要求求首首先先获取取中中心心线的
4、的螺螺纹孔孔的的图元元名名,然然后后复复制制这些些指指定名字的定名字的图元。元。 以以下下表表达达式式首首先先生生成成了了两两条条中中心心线和和1 1个个螺螺纹孔孔。在在生生成成这些些图元元的的同同时获取取并并保保存存了了这些些图元元的的名名字字为e1e1、e2e2、e3e3和和e4e4。 (command layer m zhongxin l center )(command layer m zhongxin l center )(command line -5,0 5,0 )(command line -5,0 5,0 )(setq e1(entlast)(setq e1(entlast)
5、(command line 0,-5 0,5 )(command line 0,-5 0,5 )(setq e2(entlast)(setq e2(entlast)(command layer m cuxian lw 0.3 )(command layer m cuxian lw 0.3 )(command circle 0,0 3)(command circle 0,0 3)(setq e3(entlast)(setq e3(entlast)(command layer m xixian )(command layer m xixian )(command arc -3.5,0 0,3.5
6、0,-3.5)(command arc -3.5,0 0,3.5 0,-3.5)(setq e4(entlast)(setq e4(entlast) 以以下下表表达达式式调用用AutoCADAutoCAD的的copycopy命命令令,复复制制3 3个个带有有中心中心线的螺的螺纹孔。孔。(command (command copy copy e1 e1 e2 e2 e3 e3 e4 e4 m m 0,0 0,0 12,0 12,0 24,0 36,0 )24,0 36,0 )例例9-2 定义绘制图定义绘制图b所示图形的命令。插入点所示图形的命令。插入点p0、直径、直径d、宽度、宽度b和和h作为绘
7、制该图形时交互输入的参数。该例的主要目的是示作为绘制该图形时交互输入的参数。该例的主要目的是示范如何利用图元名实现范如何利用图元名实现AutoCAD的图形编辑和填充剖面线。的图形编辑和填充剖面线。 a ba b(defun c:keyway()(defun c:keyway()(setq pc (getpoint (setq pc (getpoint 输入定位点:入定位点: ) )(setq d (getdist pc (setq d (getdist pc 输入入轴的直径:的直径:)(setq b (getdist pc (setq b (getdist pc 输入入键槽的槽的宽度:度:)(
8、setq w (getdist pc (setq w (getdist pc 输入入键槽的深度:槽的深度:)(setq r (* 0.5 d)(setq r (* 0.5 d)(command circle pc r) (command circle pc r) ;绘制制圆(setq e1 (entlast) (setq e1 (entlast) ;将;将entlastentlast返回的返回的该圆的的图元名元名赋给e1e1(setq p0(polar pc 0 r) (setq p0(polar pc 0 r) ;p0p0是是圆上一点,将用于修剪上一点,将用于修剪该圆(setq p1(lis
9、t (car pc) (+ (cadr pc) (* 0.5 b)(setq p1(list (car pc) (+ (cadr pc) (* 0.5 b)(setq p2(list (+ (car pc) (* 1.2 r) (cadr p1)(setq p2(list (+ (car pc) (* 1.2 r) (cadr p1)(command line p1 p2 )(command line p1 p2 )(setq e2 (entlast) (setq e2 (entlast) ;将;将entlastentlast返回的返回的该直直线的的图元名元名赋给e2e2(setq p3(li
10、st (car pc) (- (cadr pc) (* 0.5 b)(setq p3(list (car pc) (- (cadr pc) (* 0.5 b)(setq p4(list (car p2) (cadr p3)(setq p4(list (car p2) (cadr p3)(command line p3 p4 )(command line p3 p4 )(setq e3 (entlast) (setq e3 (entlast) ;将;将entlastentlast返回的返回的该直直线的的图元名元名赋给e3e3(setq (setq p5(list p5(list (+ (+ (c
11、ar (car pc) pc) (- (- r r w) w) (+ (+ (cadr (cadr pc) pc) (* (* 0.5 0.5 b)b)(setq (setq p6(list p6(list (+ (+ (car (car pc) pc) (- (- r r w) w) (- (- (cadr (cadr pc) pc) (* (* 0.5 0.5 b)b)(command line p5 p6 )(command line p5 p6 )(setq e4 (entlast) (setq e4 (entlast) ;将;将entlastentlast返回的返回的该直直线的的图元
12、名元名赋给e4e4;e1e1、e2e2等作等作为剪切剪切边,p0p0、p1p1等点确定被剪等点确定被剪边和剪去哪一段和剪去哪一段(command trim e1 e2 e3 e4 p0 p1 p2 p3 p4 )(command trim e1 e2 e3 e4 p0 p1 p2 p3 p4 );e1e1、e2e2等作等作为剖面域的剖面域的边界界绘制剖面线绘制剖面线(command hatch ansi31 2 0 e1 e2 e3 e4 ) (command hatch ansi31 2 0 e1 e2 e3 e4 ) ;) )9.2 9.2 图元表元表 图元元表表记录着着图元元的的名名字字
13、、类型型、几几何何数数据据、图层、颜色色等信息。通等信息。通过修改或修改或创建建图元表,可以元表,可以实现编辑或生成或生成图元。元。9.2.1 9.2.1 获取取图元表元表 例如例如输入下面入下面3 3个表达式:个表达式:(command text 10,20 5 0 ABCDE)(command text 10,20 5 0 ABCDE);书写文本写文本(setq e(entlast)(setq e(entlast);获取文本的取文本的图元名,将元名,将图元的名字元的名字赋给变量量e e。(setq elist(entget e) (setq elist(entget e) ;获取取图元名字
14、元名字为e e的的图元表。元表。 在在 Command: 提示下键入提示下键入!elist或在控制台或在控制台 _$ 提示下键入提示下键入elist,即可得到以下该图元的图元表。,即可得到以下该图元的图元表。 (-1 . )(-1 . );图元名元名 (0 . TEXT) (0 . TEXT);图元种元种类 (330 . ) (330 . );软指指针句柄句柄 (5 . 19F) (5 . 19F);图元描述字元描述字 (100 . AcDbEntity) (100 . AcDbEntity);AutoCADAutoCAD图元元 (67 . 0) (67 . 0);模型空;模型空间 (410
15、. Model) (410 . Model);模型空;模型空间标识 (8 . 0) (8 . 0) ;所在;所在图层名名 (100 . AcDbText) (100 . AcDbText) ;AutoCADAutoCAD文本文本 (10 10.0 20.0 0.0) (10 10.0 20.0 0.0) ;定位点坐;定位点坐标 (40 . 5.0) (40 . 5.0);文本字高;文本字高 (1 . ABCDE) (1 . ABCDE);文本内容;文本内容 (50 . 0.0) (50 . 0.0);文本的旋;文本的旋转角度角度 (41 . 1.0) (41 . 1.0);文字的;文字的宽度因
16、子度因子 (51 . 0.0) (51 . 0.0);文字的;文字的倾斜角度斜角度 (7 . STANDARD) (7 . STANDARD);字;字样的名字的名字 (71 . 0) (71 . 0);正常文本(非左右或上下;正常文本(非左右或上下镜像的文本)像的文本) (72 . 0) (72 . 0);左下角点;左下角点对齐方式方式 (11 0.0 0.0 0.0) (11 0.0 0.0 0.0);辅助的定位点坐助的定位点坐标 (210 0.0 0.0 1.0) (210 0.0 0.0 1.0);厚度方向;厚度方向 (100 . AcDbText) (100 . AcDbText) ;
17、AutoCADAutoCAD文本文本 (73 . 0) (73 . 0);不垂直;不垂直书写写 ) )对图元表的元表的补充充说明:明:(1 1)图元元表表的的每每个个元元素素还是是表表,子子表表的的第第一一个个元元素素是是具具有有一一定定含含义的的整整数数,其其含含义与与图元元在在DXFDXF(图形形交交换文文件件)中中实实体体代代码码的含的含义相同(相同(详见AutoCADAutoCAD有关有关DXFDXF文件的介文件的介绍)。)。(2 2)多多数数的的子子表表采采用用了了点点对结构构,这样既既节省省存存储空空间,也也可可以以简化运算,化运算,详见第第2.42.4节数据的存数据的存储结构。构
18、。(3 3)其其他他种种类图元元的的图元元表表的的非非几几何何信信息息部部份份基基本本相相同同,几几何何信息部份有些差异。信息部份有些差异。9.2.2 9.2.2 对图元表的操作元表的操作 假假定定elistelist是是某某图元元的的图元元表表。利利用用AutoLISPAutoLISP有有关关表表处理理的的函函数可以修改数可以修改图元表。元表。(1 1)了解)了解图元的种元的种类(cdr (assoc 0 elist)(cdr (assoc 0 elist) 该表表达达式式的的内内层表表达达式式中中,用用0 0作作为关关键字字,在在elistelist表表中中寻找找相相关关的的子子表表,返返
19、回回有有关关图元元种种类的的子子表表(0 (0 . . 图元元种种类),由由于于此此表表为点点对,所所以以cdrcdr函函数数返返回回它它的的第第2 2个个元元素素 图元元种种类 。若若此此图元元为直直线,则返返回回LINELINE,若若此此图元元为单行行文文本本,则返回返回TEXTTEXT。(2 2)了解)了解图元所在元所在图层的名字的名字(cdr (assoc 8 elist)(cdr (assoc 8 elist) 该表达式的内层表达式中,用该表达式的内层表达式中,用8作为关键字,返回作为关键字,返回elist表中有表中有关图层名字的子表关图层名字的子表(8 . 图层名图层名),由于此表
20、为点对,所以,由于此表为点对,所以cdr函函数返回它的第数返回它的第2个元素个元素图层名图层名。 (3 3)了解)了解圆、圆弧的半径或弧的半径或单行文本的字高行文本的字高(cdr (assoc 40 elist)(cdr (assoc 40 elist) 该表表达达式式的的内内层表表达达式式中中,用用4040作作为关关键字字,返返回回elistelist表表中中有有关关圆、圆弧弧的的半半径径或或单行行文文本本的的字字高高的的子子表表(40 (40 . . 数数值) ),由于此表由于此表为点点对,所以,所以cdrcdr函数返回它的第函数返回它的第2 2个元素具体的数个元素具体的数值。(4 4)了
21、解直)了解直线的起点、的起点、圆、圆弧的中心或弧的中心或单行文本的定位点行文本的定位点(cdr (assoc 10 elist)(cdr (assoc 10 elist) 该表表达达式式的的内内层表表达达式式中中,用用1010作作为关关键字字,返返回回elistelist表表中中有有关关直直线的的起起点点、圆、圆弧弧的的中中心心或或单行行文文本本的的定定位位点点的的子子表表(10 (10 数数值 数数值 数数值) ),注注意意此此表表不不再再是是点点对,所所以以cdrcdr函函数数返回去掉它的第返回去掉它的第1 1个元素之后的子表,即点的个元素之后的子表,即点的XYZXYZ坐坐标。(5 5)用
22、)用圆、圆弧的半径或弧的半径或单行文本的新行文本的新值取代其老取代其老值(setq elist (subst (cons 40 h)(assoc 40 elist)elist)(setq elist (subst (cons 40 h)(assoc 40 elist)elist)(cons 40 h)构造一个新的点对子表,例如(构造一个新的点对子表,例如(40 . 3.5)。)。(assoc 40 elist)返回返回elist表内的点对子表,例如(表内的点对子表,例如(40 . 5.0)。)。subst函数用函数用新子表,例如(新子表,例如(40 . 3.5),替换),替换elist表内的老
23、子表(表内的老子表(40 . 5.0)。)。最外层的最外层的setq函数将替换后的赋给了变量函数将替换后的赋给了变量elist。 (6 6)更新)更新图形形库的的图元表元表(entmod elist)(entmod elist)entmodentmod函函数数的的功功能能是是更更新新图形形库的的指指定定图元元表表的的图元元,即即更更新新了了实际图形形对象。例如象。例如单行文本的字高由行文本的字高由5.05.0改改变为3.53.5。9.2.3 9.2.3 举例例【例【例9-39-3】定】定义将本作将本作业所有的所有的单行文本改行文本改变为指定高度的命令。指定高度的命令。 右图所示为修改图形数右图
24、所示为修改图形数据库内单行文本字高的程据库内单行文本字高的程序流程图,其中序流程图,其中e1是用于是用于存放图元名的变量。单行存放图元名的变量。单行文本的图元种类是文本的图元种类是TEXT,用,用MTEXT书写的是段书写的是段落文本,它的图元种类是落文本,它的图元种类是MTEXT。因此本程序不。因此本程序不能修改用能修改用MTEXT书写的书写的文本。文本。开始输入新的字高h得到第一个图元的名字e1e1的类型是TEXT?用新的字高更新e1的图元表e1的名字为nil ?令e1为e1的下一个图元名结束否否否否是是是是以以下下是是定定义改改变本本作作业所所有有单行行文文本本为指指定定的的高高度度命命令
25、令的的程程序序代代码:(defun c:cth( / h e el)(defun c:cth( / h e el)(setq h(getdist n(setq h(getdist n输入文本新的字高入文本新的字高: ): )(setq e(entnext)(setq e(entnext);得到第一个;得到第一个图元的名字元的名字(while e (while e ;当;当e e有定有定义时做以下运算做以下运算(setq el(entget e)(setq el(entget e);得到第一个;得到第一个图元的元的图元表元表(if (= TEXT (cdr (assoc 0 el) (if (=
26、 TEXT (cdr (assoc 0 el) (progn (progn ;如果;如果图元的元的类型型为TEXTTEXT时做以下运算做以下运算(setq (setq el(subst el(subst (cons (cons 40 40 h)(assoc h)(assoc 40 40 el)el)el)el);新新字字高高替替换图元表的原字高元表的原字高(if (= 3 (cdr (assoc 72 el)(if (= 3 (cdr (assoc 72 el);如果文本;如果文本为AlignAlign方式方式对齐(setq (setq el(subst el(subst (cons (con
27、s 72 72 0) 0) (assoc (assoc 72 72 el) el) el)el);忽忽略略第二个定位点第二个定位点) )(entmod el)(entmod el);更新;更新图形数据形数据库的的elel图元表元表) ) )(setq e(entnext e)(setq e(entnext e);令;令e e等于等于e e的下一个的下一个图元名元名) )(princ)(princ);静默退出;静默退出) )9.3 9.3 选择集集 选择集集是是有有名名字字的的一一些些图元元名名的的集集合合,常常用用于于编辑或或修修改改图形形对象的命令。象的命令。9.3.1 9.3.1 常用的有
28、关常用的有关选择集的函数集的函数(1 1)(ssget (ssget 选择方法方法 点点1 1 点点2 2 点表点表 过滤表表)创建一个建一个选择集。有以下一些集。有以下一些选择方法。方法。C C(CrossingCrossing):与与点点1 1、点点2 2所所确确定定的的窗窗口口相相交交的的那那些些对象象被被选中。中。CPCP(CpolygonCpolygon):与与点点表表所所确确定定的的多多边形形相相交交的的那那些些对象象被被选中。中。F F(FenceFence):):与点表所确定的折与点表所确定的折线相交的那些相交的那些对象被象被选中。中。I I(ImpliedImplied):)
29、:处于于夹取(取(GripsGrips)状状态的那些的那些对象被象被选中中L L(LastLast):最最新新的的、最最后后绘制制的的那那个个图元元被被选中中。由由于于在在多多文文档档环境境下下最最后后绘制制的的对象象并并不不一一定定是是可可见的的,例例如如,这个个绘图窗口被最小化或未放置在窗口被最小化或未放置在顶层,这时使用使用该选项将返回将返回nilnil。P P(PreviousPrevious):):上一次上一次创建的建的选择集。集。W W(WindowWindow):整整体体在在点点1 1、点点2 2所所确确定定的的窗窗口口之之内内的的那那些些对象象被被选中。中。WPWP(Wpoly
30、gonWpolygon):整整体体在在点点表表所所确确定定的的多多边形形之之内内的的那那些些对象象被被选中。中。X X:整整个个数数据据库,包包括括被被关关闭、被被冻结图层上上的的对象象和和屏屏幕幕之之外的那些外的那些对象被象被选中。中。: :E E:通通过光光标拾取框的那些拾取框的那些对象被象被选中。中。: :N N:在在该函函数数的的执行行过程程中中,为选定定对象象调用用ssnamexssnamex函函数数获得得容容器器块和和转换矩矩阵的的附附加加信信息息。只只有有通通过 WW、CC和和点点拾拾取取选择方法方法时,才可以使用,才可以使用这一附加信息。一附加信息。: :S S:只允只允许单一
31、一选择集。集。点点1 1、点点2 2、点表点表和和过滤表表是与是与选择方法配合使用的。方法配合使用的。过滤表表的的功功能能是是根根据据过滤表表描描述述的的条条件件对所所选的的对象象进行行筛选,只只保保留留满足足过滤条条件件的的对象象。过滤表表是是entgetentget函函数数返返回回的的图元元表表中中的的点点对,例例如如(0 (0 . . LINE)LINE)、(8 (8 . . LAYER1)LAYER1)、(6 (6 . . center)center)、(62 (62 . . 1)1),点点对的的第第1 1个个元元素素是是图形形交交换文文件件中中的的组码,详见AutoCADAutoCA
32、D有关有关DXFDXF文件的介文件的介绍。 如如果果仅提提供供了了一一个个点点,该函函数数认为用用户通通过这个个点点来来选择单个个的的对象象。如如果果省省略略所所有有的的参参数数,在在调用用该函函数数时将将出出现Select Select objectsobjects: 提提示示,这用用户以以交交互互方方式式选择对象象。在在这种情况下,亮种情况下,亮显被被选取的取的对象。象。 该函函数数忽忽略略当当前前设置置的的对象象捕捕捉捉模模式式。由由于于选择集集会会占占用用临时文文件件存存储区区,所所以以AutoLISPAutoLISP不不允允许同同时打打开开128128以以上上的的个个选择集。集。 如
33、如果果成成功功该函函数数返返回回创建建选择集集的的名名称称,例例如如Selection set: 1,否,否则返回返回nilnil。 以下是以下是调用用该函数的一些表达式。函数的一些表达式。 (setq (setq s1 s1 (ssget (ssget (2 (2 2)2);创建建一一个个选择集集,如如果果存存在在一一个个通通过点点(2,2)(2,2)的的图元元,它它将将被被选中中并并将将返返回回的的选择集集的的名名字字赋给变量量s1s1 (setq (setq s2 s2 (ssget (ssget w w (0 (0 0) 0) (10 (10 10)10);创创建建一一个个选选择择集集
34、,它它的的成成员员是是所所有有整整体体在在对对角角点点(0,0)(0,0)和和(10,10)(10,10)窗窗口口内内的图元,如果成功则将选择集的名字赋给变量的图元,如果成功则将选择集的名字赋给变量s2s2 (setq (setq s3 s3 (ssget (ssget X X (0 (0 . . LINE) LINE) (62 (62 . . 5) 5) ;(0 (0 . . LINE) LINE) (62 (62 . . 5)5)是是过过滤滤表表,该该选选择择集集的的成成员员是是当当前前作作业中所有蓝色的直线,如果成功将选择集的名字赋给变量业中所有蓝色的直线,如果成功将选择集的名字赋给变量
35、s3s3 (setq (setq s4 s4 (ssget)(ssget);以以交交互互方方式式创创建建一一个个选选择择集集。执执行行到到该该表表达达式式时时,自自动动切切换换到到图图形形窗窗口口,出出现现Select Select objectsobjects: 提提示示,等等待待用用户户操操作作。用用户户此此时时可可用用各各种种选选择择方方法法多多次次选选择择,直直至至用用空空回回车车响响应应Select Select objectsobjects: 提提示示。选选择择集集由由交交互互选选择择的的这这些图元组成,将选择集的名字赋给变量些图元组成,将选择集的名字赋给变量s4s4(2 2)(e
36、ntsel (entsel 提示信息提示信息) 提提示示用用户户以以单单点点方方式式选选择择单单个个对对象象。若若省省略略提提示示信信息息,则则提提示示信信息息为为Select Select objectobject: 。返返回回值值为为两两个个元元素素组组成成的的表表,第第一一个个元元素素是是所所选选的的图图元元名名,第第二二个个元素是用户选择对象时拾取点在当前元素是用户选择对象时拾取点在当前UCSUCS下的坐标。下的坐标。(3 3)(ssadd (ssadd 图元名图元名 选择集选择集) 将将指指定定的的图图元元加加入入到到选选择择集集。如如果果调调用用该该函函数数时时无无参参数数,将将创
37、创建建一一个个空空选选择择集集;如如果果只只提提供供图图元元名名,将将创建一个仅含该图元的选择集。创建一个仅含该图元的选择集。(4 4)(ssdel(ssdel图元名元名 选择集集) ) 从从选择集内移去指定的集内移去指定的图元。元。(5 5)(sslength ss)(sslength ss) 返回返回选择集的集的长度,即度,即选择集内集内图元的数量。元的数量。(6 6)(ssname (ssname 选择集集 序号序号) ) 返返回回选选择择集集中中由由序序号号指指定定的的那那个个图图元元名名。选选择择集内第一个元素的序号为零。集内第一个元素的序号为零。 9.3.2 9.3.2 举例例【例
38、【例9-49-4】 定定义将将选到的到的单行文本改行文本改变为指定高度的命令。指定高度的命令。(defun c:csth( / h s1 n e el)(defun c:csth( / h s1 n e el)(setq h(getdist n(setq h(getdist n输入文本的高度:入文本的高度:)(setq s1(ssget)(setq s1(ssget);以交互方式得到一个;以交互方式得到一个选择集集(setq n 0) (setq n 0) ;序号的初;序号的初值为0 0(repeat (sslength s1)(repeat (sslength s1);重复;重复执行,行,执
39、行的次数等于所行的次数等于所选对象的个数象的个数 (setq e(ssname s1 n)(setq e(ssname s1 n);得到;得到选择集内第集内第n n个个对象的象的图元名元名(setq el(entget e)(setq el(entget e);得到;得到这个个对象的象的图元表元表(if (= TEXT (cdr (assoc 0 el)(if (= TEXT (cdr (assoc 0 el);判断;判断这个个对象是否象是否为TEXTTEXT (progn (progn ;是;是TEXTTEXT(setq (setq el(subst el(subst (cons (cons
40、 40 40 h) h) (assoc (assoc 40 40 el) el) el)el);用用新新字字高高替替换图元表的原字高点元表的原字高点表表(if (= 3 (cdr (assoc 72 el) (if (= 3 (cdr (assoc 72 el) ;如果文本;如果文本为AlignAlign方式方式对齐(setq (setq el(subst el(subst (cons (cons 72 72 0)(assoc 0)(assoc 72 72 el) el) el)el);忽忽略略第第二二个个定定位点位点) ) (entmod el) (entmod el) ;更新;更新图形数据
41、形数据库的的elel图元表元表) ) )(setq n(1+ n) (setq n(1+ n) ;序号;序号n n的数量加的数量加1 1) ) )9.4 9.4 符号表符号表 AutoCADAutoCAD的的符符号号表表是是指指视窗窗表表、线型型表表、图层表表、字字样表表、视图表表、用用户坐坐标系系表表、用用户应用用程程序序标识表表、尺尺寸寸式式样表表和和块记录表表。在在某某些些情情况况下下,仅从从图元元表表不不能能了了解解图元元的的全全部部特特性性,例例如如当当图元元的的颜色色、线型型与与所所在在图层一一致致时,图元元表表中中没没有有记录颜色色、线型型的的子子表表,因因此此,了了解解这样图元
42、元的的颜色色,就就需需要要访问图层表。表。9.4.1 9.4.1 符号表操作函数符号表操作函数(1 1)(tblnext (tblnext 表的种表的种类 回回绕) 表表 的的 种种 类 可可 以以 是是 LAYERLAYER、 LTYPELTYPE、 VIEWVIEW、 STYLESTYLE、BLOCKBLOCK、UCSUCS、APPIDAPPID、DIMSTYLEDIMSTYLE和和VPORTVPORT。若若回回绕项为T T,则返返回回指指定定种种类的的第第一一个个符符号号表表,若若该项为nilnil或或缺缺省省,则返返回指定种回指定种类的当前表符号的下一个符号表。的当前表符号的下一个符号
43、表。 例例如如返返回回图图层层表表,若若当当前前作作业业的的图图层层名名依依次次是是0、layer1、 layer2 layer2和和layer3layer3。 随随时输入入表表达达式式(tblnext (tblnext layer layer T)T)都都返返回回(0 (0 . . LAYER) LAYER) (2 (2 . . 0) 0) (70 (70 . . 0) 0) (62 (62 . . 7) 7) (6 (6 . . CONTINUOUS)CONTINUOUS)。因因为回回绕项为T T,所所以以返返回回当当前前作作业的第一个的第一个图层表。表。 接接 着着 输 入入 表表 达达
44、 式式 (tblnext (tblnext layer layer nil)nil)或或(tblnext (tblnext layer)layer)返返回回(0 (0 . . LAYER) LAYER) (2 (2 . . layer1) layer1) (70 (70 . . 0) 0) (62 (62 . . 7) 7) (6 (6 . . CONTINUOUS)CONTINUOUS)。因因为回回绕项为nilnil或或缺缺省省,所所以以返返回回当当前前图层表表的的下下一一个个图层表表。同同样的的操操作作依依次次返返回回layer2layer2、layer3layer3的的图层表表。再再输入
45、入这个个表表达达式式,将将返返回回nilnil,因因为layer3layer3是是最最后的后的图层。 例例如如返返回回块定定义表表,若若当当前前作作业已已定定义了了名名字字为BOXBOX的的图块,输入入表表达达式式(tblnext (tblnext block) block) 返返回回(0 (0 . . BLOCK) BLOCK) (2 (2 . . BOX) BOX) (70 (70 . . 0) 0) (10 (10 9.0 9.0 2.0 2.0 0.0) (-2 . 0.0) (-2 . ) 1dca370)(2 2)(tblobjname (tblobjname 表的种表的种类 表名
46、表名) ) 返返回回指指定定种种类表表的的图元元名名。如如果果找找到到,返返回回符符号号表表的的图元元名名。返返回回的的图元元名名可可以以用用于于entgetentget和和entmod entmod 操操作作。例例如如(tblobjname (tblobjname layer layer 0)0),返返回回名名字字为0 0的的图层表的表的图元名元名。 (3 3)(tblsearch (tblsearch 表的种表的种类 表名表名 设置下一个置下一个) 返返回回指指定定种种类和和名名字字的的符符号号表表。如如果果 设置置下下一一个个 为T T,该表表将将作作为定定位位点点,随随后后调用用tbl
47、nexttblnext函函数数在在不不回回绕 的的 设 置置 下下 , 就就 会会 返返 回回 该 表表 的的 下下 一一 个个 表表 。 例例 如如(tblsearch (tblsearch layer layer t) t) 返返回回(0 (0 . . LAYER) LAYER) (2 (2 . . layer1) layer1) (70 (70 . . 0) 0) (62 (62 . . 7) 7) (6 (6 . . CONTINUOUS)CONTINUOUS)图层表表,且且layer1layer1为定定位位点点,接接着着输入入表表达达式式(tblnext (tblnext layer
48、 layer ) )返返回回(0 (0 . . LAYER) LAYER) (2 (2 . . layer2) layer2) (70 (70 . . 0) (62 . 7) (6 . CONTINUOUS)0) (62 . 7) (6 . CONTINUOUS)图层表。表。(defun c:ccolor(defun c:ccolor(/ (/ oldcolor oldcolor newcolor newcolor new_cl new_cl e e el el old_cl layname laytab laycolor)old_cl layname laytab laycolor) (se
49、tq oldcolor (getint n (setq oldcolor (getint n输入待改入待改变的的颜色号色号: ): ) (setq newcolor (getint n (setq newcolor (getint n输入新的入新的颜色号色号: ): ) (setq new_cl (cons 62 newcolor) (setq new_cl (cons 62 newcolor) ; ;构造新构造新颜色子表色子表 (setq e (entnext) (setq e (entnext) ; ;得到第一个得到第一个图元名元名 (while e (while e ; ;当当图元的名字
50、有定元的名字有定义时 (setq el (entget e) (setq el (entget e) ; ;得到一个得到一个图元表元表 (if(= LINE (cdr (assoc 0 el) (if(= LINE (cdr (assoc 0 el); ;判断判断该图元是否是直元是否是直线 (progn (progn ; ;是直是直线 (setq old_cl (assoc 62 el) (setq old_cl (assoc 62 el) ; ;得到老得到老颜色子表(点色子表(点对) (if (null old_cl) (if (null old_cl); ;判断判断颜色子表是否色子表是否为
51、空空(progn (progn ; ;没有没有颜色子表,即色子表,即颜色随色随层(setq layname (cdr (assoc 8 el) (setq layname (cdr (assoc 8 el) ; ;得到得到图层名名(setq (setq laytab laytab (tblsearch (tblsearch LAYER LAYER layname) layname) ; ;得得到到指指定定图层名名的的图层表表(setq laycolor (cdr (assoc 62 laytab) (setq laycolor (cdr (assoc 62 laytab) ; ;得到得到图层的
52、的颜色号色号(if(= oldcolor laycolor)(if(= oldcolor laycolor); ;判断判断图层的的颜色是否与待改的色是否与待改的颜色相同色相同(progn (progn ; ;相同,相同,该层颜色色为被改色被改色(setq el (cons new_cl el) (setq el (cons new_cl el) ; ;插入插入颜色子表色子表(entmod el)(entmod el); ;更新更新图形数据形数据库的的elel图元表元表)(progn (progn ; ;有有颜色子表,即色子表,即颜色独立于色独立于图层(if(= (if(= oldcolor o
53、ldcolor (cdr (cdr old_cl)old_cl); ;判判断断图元元的的颜色色是是否否与与待待改改的的颜色色相相同同(progn (progn ; ;相同,相同,该层颜色色为被改色被改色(setq el (subst new_cl old_cl el) (setq el (subst new_cl old_cl el) ; ;颜色替色替换(entmod el)(entmod el); ; 更新更新图形数据形数据库的的elel图元表元表) (setq e (entnext e) (setq e (entnext e); ;令令e e等于等于e e的下一个的下一个图元的名字元的名字)