摘 要:AutoCAD用户在工作中经常遇到编组丢失和空编组无法清理的问题,本文就这两个问题进行研究,找出编组丢失的原因,提出了3种清理空编组的方法,其中在DXF文件中清理编组是笔者第一个提出,并验证了的方法。
关键词:AutoCAD;编组;空编组;清理;Visual LISP;GROUP; DXF
一、 引言
AutoCAD有良好的界面,具有广泛的适应性,在工程建设、机械制造等行业有广泛的应用。AutoCAD从14.0版本开始出现编组的概念,所谓编组就是把图形中的几个实体编成一个组,既可以单独编辑其中一个实体,也可以整组一起选择。AutoCAD通过编组给用户提供了一个便捷的方式把相关实体或图形与属性注记关联起来,极大的方便了图形的编辑和属性管理。编组给用户带来便捷的同时,也因为容易丢失编组和低版本CAD不易清理空编组的问题,给用户带来烦恼。通过笔者多年使用AutoCAD的经验,总结出解决编组问题的方法。
二、 编组创建和管理
AutoCAD中使用“GROUP”命令创建和管理编组,编组中的实体可以是屏幕上任何可以选择的实体,每个实体有自己的图层和属性。编组分为有名称编组和无名称编组两种。AutoCAD的系统变量“PICKSTYLE”控制编组的状态,当“PICKSTYLE”设置为“1”时,启用编组,选择编组中的任何一个实体,则整个编组都被选中。当“PICKSTYLE”设置为“0”时,不启用编组,可以删除编组中的任意一个实体,不应编组中的其它实体,编组信息也不丢失。编组虽然不像其他实体那样看得见,但AutoCAD确实把它当成对象处理,通过程序可以访问到图形文件中的编组。
三、 编组丢失的原因
AutoCAD中图块和参照的图形只有用特定的命令才能把它炸开,但编组却经常丢失,原因有许多:
(一) 版本转换时丢失。把数据另存到14.0以下版本DWG或DXF数据时编组被忽略,从而造成编组丢失。
(二) 插入图块时,启用“分解”选项或在插入的文件名前加上“*”,则插入的图块被打散,编组不随图块一起插入,从而造成插入部分图形编组丢失,但图块被插入以后,再用“Explode”命令打散,编组不丢失。
(三) 使用“WBLOCK”命令写块保存得到的图形文件不保存编组信息。
(四) 通过编程方法可以在图形文件中直接删除编组信息。
在平时的编辑工作中,只有我们注意以上操作,就可以大大减少编组丢失的可能。
四、 空编组的清理
AutoCAD从14.0版本开始提供创建编组的命令,但直到2006版本都未提供编组的删除命令,编组内的实体被全部删除后,编组还存在图形中,空编组越积越多,导致图形文件越来越大,运行速度降低。经笔者研究,发现可以通过以下三种方法清理空编组。
(一) 用AutoCAD高版本清理空编组。笔者目前发现AutoCAD 2012版本打开图形文件时会自动清理空编组,图形文件较小时,使用这个方法清理很适合,但目前绝大部分用户并没有升级到AutoCAD 2012版本。
(二) 通过程序在图形文件内清理空编组。下面笔者用Visual LISP语言为例说明该程序的设计思路:用函数namedobjdict找到非图形类实体的根图元,通过dictsearch函数在根图元中找到所有的编组,逐一检测编组中是否含有实体,如果没有实体,则为空编组,用entdel函数删除。当文件中编组的数量较多,调用函数dictsearch时,因为要查找并返回所有的编组,所以占用大量的内存和耗费大量的时间。
(三) 通过程序在DXF文件中清理空编组。DXF是通用的图形文件交换格式,其能完整地表达AutoCAD的图形文件,可以通过DXF文件清理图形中的空编组。程序设计的思路如下:把当前图形另存为DXF文件(为不丢失信息,建议保存为相应版本的DXF文件),逐行读取DXF文件,当读到的行内容不为“GROUP”时,写入新文件,当读到的行内容为“GROUP”时,则检测内容为“GROUP”的行与内容为“ 0”的行之间所有的行是否存在内容为“340”的行,如果没有则为空编组,不写入文件,否则要把这几行按顺序写入新文件。Visual LISP程序代码如下:
(defun c:delgroup-dxf ()
(setq name (getvar ""dwgname"") path (getvar ""dwgprefix""))
(setq fr1 (strcat path (vl-string-right-trim "".dwg"" name) "".dxf""))
(setq fw1 (strcat path (vl-string-right-trim "".dwg"" name) ""-del.dxf""))
(command ""_.save"" fr1 """")
(setq fr (open fr1 ""r"") l1 (read-line fr) fw (open fw1 ""w""))
(while l1
(if (not (= ""GROUP"" l1))
(write-line l1 fw)
(progn
(setq ll (list l1) l1 (read-line fr) ft340 nil)
(while (not (= "" 0"" l1))
(setq ll (cons l1 ll))
(if (not ft340)
(if (vl-string-search ""340"" l1)(setq ft340 T))
)
(setq l1 (read-line fr))
)
(setq ll (cons l1 ll))
(if ft340 (progn
(setq i 0 n (length ll) ll (reverse ll))
(repeat n
(setq l2 (nth i ll) i (1+ i))
(write-line l2 fw)
)
))
)
)
(setq l1 (read-line fr))
)
(close fr)
(close fw)
)
程序运行结束后生成一个不含空编组的DXF文件。
五、 应用实例
笔者是测绘工作者,在测绘工作中大比例尺地形图测绘一般采用AutoCAD成图,南方CASS是一款在AutoCAD上进行二次开发的最常用的数字化地形地籍绘图软件。笔者对一个用南方CASS做出来的16.9M图形文件(2004版本,含有43.4万个编组,其中42.2个为空编组),在AutoCAD 2006分别用上述后两种方法进行空编组清理,在图内清理耗时6341秒,在DXF文件中清理耗时仅110秒。前文提到的109M大小的DWG文件,只能在DXF文件中清理空编组。
六、 结束语
虽然AutoCAD 2012版已经提供了清理编组的方法,但笔者探讨方法也是有用的,特别是低版本用户,或者图形编组较多的情况下,用这些方法清理空编组效率更高。本文所探讨的编组丢失的原因对所有的AutoCAD用户都是有益的参考。
[参考文献]
[1] 陈伯雄 冯伟.Visual LISP for AutoCAD 2000 程序设计—从学会到用好[M].北京:机械工业出版社,2000.
[2] 陈伯雄 冯伟.Visual LISP程序设计—技巧与范例[M].北京:人民邮电出版社,2002.
[3] 郭朝勇等.AutoCAD R14 二次开发技术[M].北京:清华大学出版社,1999.
[4] 张国权等.AutoCAD 2006 应用教程[M].北京:电子工业出版社,2007.
[5] Autodesk,AutoCAD R14联机用户手册
[6] Autodesk,AutoCAD2006联机用户手册
[7] Autodesk,AutoCAD 2012联机用户手册