利用托管ObjectARX和DAO技术实现图库联动功能

2015-03-29 06:34吴献文
测绘通报 2015年6期
关键词:图库数据处理代码

吴献文

(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数据库访问技术。

三、图库联动具体实现过程

1.引用ObjectARX.NET封装类

在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

2.通过DAO连接数据库

工程需要引用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)

3.创建实体(点、线和文字)

下面具体介绍管线点实体的插入,通过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″)

4.在AutoCAD平台上读取实体信息

在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.

猜你喜欢
图库数据处理代码
金山农民画矢量图库的建设与应用
认知诊断缺失数据处理方法的比较:零替换、多重插补与极大似然估计法*
基于低频功率数据处理的负荷分解方法
ILWT-EEMD数据处理的ELM滚动轴承故障诊断
创世代码
创世代码
创世代码
创世代码
视图库在AI浪潮里的发展应用
Photoshop CC图库面板的正确打开方法