国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

AutoCAD結(jié)構(gòu)化表單與Excel數(shù)據(jù)交換方法研究

2017-12-12 20:29張向良
科技創(chuàng)新與應(yīng)用 2017年34期
關(guān)鍵詞:二次開發(fā)

張向良

摘 要:Excel與AutoCAD表單是工作中常見的兩種工具,由于AutoCAD與Excel屬于兩個(gè)不同的信息系統(tǒng),傳統(tǒng)的人工填寫的工作方式已經(jīng)使得AutoCAD與Excel之間的信息交互越來越難以滿足工作需求。文章將探討在AutoCAD結(jié)構(gòu)化表單與Excel之間進(jìn)行高效數(shù)據(jù)交換的方法,介紹OLE、Excel對(duì)象模型、AutoCAD圖形數(shù)據(jù)庫結(jié)構(gòu)等前置技術(shù)知識(shí)以及數(shù)據(jù)交換的具體實(shí)現(xiàn)方式,以期為相關(guān)的數(shù)據(jù)采集工作提供高效的解決方案。

關(guān)鍵詞:Excel;AutoCAD;結(jié)構(gòu)化表單;OLE;ObjectARX;二次開發(fā)

中圖分類號(hào):TP399 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):2095-2945(2017)34-0093-02

引言

Excel作為最為人所熟悉的數(shù)據(jù)統(tǒng)計(jì)工具,被很多企業(yè)選擇與使用,而AutoCAD在工程中的應(yīng)用同樣極為廣泛。很多時(shí)候需要在這兩個(gè)平臺(tái)間傳遞數(shù)據(jù),以作者所在的航空制造業(yè)某部門為例,工作時(shí)就需要將保存于AutoCAD圖表中的產(chǎn)品信息錄入到Excel服務(wù)器中,這些數(shù)據(jù)在后一平臺(tái)上進(jìn)行集中管理。本文將探討在AutoCAD與Excel兩平臺(tái)間自動(dòng)交換數(shù)據(jù)的方法,以及如何在基于ObjectARX(VC)開發(fā)的程序中實(shí)現(xiàn)。該方法用程序代替人工操作,在為設(shè)計(jì)人員提供方便的同時(shí)也保證了數(shù)據(jù)采集的可靠性。

1 運(yùn)行環(huán)境概述

Excel是Microsoft發(fā)布的一款廣為人知的數(shù)據(jù)統(tǒng)計(jì)工具。本文討論Excel與AutoCAD圖表的數(shù)據(jù)交換,未涉及Excel的其它定制功能.結(jié)構(gòu)化AutoCAD表單是在AutoCAD圖形中加入帶有附加信息的圖元,如擴(kuò)展數(shù)據(jù)、擴(kuò)展記錄、自定義實(shí)體、塊參照等。以帶屬性的塊參照為例,由于屬性是一種包含了標(biāo)簽、提示和值的結(jié)構(gòu)體,而不像普通的文字或多行文字那樣只有一個(gè)值,這使得計(jì)算機(jī)能夠“理解”用戶所輸入的內(nèi)容(而不是簡(jiǎn)單地將其視為一個(gè)字符串)。這為后期的數(shù)據(jù)采集與分析提供了極大的方便。

由于windows會(huì)為每個(gè)進(jìn)程分配獨(dú)立的地址空間(用戶空間),進(jìn)程不能夠以任何方式讀寫其他進(jìn)程用戶空間的數(shù)據(jù)[1]。即使使用系統(tǒng)API,也無法確定所需要讀、寫的數(shù)據(jù)的地址。所以需要使用一種能夠跨越進(jìn)程邊界通信的方法,即OLE技術(shù)。

2 OLE技術(shù)與Excel對(duì)象模型

基于COM的OLE2(業(yè)內(nèi)簡(jiǎn)稱OLE)是一種Microsoft推出的一種windows下的對(duì)象通信技術(shù),經(jīng)過多年的擴(kuò)充和演化,現(xiàn)已變成了在桌面系統(tǒng)上進(jìn)行程序通信的一個(gè)技術(shù)總稱[2]。使用OLE方式讀寫Excel,需要首先創(chuàng)建一個(gè)Excel對(duì)象(或通過其它途徑獲得一個(gè)),然后通過Excel預(yù)留的接口調(diào)用它所提供的服務(wù),就像Excel本身在操作單元格一樣。

為此需要了解Excel的程序結(jié)構(gòu),也就是對(duì)象模型。Microsoft在Excel 2007開發(fā)人員參考中提供了Excel對(duì)象模型參考,詳細(xì)地描述了各種對(duì)象的屬性和方法。對(duì)于讀寫Excel而言需要用到其中的3對(duì)象:_Application、_Worksheet和Range。_Application代表Excel應(yīng)用程序,一個(gè)_Application 對(duì)象中包含若干個(gè)工作簿_Workbook,后者又包含多個(gè)工作表_Worksheet,而Range則代表一個(gè)區(qū)域,當(dāng)然也可以是1個(gè)單元格,如圖1。

