APP下载

基于.NET编程增强Excel与CAD的数据交流功能
——以水利工程设计应用为例

2015-01-04

水利规划与设计 2015年7期
关键词:横断面二次开发控制点

马 宇

(辽宁省大伙房水库输水工程建设局,辽宁沈阳110166)

基于.NET编程增强Excel与CAD的数据交流功能
——以水利工程设计应用为例

马 宇

(辽宁省大伙房水库输水工程建设局,辽宁沈阳110166)

为解决水利工程设计中Excel与CAD的数据交流问题,采用基于C#.NET编程的方式来增强CAD对Excel文件中数据的读取和编辑。

数据交流;Excel;CAD;水利工程设计

1 引言

Excel和CAD是在水利工程设计中广泛应用的商业软件,Excel方便保存、编辑表格数据,CAD有效辅助设计绘制工程图。在设计中,工程师们往往需要把大量的Excel数据转换成直观的CAD中的点、线等图元,在这些图元的基础上进行工程设计;同时也需要把CAD中的一些图元属性提取出来保存到Excel文件中,以便于计算工程量和确定控制坐标等。如何解决好Excel与CAD之间的数据交流是提高水利工程设计效率和质量的重要环节。

Excel和CAD均属于通用软件,虽然CAD中个别功能提供了对Excel文件的简单支持,但由于水利工程上边界条件复杂,随机性强、设计面广[1],CAD的自带功能无法满足水利工程设计中大量数据交流便捷、准确的要求,设计人员的数据交流操作繁琐而重复。

Excel和CAD软件均提供了优良的二次开发接口,随着编程技术的发展和软件版本的升级,对这两种软件进行二次开发的门槛也逐渐降低,基于微软公司提供的.NET平台对Excel和CAD进行二次开发就是一种较为便捷的方法。

2 实现数据交流的思路

借助Excel和CAD提供的二次开发接口,编写一个程序,作为桥梁搭接Excel和CAD程序,程序本身应具有打开、读取、修改、保存Excel文件和CAD文件的功能,并应具备实时显示设计成果和简洁的操作界面等特点。

Excel二次开发主要有三种方式:VBA的内部开发、COM插件开发和自动化服务开发[2]。CAD提供了五种主要的开发工具,分别是:使用C++的Object-ARX,VB/VBA的ActiveX开发,ADS,AutoLisp/VisualLisp以及.NET开发[3]。综合分析两个软件的二次开发方式,本文选用基于.NET开发CAD并添加Excel的COM插件的方式来搭建沟通两个软件的桥梁,这种方法相比其他方式组合更容易搭建编译平台,可以较为完整地调用CAD和Excel提供的二次开发接口功能,方便制作窗口界面和实时检验计算成果。

.NET开发是基于微软.NET平台直接进行CAD二次开发的一种新技术,能够完全支持.NET开发的CAD版本需高于2006。.NET可以引用CAD提供的对象库,进而建立自己的动态链接库程序(*.dll文件),在CAD中加载编译后的动态链接库程序,就可以达到编程操作CAD的功能。通过.NET控制Excel文件的前提是添加Excel的COM组件的引用[4]。COM组件中提供了Excel相关的类和接口,通过COM组件可以编程创建、显示、编辑、读取、保存Excle文件。

创建一个CAD可以加载调用的动态链接库程序,程序同时引用ExcelCOM组件。在CAD环境下启动动态链接库程序,读取Excel文档内容,保存到程序的数据变量中,然后调用CAD中的绘图类,根据读取的数据绘图;或者在CAD中借助提取图形对象函数,提取CAD图纸中的点、线等图元的基本属性,通过程序分析计算形成需要的数据成果,写入到Excel文件中。.NET平台上,可以实现Excel与CAD数据的双向流通,编程思路见图1。

图1 编程沟通Excel和CAD数据流程图

3 编程实现操作Excel与CAD

3.1 编程语言及编译环境

