施蘇毅,熊俊華
(昆明理工大學(xué),650093,昆明)
基于ObjectARX的線劃圖文件批量處理研究
施蘇毅,熊俊華
(昆明理工大學(xué),650093,昆明)
數(shù)字線劃圖(DLG)是我國(guó)基礎(chǔ)地理信息數(shù)字成果之一,外業(yè)測(cè)繪的成果一般就是DLG。DLG使用較為廣泛的格式為AutoCAD的DWG格式,闡述了DWG格式的線劃圖文件批量處理。圖形文件批量處理就是根據(jù)用戶的需求對(duì)多個(gè)圖形文件進(jìn)行相同的操作,這些操作可由計(jì)算機(jī)自動(dòng)化完成。ObjectARX是AutoCAD常用的開(kāi)發(fā)工具,研究了基于ObjectARX與C#.NET對(duì)AutoCAD進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)線劃圖文件批量處理的技術(shù),具有較好的現(xiàn)實(shí)意義與廣泛的應(yīng)用前景。
線劃圖;ObjectARX;批量處理; AutoCAD
數(shù)字線劃圖(DLG)采用點(diǎn)、線、面形式或地圖特定圖形符號(hào)形式表達(dá)地形要素。在AutoCAD中對(duì)應(yīng)著DataBase中的實(shí)體要素。每個(gè)實(shí)體或圖元對(duì)應(yīng)一個(gè)數(shù)據(jù)記錄,主要用來(lái)存儲(chǔ)實(shí)體的幾何數(shù)據(jù)和幾何特性(線型、圖層、顏色、字體等)。目前,常用的數(shù)字線劃圖制圖、成圖軟件——CASS軟件已具備較完善的功能[1],但不能對(duì)圖形文件進(jìn)行批量化處理。因此,對(duì)其二次開(kāi)發(fā)十分必要。ObjectABX技術(shù)逐漸成為AutoCAD二次開(kāi)發(fā)的主流。
ObjectABX應(yīng)用程序能直接利用AutoCAD核心數(shù)據(jù)庫(kù)和代碼,利用AutoCAD的開(kāi)放結(jié)構(gòu),可以直接訪問(wèn)AutoCAD數(shù)據(jù)庫(kù)結(jié)構(gòu)、圖形系統(tǒng)以及CAD幾何造型核心,具有模塊性好、獨(dú)立性強(qiáng)、連接簡(jiǎn)單、使用方便、內(nèi)部功能高效實(shí)用、代碼可重用性強(qiáng)等優(yōu)點(diǎn)[2]。本文使用ObjectARX以及C#.NET開(kāi)發(fā)的程序可以對(duì)多個(gè)線劃圖文件的進(jìn)行批量處理,并在文中給出了核心代碼。
1.1ObjectARX簡(jiǎn)介
AutoCAD提供了豐富的開(kāi)發(fā)工具,如ADS(AutoCAD Development System)、ObjectARX/ObjectDBX,VBA/AutoCAD ActiveX Automation(COM)、AutoLISP/Visual LISP、.NET[3]。ObjectARX是Au-toCAD提供的第一個(gè)面向?qū)ο蟮拈_(kāi)發(fā)工具。它提供了以C++為基礎(chǔ)的面向?qū)ο蟮拈_(kāi)發(fā)環(huán)境及應(yīng)用程序接口,在AutoCAD 2006及以后的版本中,增加了.NET API開(kāi)發(fā)包。方便使用.NET工具進(jìn)行開(kāi)發(fā)。
用戶利用ObjectARX可以訪問(wèn)和修改AutoCAD圖形數(shù)據(jù)庫(kù)[4],與AutoCAD編輯器進(jìn)行通信,對(duì)CAD功能進(jìn)行定制[5-6]。
1.2ObjectARX應(yīng)用程序開(kāi)發(fā)環(huán)境
開(kāi)發(fā)ObjectARX應(yīng)用程序需要ObjectARX提供的SDK(Software Development Kit,軟件開(kāi)發(fā)工具包)。SDK工具包主要提供了開(kāi)發(fā)ARX應(yīng)用程序所需的庫(kù)文件、頭文件、程序設(shè)計(jì)示例和幫助使用說(shuō)明。在AutoCAD不同版本運(yùn)行的ARX應(yīng)用程序需要不同的ObjectARX開(kāi)發(fā)環(huán)境支持和各自的編譯鏈接工具。本文采用AutoCAD 2008和Microsoft Visual Studio 2005作為開(kāi)發(fā)平臺(tái)進(jìn)行研制。
2.1圖形批量處理流程
線劃圖文件批量處理包括修改實(shí)體數(shù)據(jù)以及新增實(shí)體數(shù)據(jù),其處理流程分別如下圖1、圖2所示。
2.1.1 打開(kāi)圖形 在獲取Database對(duì)象之前,首先得打開(kāi)CAD圖形。打開(kāi)CAD圖形有2種方式:一種是前臺(tái)打開(kāi),一種是后臺(tái)打開(kāi)。軟件研發(fā)一般采用的是后臺(tái)打開(kāi)圖形,使用后臺(tái)打開(kāi)可以提高文件的處理效率,同時(shí)可以避免用戶的誤操作。
圖1 批量修改實(shí)體
圖2 批量增加實(shí)體
1)前臺(tái)打開(kāi)圖形。
DocumentCollection acDocMgr=Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
doc=acDocMgr.Open(strFileName,false);//其中strFileName表示要處理的文件名。
Database db=doc.Database;
2)后臺(tái)打開(kāi)圖形。
Database db=new Database(false,true))
db.ReadDwgFile(strFileName,FileShare.ReadW-
rite,true,null)。
2.1.2 獲取比例尺數(shù)據(jù) 對(duì)于已打開(kāi)的圖形,需要檢查其比例尺是否是對(duì)應(yīng)的比例尺。不同比例尺的圖形、線型寬度、字體大小等參數(shù)不一致。本文只對(duì)指定比例尺(如比例尺為1:500)的圖形進(jìn)行批量處理,其他比例尺的圖形不作處理。獲取比例尺的代碼如下
double currentScale=Convert.ToDouble(Cad-
App.GetSystemVariable("Userr1"))。
2.1.3 創(chuàng)建事務(wù)
Transaction trans=db.TransactionManager.StartTransaction()。
2.1.4 選擇對(duì)象
1)選擇圖形實(shí)體。
BlockTableRecord p_BlockTableRecord=(Bloc-kTableRecord)trans.GetObject(db.CurrentSpaceId,OpenMode.ForWrite);
foreach (ObjectId objId in p_BlockTableRecord)
{Entity ent=(Entity)trans.GetObject(objId,OpenMode.ForWrite)}。
2)選擇圖層。
LayerTable layerTbl=(LayerTable)trans.GetObject(db.LayerTableId,OpenMode.ForWrite);
foreach (ObjectId layerId in layerTbl)
{LayerTableRecord p_LayerTableRecord=(LayerTableRecord)trans.GetObject(layerId,OpenMode.ForWrite)}。
2.1.5 判斷對(duì)象 AutoCAD中的實(shí)體(Entity)對(duì)象比較豐富,常用的有文本對(duì)象、線對(duì)象等。文本對(duì)象包括單行文本(DBText)、多行文本(MText)。線對(duì)象包括直線(Line)、多段線(Polylines)、二維多線段(polyline2d)、圓(Circle)、圓弧(Arc)、橢圓(Ellipse)等。另外還有擦除對(duì)象(Wipeout)、填充(Hatch)等。
在遍歷文本/線對(duì)象時(shí),可以先排除Wipeout、Hatch對(duì)象,減少遍歷的次數(shù)。
2.1.6 實(shí)體參數(shù)設(shè)置及修改 實(shí)體參數(shù)常用的設(shè)置包括:顏色(Color)、顏色索引(ColorIndex)、層(LayerId)、線型(LinetypeId)、線型比例(LinetypeScale)、線寬(ConstantWidth)、字體(TextStyle)、多行文本的字高(TextHeight)、單行文本的字高(Height)、單行文本的傾斜度(Oblique)等。
2.1.7 添加實(shí)體 以添加文本對(duì)象為例,添加其他實(shí)體可以參考以下代碼。
BlockTableRecord p_BlockTableRecord=(Blo-
ckTableRecord)trans.GetObject(db.CurrentSpacel-
d,OpenMode.ForWrite);
BlkTblRec.AppendEntity(text);
trans.AddNewlyCreatedDBObject(text, true)。
2.1.8 結(jié)束操作 在文件處理結(jié)束后需要保存文件的修改,然后關(guān)閉打開(kāi)的圖形,同時(shí)刪除后綴為bak的同名文件。
2.2CASS編碼處理
在對(duì)數(shù)字線劃圖處理過(guò)程中,每個(gè)實(shí)體要素屬性中都包含有CASS碼,在增加新實(shí)體時(shí),需要賦予實(shí)體對(duì)應(yīng)的CASS碼。當(dāng)選擇實(shí)體,有時(shí)需要對(duì)CASS碼進(jìn)行判斷。CASS碼在Autocad以ResultBuffer類對(duì)象進(jìn)行存儲(chǔ)。ResultBuffer數(shù)據(jù)由一個(gè)數(shù)據(jù)類型描述和一個(gè)值組成。CASS碼的類型描述為“SOUTH”。
1)獲取CASS碼。
ResultBuffer resBuf=ent.GetXDataForApplication("SOUTH");
TypedValue entXData=resBuf.AsArray()[1];
cassText=entXData.Value.ToString();//即為CASS編碼。
2)新增/修改CASS碼。
以新增CASS碼為140009的居民地說(shuō)明注記為例,代碼如下:
ResultBuffer resBuf=new ResultBuffer();
resBuf.Add(new TypedValue(1001,"SOUTH"));
resBuf.Add(new TypedValue(1000,"140009"));
text.XData=resBuf。
2.3成果展示
2.3.1 批量處理工具 本文采用ObjectARX和C#.NET對(duì)AutoCAD2008進(jìn)行研發(fā),其菜單功能如圖3所示,多個(gè)文件進(jìn)行批量處理的工具包含批量清理圖形(purge命令)、批量修改圖層顏色、批量修改實(shí)體分層、批量修改線型樣式、批量修改文字樣式、批量刪除空文字、批量修改文字內(nèi)容、批量修改文字Z坐標(biāo)、批量修改文字旋轉(zhuǎn)/傾斜角度、批量修改一般高程點(diǎn)的小數(shù)位數(shù)、批量修改控制點(diǎn)的高程小數(shù)位數(shù)。
圖3 菜單界面
圖4 線劃圖一鍵更新界面
其中批量清理圖形(purge命令)是調(diào)用purge函數(shù)清除BlockTable、LayerTable、TextStyleTable、LinetypeTable、ViewTable、UcsTable、ViewportTable、RegAppTable、DimStyleTable中的冗余數(shù)據(jù)。批量修改圖層顏色是將圖形中的圖層設(shè)置為指定的顏色,如將居民地(JMD)層顏色設(shè)置為(35,24,21),方法為調(diào)用setLayerColor函數(shù)設(shè)置LayerTable中的對(duì)象。批量修改實(shí)體分層是將指定CASS碼的實(shí)體放在指定的圖層,如將一般房屋(CASS碼為141101的實(shí)體)放在居民地(JMD)層,方法為修改選中實(shí)體的LayerId屬性。批量修改線型樣式是將圖形中的線型實(shí)體設(shè)置為指定的線型。批量修改文字樣式是將圖形中文字實(shí)體設(shè)置為指定的字體。批量刪除空文字是將內(nèi)容為空的文字進(jìn)行刪除,文字內(nèi)容可用TextString函數(shù)進(jìn)行獲取。批量修改文字內(nèi)容是將文字內(nèi)容進(jìn)行批量替換,如將“草”替換成“草坪”。批量修改文字Z坐標(biāo)是將文字的Z坐標(biāo)修改為統(tǒng)一的值,一般設(shè)為0。批量修改文字旋轉(zhuǎn)/傾斜角度是修改文字的Rotation以及Oblique屬性。批量修改一般高程點(diǎn)的小數(shù)位數(shù)是將圖形中的一般高程點(diǎn)注記的小數(shù)位數(shù)設(shè)為統(tǒng)一的值,如設(shè)為2位小數(shù)則會(huì)將2位以上以及不足2位的注記值修改為保留2位小數(shù)。批量修改控制點(diǎn)的小數(shù)位數(shù)是將圖形中的控制點(diǎn)注記的小數(shù)位數(shù)設(shè)為一個(gè)固定的值,如將三角點(diǎn)高程注記(CASS碼為131100-1)統(tǒng)一保留3位小數(shù)。
在實(shí)際處理過(guò)程中,可以根據(jù)用戶需求一次處理多個(gè)事務(wù),如圖4中定制“線劃圖一鍵更新”操作。該操作包括以下5個(gè)事務(wù):批量修改圖層顏色、批量修改實(shí)體顏色、批量修改實(shí)體分層、批量修改線型樣式以及批量修改文字樣式。
2.3.2 處理結(jié)果對(duì)比 圖5、圖6是采用“線劃圖一鍵更新”操作,對(duì)線劃圖的圖層顏色、實(shí)體顏色、實(shí)體圖層分類、線型、文本樣式進(jìn)行處理的前后對(duì)比圖,通過(guò)對(duì)比發(fā)現(xiàn)該程序可以批量修改線劃圖文件,效果令人滿意。
圖5 原始圖形
圖6 處理后的圖形
ObjectARX是AutoCAD采用面向?qū)ο笳Z(yǔ)言進(jìn)行二次開(kāi)發(fā)的有效工具,包含了很多工具集,允許開(kāi)發(fā)者利用AutoCAD的開(kāi)放體系結(jié)構(gòu),直接訪問(wèn)AutoCAD圖形數(shù)據(jù)庫(kù)和圖形系統(tǒng)。可以利用C#.NET的強(qiáng)大功能進(jìn)行研發(fā)出符合用戶需求的功能。如本文提到的線劃圖文件批量處理功能,可以對(duì)多個(gè)線劃圖文件執(zhí)行相同的操作,提高工作效率,降低數(shù)據(jù)生產(chǎn)、制作的成本。
[1]張巨林,陳兆煙,謝剛生.基于ObjectARX的用戶地圖符號(hào)庫(kù)系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)[J].測(cè)繪通報(bào),2013(11):109-111.
[2]江書勇.基于ObjectARX的圖形自動(dòng)編程系統(tǒng)的研究與開(kāi)發(fā)[D].成都:四川大學(xué),2003.
[3]劉同成,林愉.基于ObjectARX的AutoCAD二次開(kāi)發(fā)及應(yīng)用實(shí)例[J].自動(dòng)化技術(shù)與應(yīng)用,2006,25(5):35-37.
[4]肖萌萌,黃美發(fā),孫永厚,等.基于ObjectARX2010的尺寸鏈公差自動(dòng)生成及自動(dòng)查詢方法[J].桂林電子科技大學(xué)學(xué)報(bào),2013,33(5):398-401.
[5]于蕭榕,郭昌言,陳剛.結(jié)合Objectarx和C#進(jìn)行AutoCAD二次開(kāi)發(fā)框架的研究[J].科學(xué)技術(shù)與工程,2010(20):5085-5091.
[6]黃健榮,郭昌言,于蕭榕.基于ObjectARX的離心標(biāo)牌刻度線繪制的應(yīng)用[J].計(jì)算機(jī)與數(shù)字工程,2013(8):1343-1346.
StudyonBatchProcessingforDigitalLineGraphFilesBasedonObjectARX
SHI Suyi,XIONG Junhua
(Kunming University of Science and Technology,650093,Kunming,PRC)
Digital line graph (DLG) is one of the digital products of fundamental geographical information in China,in general,surveying and mapping achievement is digital line graph.The more widely used format of DLG is DWG format in AutoCAD.This paper described batch processing for line topographic map files on the DWG format.Batch processing for graphics files refers to same operation on a plurality of graphics files on the user′s behalf,which can be done automatically by computer.The common development tool of AutoCAD is ObjectARX.The secondary development of AutoCAD based on ObjectARX and C#.NET has been investigated in this paper.The technology of batch processing for line topographic map files has been realized.It has practical significance and extensive application prospects.
digital line graph;ObjectArx;batch processing;AutoCAD
2014-05-29;
2014-07-11
施蘇毅(1981-),男,云南昆明人,工程碩士,主要研究方向:地理信息系統(tǒng)。
10.13990/j.issn1001-3679.2014.04.013
P209
A
1001-3679(2014)04-0482-05