侯曉燕 魯先龍 崔 強
(中國電力科學研究院,北京 102401)
在工程設計中,有很多相似的圖,幾十個甚至上百個,需要合并到一張圖紙上,便于校對和出版??墒茿utoCAD沒有提供批量自動合并多個dwg文件的功能,只能打開要合并的dwg文件,挨個單獨復制粘貼?;谏鲜鲂枨?,開發了一個界面友好、實用可靠、效率高的合并多個dwg文件的軟件,使設計后期圖紙校對和出版工作趨于簡單方便、高效和智能化。
合并多個dwg文件生成圖紙一覽圖的軟件界面如圖1所示。用戶可以通過瀏覽文件對話框,批量選擇電腦上的任意dwg文件,添加到圖紙文件列表中。可以通過操作按鈕:上移、下移、刪除和清空來調整圖紙文件順序??梢栽O定生成圖紙一覽表的參數:每行文件個數、行間距及列間距,并可設置統一縮放比例或統一圖紙文件高度。如果要合并的圖紙文件高度相差不多,建議選擇按統一比例縮放;如果文件高度相差較大,建議選擇設置統一文件高度,這樣合并出的圖紙文件比較美觀。

圖1 合并多個dwg文件的軟件界面
如把6個dwg文件合并生成到一張圖紙上,圖紙文件高度和寬度不完全一致,設置了圖紙統一高度為400 mm,行間距為25 mm,列間距為25 mm。軟件根據設置的高度與圖紙本身的高度,讀取計算出每個圖紙的縮放比例,然后將圖紙按照各自不同的比例縮放。每個圖紙下面標注了該文件的路徑,便于用戶區分。本軟件性能好,可靠性高。經測試,CPU:2.4 GHZ,1 GB內存,AutoCAD 2004,合并100個dwg文件只需2 min。
AutoCAD開放的體系結構使其二次開發功能應用廣泛,目前常用的 AutoCAD的二次開發工具有:Visual Lisp,VBA,Object-ARX。ObjectARX是一個以C++語言為基礎的面向對象的開發環境和應用程序接口。它本質上是Windows動態鏈接庫(DLL)程序,與AutoCAD共享地址空間,可以直接訪問AutoCAD數據庫核心數據結構和代碼。ObjectARX與其他的AutoCAD二次開發工具相比,速度更快,穩定性更好,運行效率最高,代碼可重用性強,而且支持MFC,能簡捷高效地實現許多復雜功能。
進行ObjectARX開發需具備兩個工具:1)與AutoCAD版本對應的ObjectARX開發包;2)與ObjectARX開發包版本對應的Visual C++版本作為開發工具。本軟件為了達到最大兼容性,編程環境為:ObjectARX 2002,VC6.0,支持 AutoCAD 2002。為了兼容更高版本的AutoCAD,需要將代碼在其他環境下編譯,編譯環境見表1。這樣可以實現軟件兼容 AutoCAD 2002,AutoCAD 2004,AutoCAD 2005,AutoCAD 2006,AutoCAD 2007,AutoCAD 2008,AutoCAD 2009,AutoCAD 2010共8個版本。

表1 軟件編譯環境
用戶需先設置AutoCAD的版本和路徑后,才能生成施工圖??梢渣c擊圖1界面下方的“設置AutoCAD版本”按鈕,會彈出設置AutoCAD版本和路徑的窗體,如圖2所示。

圖2 設置AutoCAD版本界面
用戶選擇版本和路徑后,點擊圖3中“確定”按鈕,程序內部處理流程如圖3所示,圖中的數字代表處理順序。軟件會重寫acad.rx和生成fpCAD.lnk文件。acad.rx文件記錄了AutoCAD打開時執行的ARX文件,AutoCAD每次打開時都會讀取acad.rx文件,執行繪圖命令。fpCAD.lnk文件是AutoCAD的快捷方式,指定了起始位置和目標可執行文件,起始位置為當前程序的安裝路徑,目標可執行文件為用戶指定的AutoCAD可執行文件。使用快捷方式可從當前路徑下打開AutoCAD,AutoCAD打開時會讀取當前路徑下的acad.rx,然后執行acad.rx文件中指定的ARX文件。最后ARX文件操作AutoCAD執行繪圖命令,生成施工圖。