.NET平台又称.NETFramework,目前最新的是4.5版本。是由微软开发的一个致力于敏捷软件开发、快速应用开发、平台无关性、跨语言编程和网络透明化的软件开发平台[5]。.NET包含四种核心语言:VB、VC++、C#和J#[6],本文选用C#进行编程,C#是微软为.NETFramework量身订做的程序语言[7],具有使用简易和功能强大的特点。目前开发.NET平台程序,最高效的编译调试平台莫过于微软公司推出的VisualStudio(简称VS)集成开发环境。本文采用VS2010版本进行编译环境搭建。考虑使用习惯和程序的兼容性,CAD采用2007版本,Excel采用2003版本。

首先,在VS中新建一个项目,模板采用C#下的“类库”,.NET平台选择2.0版本(不同版本CAD对应不同版本.NET,通过较低版本.NET编译的程序一般可以在较高版本CAD中运行)。在“解决方案”中添加引用“acdbmgd.dll”和“acmgd. dll”,并设置“复制本地”为“False”。

然后,引用Excel的COM插件,不同版本Excel对应的COM插件版本有所不同,2003版本的Excel的COM插件名称为“MicrosoftExcel11.0ObjectLibrary”。

最后,设置程序的“调试”属性,启动外部程序路径设为本机CAD2007的“acad.exe”程序路径。至此,程序的编译平台就搭建完成。

3.2 编程操作Excel文档

编程可以实现Excel的大部分功能,具体调用的类和函数也非常多,具体可以参考微软公司提供的COM插件的帮助手册。较为基础和常用的Excel操作为打开文档,读取、修改单元格内容,保存文档。为了更好应对复杂的Excel表格格式,本文采用逐单元格读取/赋值的方式操作Excel文档。例如打开一个路径保存在filename变量的*.xls文件,读取A1单元格内容保存在变量ReadCell中,并修改B1单元格内容为“Level”,编程主要代码为:

(首先添加using Excel=Microsoft.office.Interop.Excel;)

Excel.Applicationapp=newExcel. Application( );∥新建Excel进程

Excel.WorkbookClassw=(Excel. WorkbookClass)app.Workbooks.open(filename,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type. Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type. Missing,Type.Missing,Type.Missing);∥打开文件

Excel.Worksheetsheet=(Excel. Worksheet)w.Sheets;∥选择Excel文件sheet

string ReadCell=((Excel.Range)sheet.Cells[1,1]).Text.ToString( );∥读取A1单元格中的数据

sheet.Cell[1,2]=”Level”;∥修改B1单元格内容为Level

w.Close(null,null,null);∥关闭文件

app.Quit( );∥退出Excel进程,非常重要,不然Excel的进程将一直在电脑后台运行

3.3 编程操作CAD

通过.NET平台操作CAD可以实现CAD的绝大部分功能,可调用的类和函数非常多,具体可参考Autodesk公司提供的CAD二次开发帮助手册。较为基础和常用的CAD操作有绘制图元和提取图元的属性。例如,根据数据绘制一条多段线和提取某点的坐标,以下是编程的主要内容。

首先添加using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.EditorInput;

在新建的类中添加以下代码:

[CommandMethod("SLCAD")] ∥启动程序命令

publicvoidRunApp( )

{∥绘制多段线

intn=pts.Count;∥获取保存多段线坐标的数组pts的点数

Polylineent=newPolyline( );∥新建一个多段线对象

for(inti=0;i<n;i++)∥设置多段线各节点坐标

ent.AddVertexAt(i,pts[i],0,0,0);objectIdentId=Append Entity(ent);对象添加到CAD文件列表中∥提取点坐标

Editoreditor=Autodesk.AutoCAD. Application Services.Application.Document Manager.MdiActive Document.Editor;∥新建一个编辑对象

Prompt Pointoptionsoptions=new Prompt Pointoptions(" 请在图纸上选取点");

options.AllowNone=true;∥提取坐标

Point3dcenPt=editor.GetPoint(options).Value;∥把点坐标保存到cenPt变量中}

3.4 加载调用程序

通过VS编译后生成动态链接库程序。在打开的CAD中输入命令“netload”后弹出对话框,在对话框中找到生成的动态链接库程序路径,加载程序。然后输入启动程序的命令,例如上面一个例子中,需要输入“SLCAD”命令启动程序功能。

4 编程实例

