程序实现AutoCAD Map3D 中的图形清理(MapClean)自动化
我们在进行数据采集后,经常需要对数据做清理工作以建立拓扑。比如在从图纸数字化的过程中,经常会有些线段该接上的而没接上,或者有短小露头的地方等等。Map3D中的图形清理(MapClean)就是自动化完成这些数据修复,从而为建立拓扑做好准备的工具。这篇文章中我就来说说 Map 3D中的图形清理工具的用法,以及如何通过程序的方式实现图形清理的自动化。
比如我们有下面的地图,比如是河流吧。其中我选中的线段明显是在数字化时画出了头,应该把小头头去掉。还有一个是没画到头而接不上。这种问题在数字化时是非常常见的。图形清理工具就是解决这些问题的。
要调用图形清理工具,直接在命令行敲“MapClean”即可调出图形清理向导。这里首先要选择要操作的对象,可以选择全部或者手动选择。
然后是要进行的图形清理工作项,Map 3D以及内置的多种工作项,能够解决工作中遇到的绝大多数图形问题。比如我们这里添加了一个从交点打断的工作项,然后再把小于指定容差的小对象删除。对应容差的设置你可以通过点pick按钮在图面上指定。你可以添加多个,并设置他们的执行顺序。每个工作项的含义大家一看便知,如果有中文版就更方便了 :)
这里指定是对原数据直接进行修改还是创建一个拷贝
最后你还可以把这些操作步骤保存为脚本文件方便重复使用。通过Save或Load按钮即可保存或加载脚本文件。保存的脚本文件其实是一个扩展名为dpf的xml文件,你可以用写字本打开来查询它的内容。看一下执行结果如下,当然你可以继续增加新的工作项把每接上头的那些接上。
好了,界面用法很简单,下面我们看看如果用代码来实现。我们需要用Visual Studio编写一个自定义的命令,在执行这个命令时自动调用我的dpf文件执行图形清理工作。
首先打开VS2008,创建一个Class Library类型的项目,并添加Map 3D 相关的引用。我们需要添加如下引用,这些文件都在Map3D的安装目录下:
acdbmgd.dll
acmgd.dll
ManagedMapApi.dll
注意要把引用的Copy To Local设置为false。
好了,代码最有说服力,直接看代码吧:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.Gis.Map.Topology; using Autodesk.AutoCAD.Runtime; using Autodesk.Gis.Map; namespace MapCleanDemo { public class Class1 { [CommandMethod("MyClean")] public void DrawingCleanUp() { Autodesk.Gis.Map.Topology.Variable cadAction = new Autodesk.Gis.Map.Topology.Variable(); //加载一个dpf脚本文件 cadAction.LoadProfile(@"myclean.dpf"); //如不用脚本文件,也可以通过代码定义图形清理工作项 //.... //为避免内存泄露,TopologyClean对象使用完毕后要调用dispose()方法释放,也可以采用using语句 //The instance of this class should be released by explicitly calling Dispose() in order to avoid memory leak. //See also 'using' keyword in C# and VB.Net. using (Autodesk.Gis.Map.Topology.TopologyClean cadCleanobj = new Autodesk.Gis.Map.Topology.TopologyClean()) { //TODO:在运行这个命令之前需要打开dwg文件,在这里增加一个判断语句 //Open a file first to avoid MapTopologyException cadCleanobj.Init(cadAction, null); cadCleanobj.Start(); cadCleanobj.GroupNext(); while (!cadCleanobj.Completed) { cadCleanobj.GroupFix(); cadCleanobj.GroupNext(); } //提交所做的更改 Commit the changes cadCleanobj.End(); } } } }
编译后,我们在Map 3D中敲netload加载我们生成的dll文件,然后键入MyClean即可完成图形清理的自动执行。需要注意的一点就是在执行这个命令之前,要首先打开dwg文档,否则会有MapTopologyException例外发生。为了程序的健壮性,最好在前面加上判断条件。
除了加载dpf脚本的方式外,还可以用代码定义图形清理工作项,具体的可以参考SDK的帮助文件sdk.arx.net.dev.chm,比如在帮助文件中有下面一小段代码:
1: Dim toleranceVal As New DatabaseServices.TypedValue _
2: (Autodesk.AutoCAD.DatabaseServices.DxfCode.Real, 25.5)
3: Dim toleranceSetting As New DatabaseServices.ResultBuffer
4: toleranceSetting.Add(toleranceVal)
5:
6: Dim blocksVal As New DatabaseServices.TypedValue _
7: (Autodesk.AutoCAD.DatabaseServices.DxfCode.Int16, 1)
8: Dim blocksSetting As New DatabaseServices.ResultBuffer
9: blocksSetting.Add(blocksVal)
10:
11: Dim settings As New Topology.Variable
12: settings.Set("CLEAN_TOL", toleranceSetting)
13: settings.Set("INCLUDE_BLOCKS", blocksSetting)
14:
15: Dim action As New Topology.Variable
16: action.InsertActionToList(-1, 8, settings)
好了,实现也很简单,大家自己试试吧。对了,SDK帮助文件可以同ADN网站上下载,不是ADN的也可以从Autodesk官方网站的Developer Center下载。这个SDK包中包含了好的实例代码和帮助文档。下载地址是http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=868220
实例代码下载 MapCleanDemo.zip
先到这儿,您有任何问题可以下面评论,或者到MGDN论坛讨论。
峻祁连(Daniel Du)