AutoCAD结构化表单与Excel数据交换方法研究

2017年12月21日 02:37来源于:科技创新与应用

数据交换格式与交换方法的研究

张向良

摘 要:Excel与AutoCAD表单是工作中常见的两种工具,由于AutoCAD与Excel属于两个不同的信息系统,传统的人工填写的工作方式已经使得AutoCAD与Excel之间的信息交互越来越难以满足工作需求。文章将探讨在AutoCAD结构化表单与Excel之间进行高效数据交换的方法,介绍OLE、Excel对象模型、AutoCAD图形数据库结构等前置技术知识以及数据交换的具体实现方式,以期为相关的数据采集工作提供高效的解决方案。

关键词:Excel;AutoCAD;结构化表单;OLE;ObjectARX;二次开发

中图分类号:TP399 文献标志码:A 文章编号:2095-2945(2017)34-0093-02

引言

Excel作为最为人所熟悉的数据统计工具,被很多企业选择与使用,而AutoCAD在工程中的应用同样极为广泛。很多时候需要在这两个平台间传递数据,以作者所在的航空制造业某部门为例,工作时就需要将保存于AutoCAD图表中的产品信息录入到Excel服务器中,这些数据在后一平台上进行集中管理。本文将探讨在AutoCAD与Excel两平台间自动交换数据的方法,以及如何在基于ObjectARX(VC)开发的程序中实现。该方法用程序代替人工操作,在为设计人员提供方便的同时也保证了数据采集的可靠性。

1 运行环境概述

Excel是Microsoft发布的一款广为人知的数据统计工具。本文討论Excel与AutoCAD图表的数据交换,未涉及Excel的其它定制功能.结构化AutoCAD表单是在AutoCAD图形中加入带有附加信息的图元,如扩展数据、扩展记录、自定义实体、块参照等。以带属性的块参照为例,由于属性是一种包含了标签、提示和值的结构体,而不像普通的文字或多行文字那样只有一个值,这使得计算机能够“理解”用户所输入的内容(而不是简单地将其视为一个字符串)。这为后期的数据采集与分析提供了极大的方便。

由于windows会为每个进程分配独立的地址空间(用户空间),进程不能够以任何方式读写其他进程用户空间的数据[1]。即使使用系统API,也无法确定所需要读、写的数据的地址。所以需要使用一种能够跨越进程边界通信的方法,即OLE技术。

2 OLE技术与Excel对象模型

基于COM的OLE2(业内简称OLE)是一种Microsoft推出的一种windows下的对象通信技术,经过多年的扩充和演化,现已变成了在桌面系统上进行程序通信的一个技术总称[2]。使用OLE方式读写Excel,需要首先创建一个Excel对象(或通过其它途径获得一个),然后通过Excel预留的接口调用它所提供的服务,就像Excel本身在操作单元格一样。

为此需要了解Excel的程序结构,也就是对象模型。Microsoft在Excel 2007开发人员参考中提供了Excel对象模型参考,详细地描述了各种对象的属性和方法。对于读写Excel而言需要用到其中的3对象:_Application、_Worksheet和Range。_Application代表Excel应用程序,一个_Application 对象中包含若干个工作簿_Workbook,后者又包含多个工作表_Worksheet,而Range则代表一个区域,当然也可以是1个单元格,如图1。

首先需要获得_Application对象,进而使用其AttachDispatch函数获得_Worksheet对象、Range对象,然后便可使用SetItem和GetItem函数读写单元格里的内容。

3 AutoCAD图形数据库

读写结构化的AutoCAD表单需要了解AutoCAD图形数据库的结构。每个承载表单的dwg文件就是一个AutoCAD图形数据库AcDbDatabase[3],其中包含了块表AcDbBlockTable,块表中包含了模型空间ACDB_MODEL_SPACE,而用户所绘制的图形、文字等实体就存在于模型空间中。

ObjectARX(VC)提供了相关的类库与函数来访问上述对象。首先获得当前活动图形数据库的块表,获得包含结构化数据的块定义,然后检索模型空间中的此块定义的块参照AcDbBlockReference。需要读取的数据,也就是属性AcDbAttribute的值,就包含在这些块参照中。

4 数据结构的设计

至此已经拥有了外部读写Excel和读写结构化AutoCAD表单中数据的方法。只需设计编写承载数据的载体,将上述三者连接起来封装成命令,便可以实现结构化AutoCAD表单与Excel之间的一键式数据交换.命令通过以下步骤实现:(1)使用OLE方式获得Excel实例。(2)读取结构化AutoCAD表单,将数据存入中继数据结构。(3)读写Excel与写入AutoCAD表单,如图2。

所述的步骤(1)使用OLE方式获得Excel实例:首先获得_Application对象的COM类型标识符,之后COM库会从系统注册表中找到对应组件的程序路径等信息,用以获取运行中的Excel实例的IUnkown接口,并通过该接口查询到IDispatch接口。部分代码如下:

CLSIDFromProgID(L"Excel.Application", &clsid);

GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);

pUnk->QueryInterface(IID_IDispatch, (void**)&pDisp);

...

再用_Application对象的AttachDispatch函数获得_Worksheet对象,进而Range对象。在此不再赘述。endprint

步骤(2)读取结构化AutoCAD表单:首先获得当前活动图形数据库的块表,获得包含结构化数据的块定义,然后检索模型空间中的此块定义的块参照AcDbBlockReference。建立一个属性遍历器,遍历块参照中的属性,根据属性的标签不同把它的值用textString函数读入到TemplateItem结构对应的变量中。部分代码如下:

attIt = pBlkRef->attributeIterator();

for (attIt->start();!attIt->done();attIt->step())

{

es = acdbOpenObject(pAtt,attIt->objectId(),AcDb::kForRead);

if (es==Acad::eOk)

{

CString strTag = pAtt->tag();

if (strTag.CompareNoCase(_T("序列号"))==0)

XuLieHao = pAtt->textString();

...

pAtt->close();

}

}

delete attIt;

...

步骤(3)读写Excel与写入AutoCAD表单:根据Excel表单的要求使用SetItem函数读写单元格,内容取决于中继数据结构TemplateItem中封裝的函数。在向Excel写入数据后,还应用GetItem读取相关信息并回写到AutoCDA图形数据库中。

5 结束语

本文针对AutoCAD与Excel之间数据交互效率低的问题探讨了使用基于ObjectARX(VC)开发的程序读取结构化AutoCAD表单中的数据,并使用OLE技术将之导入Excel的方法。整个过程全部由程序自动完成,极大地提高了工作效率,同时避免了人工操作可能出现的种种失误,为相关数据采集工作提供了高效的解决方案。

参考文献:

[1]王艳平,张铮.Windows程序设计(第2版)[M].人民邮电出版社,2008.

[2]余英,梁刚.VisualC++实践与提高COM和COM+篇[M].中国铁道出版社,2001.

[3]张帆,朱文俊.AutoCAD ObjectARX(VC)开发基础与实例教程[M].中国电力出版社,2014.endprint

 
免责声明:

     本文仅代表作者/企业观点,与【名品家电网】无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅供读者参考,并自行核实相关内容。

     【名品家电网】刊载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

      如因作品内容、版权和其它问题需要同本网联系的,请在30日内进行;新闻纠错: lwl#youngchina.cn

关键词: 文章 对象 数据