首先需要獲得_Application對(duì)象,進(jìn)而使用其AttachDispatch函數(shù)獲得_Worksheet對(duì)象、Range對(duì)象,然后便可使用SetItem和GetItem函數(shù)讀寫單元格里的內(nèi)容。

3 AutoCAD圖形數(shù)據(jù)庫

讀寫結(jié)構(gòu)化的AutoCAD表單需要了解AutoCAD圖形數(shù)據(jù)庫的結(jié)構(gòu)。每個(gè)承載表單的dwg文件就是一個(gè)AutoCAD圖形數(shù)據(jù)庫AcDbDatabase[3],其中包含了塊表AcDbBlockTable,塊表中包含了模型空間ACDB_MODEL_SPACE,而用戶所繪制的圖形、文字等實(shí)體就存在于模型空間中。

ObjectARX(VC)提供了相關(guān)的類庫與函數(shù)來訪問上述對(duì)象。首先獲得當(dāng)前活動(dòng)圖形數(shù)據(jù)庫的塊表,獲得包含結(jié)構(gòu)化數(shù)據(jù)的塊定義,然后檢索模型空間中的此塊定義的塊參照AcDbBlockReference。需要讀取的數(shù)據(jù),也就是屬性AcDbAttribute的值,就包含在這些塊參照中。

4 數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)

至此已經(jīng)擁有了外部讀寫Excel和讀寫結(jié)構(gòu)化AutoCAD表單中數(shù)據(jù)的方法。只需設(shè)計(jì)編寫承載數(shù)據(jù)的載體,將上述三者連接起來封裝成命令,便可以實(shí)現(xiàn)結(jié)構(gòu)化AutoCAD表單與Excel之間的一鍵式數(shù)據(jù)交換.命令通過以下步驟實(shí)現(xiàn):(1)使用OLE方式獲得Excel實(shí)例。(2)讀取結(jié)構(gòu)化AutoCAD表單,將數(shù)據(jù)存入中繼數(shù)據(jù)結(jié)構(gòu)。(3)讀寫Excel與寫入AutoCAD表單,如圖2。

所述的步驟(1)使用OLE方式獲得Excel實(shí)例:首先獲得_Application對(duì)象的COM類型標(biāo)識(shí)符,之后COM庫會(huì)從系統(tǒng)注冊(cè)表中找到對(duì)應(yīng)組件的程序路徑等信息,用以獲取運(yùn)行中的Excel實(shí)例的IUnkown接口,并通過該接口查詢到IDispatch接口。部分代碼如下:

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

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

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

...

再用_Application對(duì)象的AttachDispatch函數(shù)獲得_Worksheet對(duì)象,進(jìn)而Range對(duì)象。在此不再贅述。endprint

步驟(2)讀取結(jié)構(gòu)化AutoCAD表單:首先獲得當(dāng)前活動(dòng)圖形數(shù)據(jù)庫的塊表,獲得包含結(jié)構(gòu)化數(shù)據(jù)的塊定義,然后檢索模型空間中的此塊定義的塊參照AcDbBlockReference。建立一個(gè)屬性遍歷器,遍歷塊參照中的屬性,根據(jù)屬性的標(biāo)簽不同把它的值用textString函數(shù)讀入到TemplateItem結(jié)構(gòu)對(duì)應(yīng)的變量中。部分代碼如下:

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("序列號(hào)"))==0)

XuLieHao = pAtt->textString();

...

pAtt->close();

}

}

delete attIt;

...

步驟(3)讀寫Excel與寫入AutoCAD表單:根據(jù)Excel表單的要求使用SetItem函數(shù)讀寫單元格,內(nèi)容取決于中繼數(shù)據(jù)結(jié)構(gòu)TemplateItem中封裝的函數(shù)。在向Excel寫入數(shù)據(jù)后,還應(yīng)用GetItem讀取相關(guān)信息并回寫到AutoCDA圖形數(shù)據(jù)庫中。

5 結(jié)束語

本文針對(duì)AutoCAD與Excel之間數(shù)據(jù)交互效率低的問題探討了使用基于ObjectARX(VC)開發(fā)的程序讀取結(jié)構(gòu)化AutoCAD表單中的數(shù)據(jù),并使用OLE技術(shù)將之導(dǎo)入Excel的方法。整個(gè)過程全部由程序自動(dòng)完成,極大地提高了工作效率,同時(shí)避免了人工操作可能出現(xiàn)的種種失誤,為相關(guān)數(shù)據(jù)采集工作提供了高效的解決方案。

參考文獻(xiàn):

[1]王艷平,張錚.Windows程序設(shè)計(jì)(第2版)[M].人民郵電出版社,2008.

[2]余英,梁剛.VisualC++實(shí)踐與提高COM和COM+篇[M].中國鐵道出版社,2001.

[3]張帆,朱文俊.AutoCAD ObjectARX(VC)開發(fā)基礎(chǔ)與實(shí)例教程[M].中國電力出版社,2014.endprint

猜你喜歡
二次開發(fā)
例談對(duì)高中數(shù)學(xué)教材中習(xí)題的二次開發(fā)
淺談CAD軟件二次開發(fā)的方法及工具
例談?wù)n本習(xí)題的“二次開發(fā)”