侯曉燕 魯先龍 崔 強(qiáng)
(中國電力科學(xué)研究院,北京 102401)
在工程設(shè)計(jì)中,有很多相似的圖,幾十個(gè)甚至上百個(gè),需要合并到一張圖紙上,便于校對和出版。可是AutoCAD沒有提供批量自動(dòng)合并多個(gè)dwg文件的功能,只能打開要合并的dwg文件,挨個(gè)單獨(dú)復(fù)制粘貼?;谏鲜鲂枨螅_發(fā)了一個(gè)界面友好、實(shí)用可靠、效率高的合并多個(gè)dwg文件的軟件,使設(shè)計(jì)后期圖紙校對和出版工作趨于簡單方便、高效和智能化。
合并多個(gè)dwg文件生成圖紙一覽圖的軟件界面如圖1所示。用戶可以通過瀏覽文件對話框,批量選擇電腦上的任意dwg文件,添加到圖紙文件列表中??梢酝ㄟ^操作按鈕:上移、下移、刪除和清空來調(diào)整圖紙文件順序??梢栽O(shè)定生成圖紙一覽表的參數(shù):每行文件個(gè)數(shù)、行間距及列間距,并可設(shè)置統(tǒng)一縮放比例或統(tǒng)一圖紙文件高度。如果要合并的圖紙文件高度相差不多,建議選擇按統(tǒng)一比例縮放;如果文件高度相差較大,建議選擇設(shè)置統(tǒng)一文件高度,這樣合并出的圖紙文件比較美觀。
圖1 合并多個(gè)dwg文件的軟件界面
如把6個(gè)dwg文件合并生成到一張圖紙上,圖紙文件高度和寬度不完全一致,設(shè)置了圖紙統(tǒng)一高度為400 mm,行間距為25 mm,列間距為25 mm。軟件根據(jù)設(shè)置的高度與圖紙本身的高度,讀取計(jì)算出每個(gè)圖紙的縮放比例,然后將圖紙按照各自不同的比例縮放。每個(gè)圖紙下面標(biāo)注了該文件的路徑,便于用戶區(qū)分。本軟件性能好,可靠性高。經(jīng)測試,CPU:2.4 GHZ,1 GB內(nèi)存,AutoCAD 2004,合并100個(gè)dwg文件只需2 min。
AutoCAD開放的體系結(jié)構(gòu)使其二次開發(fā)功能應(yīng)用廣泛,目前常用的 AutoCAD的二次開發(fā)工具有:Visual Lisp,VBA,Object-ARX。ObjectARX是一個(gè)以C++語言為基礎(chǔ)的面向?qū)ο蟮拈_發(fā)環(huán)境和應(yīng)用程序接口。它本質(zhì)上是Windows動(dòng)態(tài)鏈接庫(DLL)程序,與AutoCAD共享地址空間,可以直接訪問AutoCAD數(shù)據(jù)庫核心數(shù)據(jù)結(jié)構(gòu)和代碼。ObjectARX與其他的AutoCAD二次開發(fā)工具相比,速度更快,穩(wěn)定性更好,運(yùn)行效率最高,代碼可重用性強(qiáng),而且支持MFC,能簡捷高效地實(shí)現(xiàn)許多復(fù)雜功能。
進(jìn)行ObjectARX開發(fā)需具備兩個(gè)工具:1)與AutoCAD版本對應(yīng)的ObjectARX開發(fā)包;2)與ObjectARX開發(fā)包版本對應(yīng)的Visual C++版本作為開發(fā)工具。本軟件為了達(dá)到最大兼容性,編程環(huán)境為:ObjectARX 2002,VC6.0,支持 AutoCAD 2002。為了兼容更高版本的AutoCAD,需要將代碼在其他環(huán)境下編譯,編譯環(huán)境見表1。這樣可以實(shí)現(xiàn)軟件兼容 AutoCAD 2002,AutoCAD 2004,AutoCAD 2005,AutoCAD 2006,AutoCAD 2007,AutoCAD 2008,AutoCAD 2009,AutoCAD 2010共8個(gè)版本。
表1 軟件編譯環(huán)境
用戶需先設(shè)置AutoCAD的版本和路徑后,才能生成施工圖??梢渣c(diǎn)擊圖1界面下方的“設(shè)置AutoCAD版本”按鈕,會彈出設(shè)置AutoCAD版本和路徑的窗體,如圖2所示。
圖2 設(shè)置AutoCAD版本界面
用戶選擇版本和路徑后,點(diǎn)擊圖3中“確定”按鈕,程序內(nèi)部處理流程如圖3所示,圖中的數(shù)字代表處理順序。軟件會重寫acad.rx和生成fpCAD.lnk文件。acad.rx文件記錄了AutoCAD打開時(shí)執(zhí)行的ARX文件,AutoCAD每次打開時(shí)都會讀取acad.rx文件,執(zhí)行繪圖命令。fpCAD.lnk文件是AutoCAD的快捷方式,指定了起始位置和目標(biāo)可執(zhí)行文件,起始位置為當(dāng)前程序的安裝路徑,目標(biāo)可執(zhí)行文件為用戶指定的AutoCAD可執(zhí)行文件。使用快捷方式可從當(dāng)前路徑下打開AutoCAD,AutoCAD打開時(shí)會讀取當(dāng)前路徑下的acad.rx,然后執(zhí)行acad.rx文件中指定的ARX文件。最后ARX文件操作AutoCAD執(zhí)行繪圖命令,生成施工圖。
圖3 設(shè)計(jì)AutoCAD版本流程
用戶點(diǎn)擊“生成圖紙一覽表”按鈕之后,程序的處理流程如圖4所示。首先保存用戶在界面上輸入的信息,并修改acad.rx文件,此文件記錄了AutoCAD打開時(shí)執(zhí)行的ARX程序。接著,打開AutoCAD,讀取 acad.rx,加載ARX程序。ARX程序從入口函數(shù)acrxEntryPoint()進(jìn)入,執(zhí)行創(chuàng)建的繪圖命令。該命令根據(jù)讀取的用戶在界面上輸入的信息,循環(huán)計(jì)算圖紙文件的插入位置及縮放比例,接著將文件打開、制作成塊、將塊插入。最后保存合并生成的施工圖。
圖4 程序處理流程
本軟件的難點(diǎn)是在要合并生成的圖紙上插入dwg文件。本軟件的處理方法是:打開dwg文件、將其作為塊插入、關(guān)閉dwg文件。本小節(jié)給出了部分核心代碼。
3.4.1 打開 dwg文件
打開dwg文件需新建一個(gè)空的數(shù)據(jù)庫對象。因?yàn)锳utoCAD的向下兼容性,AutoCAD低版本打不開高版本的dwg文件,所以需判斷是否能打開。
AcDbDatabase*pDwg=new AcDbDatabase
(Adesk::kFalse);
if(Acad::eOk!=pDwg->readDwgFile(blkName))
{acedAlert(_T("圖紙文件:")+blkName+_T("無法打開!"));
delete pDwg;
return;}
3.4.2 獲取文件圖形范圍
需獲取已打開的圖紙文件的高度和寬度,可通過讀取左下角坐標(biāo)和右上角坐標(biāo)來實(shí)現(xiàn),代碼如下:pDwg->updateExt(TRUE);pointleft=pDwg->extmin();pointright=pDwg->extmax();
3.4.3 制作塊
本程序?qū)wg文件做成塊時(shí),統(tǒng)一將坐標(biāo)(0,0,0)作為基點(diǎn),代碼如下:
AcDbObjectId blockId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()-> insert(blockId,blkName+"name",pDwg,Adesk::kFalse);
3.4.4 設(shè)置插入塊
首先實(shí)例AcDbBlockReference對象,然后設(shè)置插入塊的縮放比例、插入位置和旋轉(zhuǎn)角度。
AcDbBlockReference*pBlkRef=new AcDbBlockReference();
pBlkRef->setBlockTableRecord(blockId);
pBlkRef-> setScaleFactors(AcGeScale3d(s,s,1));
pBlkRef-> setPosition(AcGePoint3d(pt[X]-pointleft.x*s,pt[Y]-pointleft.y*s,0.0))
pBlkRef-> setRotation(0.0);
3.4.5 分解塊
分解塊便于用戶對塊內(nèi)的每個(gè)實(shí)體根據(jù)需要進(jìn)行修改。ObjectARX提供了AcDbVoidPtrArray指針數(shù)組,可以將分解后的塊中的所有實(shí)體添加到此數(shù)組中,然后逐個(gè)訪問這一集合中所有的實(shí)體并添加到塊表記錄中。
AcDbEntity*pEnt=NULL;
AcDbVoidPtrArray entitySet;
es=pBlkRef->explode(entitySet);
AcDbEntity* ent;
for(int i=0;i< entitySet.length();i++)
{ent=(AcDbEntity*)entitySet.at(i);
AppendEntity(ent);}
根據(jù)設(shè)計(jì)工作實(shí)際需求,利用ObjectARX技術(shù)編制了此軟件。實(shí)現(xiàn)了自定義設(shè)置間距、圖紙高度、圖紙的比例等,不但使合并生成的圖紙整齊美觀滿足出版需求,而且可以根據(jù)不同的需求靈活排列。滿足了設(shè)計(jì)過程中審圖時(shí)打印縮略圖紙的需要,使大幅面繪圖儀的效率成倍提高,紙張的利用率也提高了很多。該軟件可廣泛應(yīng)用于電力、機(jī)械、水利、建筑等工程設(shè)計(jì)領(lǐng)域,實(shí)用性較強(qiáng)。可在Windows XP及以上操作系統(tǒng)使用,可移植性高,并兼容AutoCAD 2002~2010共8個(gè)版本。
[1] 于蕭榕.基于ObjectARX的標(biāo)牌曲線文字繪制的研究[J].現(xiàn)代電子技術(shù),2011,34(18):26-28.
[2] 陳海霞,高廣德.基于ObjectARX和Visual C++開發(fā)工具的格柵參數(shù)化設(shè)計(jì)[J].三峽大學(xué)學(xué)報(bào),2006,28(1):61-64.
[3] 羅仕庭,漆泰岳,王偉峰.基于ObjectARX的公路隧道襯砌結(jié)構(gòu)計(jì)算[J].四川建筑,2008,28(2):42-44.
[4] 馬萬杰,夏國棟,姜 昆,等.基于ObjectARX的AutoCAD塑料模標(biāo)準(zhǔn)件系統(tǒng)的研究與實(shí)現(xiàn)[J].模具技術(shù),2009(2):37-39.
[5] 劉喜平.基于ObjectARX的粗糙度自動(dòng)標(biāo)注系統(tǒng)[J].吉林建筑工程學(xué)院學(xué)報(bào),2011,28(4):64-67.