圖3 設計AutoCAD版本流程
用戶點擊“生成圖紙一覽表”按鈕之后,程序的處理流程如圖4所示。首先保存用戶在界面上輸入的信息,并修改acad.rx文件,此文件記錄了AutoCAD打開時執行的ARX程序。接著,打開AutoCAD,讀取 acad.rx,加載ARX程序。ARX程序從入口函數acrxEntryPoint()進入,執行創建的繪圖命令。該命令根據讀取的用戶在界面上輸入的信息,循環計算圖紙文件的插入位置及縮放比例,接著將文件打開、制作成塊、將塊插入。最后保存合并生成的施工圖。

圖4 程序處理流程
本軟件的難點是在要合并生成的圖紙上插入dwg文件。本軟件的處理方法是:打開dwg文件、將其作為塊插入、關閉dwg文件。本小節給出了部分核心代碼。
3.4.1 打開 dwg文件
打開dwg文件需新建一個空的數據庫對象。因為AutoCAD的向下兼容性,AutoCAD低版本打不開高版本的dwg文件,所以需判斷是否能打開。
AcDbDatabase*pDwg=new AcDbDatabase
(Adesk::kFalse);
if(Acad::eOk!=pDwg->readDwgFile(blkName))
{acedAlert(_T("圖紙文件:")+blkName+_T("無法打開!"));
delete pDwg;
return;}
3.4.2 獲取文件圖形范圍
需獲取已打開的圖紙文件的高度和寬度,可通過讀取左下角坐標和右上角坐標來實現,代碼如下:pDwg->updateExt(TRUE);pointleft=pDwg->extmin();pointright=pDwg->extmax();
3.4.3 制作塊
本程序將dwg文件做成塊時,統一將坐標(0,0,0)作為基點,代碼如下:
AcDbObjectId blockId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()-> insert(blockId,blkName+"name",pDwg,Adesk::kFalse);
3.4.4 設置插入塊
首先實例AcDbBlockReference對象,然后設置插入塊的縮放比例、插入位置和旋轉角度。
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 分解塊
分解塊便于用戶對塊內的每個實體根據需要進行修改。ObjectARX提供了AcDbVoidPtrArray指針數組,可以將分解后的塊中的所有實體添加到此數組中,然后逐個訪問這一集合中所有的實體并添加到塊表記錄中。
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);}
根據設計工作實際需求,利用ObjectARX技術編制了此軟件。實現了自定義設置間距、圖紙高度、圖紙的比例等,不但使合并生成的圖紙整齊美觀滿足出版需求,而且可以根據不同的需求靈活排列。滿足了設計過程中審圖時打印縮略圖紙的需要,使大幅面繪圖儀的效率成倍提高,紙張的利用率也提高了很多。該軟件可廣泛應用于電力、機械、水利、建筑等工程設計領域,實用性較強。可在Windows XP及以上操作系統使用,可移植性高,并兼容AutoCAD 2002~2010共8個版本。
[1] 于蕭榕.基于ObjectARX的標牌曲線文字繪制的研究[J].現代電子技術,2011,34(18):26-28.
[2] 陳海霞,高廣德.基于ObjectARX和Visual C++開發工具的格柵參數化設計[J].三峽大學學報,2006,28(1):61-64.
[3] 羅仕庭,漆泰岳,王偉峰.基于ObjectARX的公路隧道襯砌結構計算[J].四川建筑,2008,28(2):42-44.
[4] 馬萬杰,夏國棟,姜 昆,等.基于ObjectARX的AutoCAD塑料模標準件系統的研究與實現[J].模具技術,2009(2):37-39.
[5] 劉喜平.基于ObjectARX的粗糙度自動標注系統[J].吉林建筑工程學院學報,2011,28(4):64-67.