吴献文
(1.湖北工业大学,湖北 武汉430068;2.广东省地质物探工程勘察院,广东 广州510800)
原有地下管线数据处理成图系统采用AutoLISP开发工具编写,在AutoCAD平台上加载,通过数据处理子系统输出的成图文本文件自动成图。AutoLISP开发工具本身的局限性导致其较难实现对MDB格式数据较为直观的控制,因此成图子系统和数据处理子系统的关联只限于文本文件,一旦需要修改则图面和数据库都要修改。事实表明,这种图库分开的关联方式给内业操作人员造成很大的不便,修改数据不直观、容易出错。因此,迫切需要一种高层次的开发,使数据处理和成图更有效的结合,并能同时控制相同数据库格式,更好地满足生产工作的需要。
AutoCAD是由美国Autodesk公司推出、在国际工程界广泛使用的计算机辅助绘图软件。AutoCAD是一个功能齐全、应用广泛的通用图形软件包,且具有开放式的体系结构,赢得了广大用户的青睐。
AutoCAD为用户提供了3种二次开发工具的接口:一是AutoCAD内置的Visual LISP,二是Visual Basic/VBA,三是ObjectARX。ObjectARX是Autodesk公司提供给用户的一个AutoCAD与VC++的应用程序接口(API)模块,它包含220个类和3000多个成员函数,用它开发出的应用程序以动态连接库的形式与AutoCAD共享地址空间。与前两种开发工具相比,ObjectARX有独特的优势:①ObjectARX本身是采用面向对象技术设计开发的,易学易用,功能强大;②使用ObjectARX开发的程序可以直接操作AutoCAD的底层数据库,效率高。
托管ObjectARX可以使用.NET所支持的任何语言进行开发,达到与使用C++开发的ObjectARX几乎同样强大的功能。托管ObjectARX封装了绝大部分的ObjectARX SDK,它可以执行数据库功能,使用户可以读写DWG文件,访问AutoCAD的界面元素,包括命令行、特性对话框、编辑器、发布和出图工具等。它由acdbmgd.dll和acbmgd.dll两个程序集组成。
DAO(数据访问对象)是一种应用程序编程接口(API),存在于微软的Visual Basic中,允许程序员请求对微软的Access数据库的访问。DAO是微软的第1个面向对象的数据库接口。DAO对象封闭了Access的Jet函数。通过Jet函数,还可以访问其他的结构化查询语言(SQL)数据库。
基于以上分析,成图系统在通用图形软件Auto-CAD 2009平台上进行二次开发,采用VB.NET 2008版软件开发环境,使用托管ObjectARX和DAO数据库访问技术。
在VB.NET中使用AutoCAD.NET托管封装类,必须先添加引用acdbmgd.dll和acmgd.dll。在Auto-CAD 2009的安装目录下找到它们,并添加引用到工程中。正如它们的名字所表示的,acdbmgd.dll包含ObjectDBX托管类,而acmgd.dll包含AutoCAD托管类。
在类的声明语句之前,导入ApplicationServices、ApplicationServices、EditorInput和Runtime命名空间,即:
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Interop
工程需要引用Microsoft DAO 3.6 Object Library,具体实现代码如下:
Dim DB As DAO.Database
Dim RP As DAO.Recordset
Dim RL As DAO.Recordset
Dim mdbdge As New DAO.DBEngine
MyMdb=mdbdge.Workspaces(0).OpenDatabase(DataName)
RP=MyMdb.OpenRecordset(LayName&″POINT″,DAO.RecordsetTypeEnum.dbOpenDynaset)
RL=MyMdb.OpenRecordset(LayName&″LINE″,DAO.RecordsetTypeEnum.dbOpenDynaset)
下面具体介绍管线点实体的插入,通过DAO技术从数据库里读取各管类的信息,包括点位坐标位置、属性信息(点号、点代码和点特征等)等,将其实体展绘在AutoCAD平台上,如图1所示,并将其属性信息写入实体的扩展数据,以便后面信息的读取。
图1
关键实现代码如下:
Dim MoSpace As Autodesk.AutoCAD.Interop.Common.AcadModelSpace
Dim PntSymbol As Autodesk.AutoCAD.Interop.Common.AcadBlockReference
PntSymbol=MoSpace.InsertBlock(insPnt,DwgFile,0.5,0.5,0.5,dAngle)
AcadRun.Point_SetXdata(PntSymbol,XD0,SPoint,PT1.Layer&″POINT″)
AcadRun.Point_SetXdata(PntSymbol,XD1,s1,PT1.Layer&″POINT″)
在ActiveX技术中,GetEntity方法能够返回一个AcadEntity类型的对象和一个Variant类型的变量(表示拾取点的位置)。在拖管封装的ARX中无法直接使用该返回值,但是在AutoCAD的一个进程中,不同语言中ObjectID的值是一致的,就可以通过ObjectId在两种语言中实现实体的传递。代码如下:
Dim pickPnt As Object
Dim xdataOut As Object
Dim xtypeOut As Object
DimacadDoc As Autodesk.AutoCAD.Interop.AcadDocument
Dim entObj As Autodesk.AutoCAD.Interop.Common.AcadEntity
acadDoc.Utility.GetEntity(entObj,pickPnt,″请选择实体″)
entObj.GetXData(XD0,xtypeOut,xdataOut)
S=xdataOut(1)
通过此方法在AutoCAD上读取实体信息后,通过DAO连接数据库信息,并弹出窗口显示出来。用户可以通过窗口对数据进行添加或修改,非常方便快捷。通过属性窗口,实现了图面实体和数据库的连接,用户使用修改操作,图面和数据库的信息都会同步得到修改,实现了图库联动的目的,如图2所示。
图2
本系统采用VB.NET 2008版软件开发工具,使用托管ObjectARX和DAO数据库访问技术,实现了AutoCAD图面实体和Access数据库的动态连接,很好地实现了图库联动功能,使修改工作更加方便快捷,满足了工作生产的需要,大大提高了内业数据处理工作的效率,带来了一定的生产效益。
[1] 北京市测绘设计研究院.CJJ 61—2003J271—2003城市地下管线探测技术规程[S].北京:中国建筑工业出版社,2003.
[2] 曾洪飞,张帆,卢择临.AutoCAD VBA&VB.NET开发基础与实例教程[M].北京:中国电力出版社,2008.