实际编程中,可以借助.NET平台创建窗口,给Excel文件的开启和关闭设置相应的按钮或提示。如果频繁调用CAD中的主要函数,每次编写代码较为繁琐,可以自定义类和函数,把常用的功能模块化。例如绘制多段线的功能,可以模块化为函数:

publicstaticobjectIdAddPline(Point2dCollectionpts,doublewidth)

∥函数的参数为保存多段线点的数组和拟画多段线的线宽

{try{intn=pts.Count;Polyline ent=newPolyline( );

for(inti=0;i<n;i++)

ent.AddVertexAt(i,pts[i],0,width,width);

objectIdentId=AppendEntity(ent);

returnentId;∥返回多段线对象}

catch∥程序异常处理

{objectIdnullId=objectId.Null;returnnullId;}}

4.1 读取Excel中横断面数据,在CAD中绘制横断面图

在水利工程设计中,经常要在横断面图上进行工程布置和计算工程量等,实测横断面数据通常以Excel文件保存,断面数目多,且格式类似。如果逐一手绘横断面,不仅工作量极大,而且准确性差。本文通过.NET编程实现读取Excel中横断面数据,在CAD中绘制横断面图的功能,即通过程序读取如图2中的Excel数据,调整程序参数,在CAD中绘制如图4的横断面图。

4.2 在CAD图中拾取控制点,并把控制点坐标保存到Excel文件中

水利工程设计中,为了方便工程放样,需要提供CAD设计图纸中控制点的坐标。坐标文件通常采用Excel格式保存。对于控制点较多的图纸而言,如果采用手动的方式逐一获取控制点坐标属性,输入到Excel文件里,效率非常低,而且容易出错。本文采用.NET编程的方法,实现在CAD图中拾取控制点,并把控制点坐标保存到Excel文件中,即通过程序提取如图5中的CAD图纸中的控制点属性,筛选整理控制点坐标,将坐标保存到如图7的Excel文件中。

图2 Excel中横断面数据格式

图3 程序界面截图

图4 程序在CAD中绘图成果图

图5 CAD文件中控制点位置

图6 程序界面截图

图7 提取坐标输入到Excel中成果

5 结语

基于.NET平台,凭借Excel和CAD提供的二次开发接口,可以较方便地实现Excel与CAD之间的数据交流功能,简化水利设计过程中的操作步骤,提高绘图、计算的速度和精度。由于篇幅限制,本文只简单介绍了Excel和CAD二次开发的最基本功能,在实际生产工作中,结合Excel和CAD的二次开发运用,有着更大的灵活性和扩展空间。

[1]梁国伟等.CAD二次开发在水利水电工程制图中的应用[J].水科学与工程技术,2006(02):50-51.

[2]郭来军.浅谈EXCEL二次开发的三种方式[J].辽宁科技学院学报,2007(04):23+29.

[3]王永辉,胡青泥与李红彩.AutoCAD二次开发方法的研究[J].计算机系统应用,2007(03):94-96+100.

[4]斯琴巴图,杨利润.C#winform中嵌入Excel实现复杂表格的显示和控制[J].软件导刊,2013(04):26-27.

[5]KarliWatson,ChristianNagel,BeginningVisualC#2010[M],WileyPublishing,2010.

[6]黄箐,马德山,项链.基于.NET实现多语言互操作性[J].西北民族大学学报(自然科学版),2007(02):38-44.

[7]蔡守允,杨大明,朱其俊.模型试验流速测量仪器的分析研究[J].水资源与水工程学报,2007(03).

TP316

:B

:1672-2469(2015)07-0056-04

10.3969/j.issn.1672-2469.2015.07.021

马 宇(1981年—),男,工程师。

猜你喜欢

横断面二次开发控制点
城市道路横断面设计研究
浅谈基于Revit平台的二次开发
浅谈Mastercam后处理器的二次开发
西门子Easy Screen对倒棱机床界面二次开发
NFFD控制点分布对气动外形优化的影响
基于风险管理下的项目建设内部控制点思考
广州市健康体检人群种植修复情况的横断面研究
相似材料模型中控制点像点坐标定位研究
2014年某院医院感染横断面调查
中医院医院感染横断面调查分析