馬 宇
(遼寧省大伙房水庫輸水工程建設局,遼寧沈陽110166)
基于.NET編程增強Excel與CAD的數據交流功能
——以水利工程設計應用為例
馬 宇
(遼寧省大伙房水庫輸水工程建設局,遼寧沈陽110166)
為解決水利工程設計中Excel與CAD的數據交流問題,采用基于C#.NET編程的方式來增強CAD對Excel文件中數據的讀取和編輯。
數據交流;Excel;CAD;水利工程設計
Excel和CAD是在水利工程設計中廣泛應用的商業軟件,Excel方便保存、編輯表格數據,CAD有效輔助設計繪制工程圖。在設計中,工程師們往往需要把大量的Excel數據轉換成直觀的CAD中的點、線等圖元,在這些圖元的基礎上進行工程設計;同時也需要把CAD中的一些圖元屬性提取出來保存到Excel文件中,以便于計算工程量和確定控制坐標等。如何解決好Excel與CAD之間的數據交流是提高水利工程設計效率和質量的重要環節。
Excel和CAD均屬于通用軟件,雖然CAD中個別功能提供了對Excel文件的簡單支持,但由于水利工程上邊界條件復雜,隨機性強、設計面廣[1],CAD的自帶功能無法滿足水利工程設計中大量數據交流便捷、準確的要求,設計人員的數據交流操作繁瑣而重復。
Excel和CAD軟件均提供了優良的二次開發接口,隨著編程技術的發展和軟件版本的升級,對這兩種軟件進行二次開發的門檻也逐漸降低,基于微軟公司提供的.NET平臺對Excel和CAD進行二次開發就是一種較為便捷的方法。
借助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.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”命令啟動程序功能。
實際編程中,可以借助.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中成果
基于.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年—),男,工程師。