黃子雄 黃樹賢
(廣州杰賽科技股份有限公司 廣東 廣州 510310)
傳輸線路勘察設計工作輸出的圖紙成果中,比較核心的一份是線路施工圖。線路施工圖是設計方交給施工方進行通信線路工程建設主要的圖紙。通信線路圖的制作一般采用CAD軟件,以CAD矢量格式繪制,完成后需要打印輸出到紙張裝訂。通信線路的施工圖整幅尺寸通常很大,如用高于比例尺1∶10 000進行縮小打印輸出,就不能清晰看到設計細節(jié),這就使得施工圖紙在打印輸出時需要先對圖紙進行切圖分幅,再按順序打印。實踐中打印輸出一般使用1∶3 000到1∶8 000比例尺,輸出到A3、A4、A5等尺寸的紙張上。設計人員除了完成線路施工圖的設計繪制外,需要花費大量的時間,對繪制好的整幅施工圖紙進行切圖分幅。為求達到每幅圖紙符合格式、大小、美觀等交付要求,設計人員需要在CAD矢量圖上反復進行圖紙元素框選、復制、粘貼到打印圖框、調整圖框等操作。同時還需調整每個打印圖框的順序及打印圖框的順序信息,使打印按正確的順序打印輸出,步驟繁瑣,非常耗費時間精力,效率低下。
鑒于此,本文提出了一種基于CAD軟件的擴展功能,對CAD矢量格式施工圖自動分幅切圖的方法,從而免除繁瑣的手工操作,可以快速、準確地對通信線路施工圖紙進行自動切圖分幅。同時,本文還探討研究了該方法在AutoCAD軟件上的具體實現(xiàn)。
要實現(xiàn)自動分幅,實際上是通過編寫程序擴展原CAD軟件功能,使CAD繪圖軟件能根據(jù)預先設定的規(guī)則、算法對大幅矢量圖進行切圖分幅,再套到預置有打印格式的打印圖框上,最后對每幅切圖的順序信息按打印序列進行設置。目前CAD軟件普遍都具備二次開發(fā)的支持能力,尤其以管線施工圖最常用的設計軟件AutoCAD為例,它支持Lisp、C、C++、VBA、C#等多種開發(fā)語言,并提供豐富的擴展手段。自R17版本后,AutoCAD提供了對Mircosoft.NET架構非常全面的支持。使用Mircosoft.NET框架的任何一種語言,均可以對AutoCAD的各項功能進行全面的控制,采用面向對象的API可以訪問、控制、管理CAD矢量圖的各種元素對象,是非常理想的AutoCAD二次開發(fā)方式。
通信線路施工圖的內容繪制時,主要由路由節(jié)點、連線、附著物及周邊環(huán)境等的矢量圖元元素組成。其中路由節(jié)點(如機房、電桿、手井、光交箱等),在實際施工圖中會通過CAD圖元的屬性被標上從小到大的位置編號,這樣就可以確定線路起始點、終點(包括分叉)的方向,從而確定施工圖的路由走向。
進行二次開發(fā)擴展自動化功能時,程序代碼可以訪問到每個圖元及它的位置屬性,獲得位置編號,這樣就可以實現(xiàn)分幅切圖后打印次序的確定及順序信息的生成。
1) 通過整幅施工圖上下左右頂點獲得一個包含所有CAD矢量元素的平面矩形,定義名稱為源施工圖CAD矢量圖矩形(下稱源圖矩形)。
2) 通過要輸出打印的紙張大小,確定打印圖框大小,并可確定此打印圖框上用于展示矢量圖的有效展示區(qū)域,程序以此展示區(qū)域的大小生成一系列小矩形,定義名稱為截圖框,并給予編號以進行排序識別。
3) 不斷復制截圖框并從左上頂點開始,從左到右、從上到下,平鋪到源圖矩形上,直到覆蓋整個源圖矩形,使得源圖矩形的CAD矢量元素分別落到了每個截圖框上。
4) 通過程序判斷,剔除掉不含任何矢量元素的截圖框,剩余的截圖框(含有矢量元素)即為初步獲得的分幅切圖。
5) 程序通過施工圖代表路由順序節(jié)點的編號大小,賦予剩余截圖框的排序編號,以此確定出截圖框的順序。
6) 允許人機交互,由設計人員判斷截圖框內含矢量圖元素的豐滿程度,對截圖框高度或寬度進行調整(調小)。
7) 程序根據(jù)調整結果,可以自動對2個以上的、連續(xù)的截圖框合并為1個標準大小的截圖框,進一步獲得最終的分幅切圖。
8) 程序根據(jù)第7步確定的標準截圖框的數(shù)量,生成相應數(shù)量的打印圖框,打印圖框由指北針、信息表及展示區(qū)域組成,其中展示區(qū)域對應截圖框的分幅切圖的矢量圖形。
9) 程序依次將每個截圖框內容對應地復制到打印圖框的展示區(qū)域,并設置打印圖框信息表的內容。這樣就完成了整個施工圖自動分幅的過程,獲得了有順序的、信息完整的、可直接輸出的打印圖框——也就是分幅出圖需要的最終結果。
圖1展示了自動分幅步驟。
圖1 分幅切圖步驟
獲取整幅CAD矢量施工圖矩形平面(即源圖矩形)的算法比較簡單,只需找到四個頂點就可以確定一個矩形。
遍歷源CAD矢量圖,以獲取整個CAD矢量圖中所有的矢量元素的坐標點(X,Y),對所有坐標點的X坐標及Y坐標進行比較,分別獲得X坐標及Y坐標的最小、最大值,確定了源圖矩形的四個頂點的坐標,獲得源圖矩形的寬度: 最小的X坐標和Y坐標minX、minY。即矢量圖左上坐標A(minX,maxY),右上坐標B(maxX,maxY),右下坐標C(maxX,minY),左下坐標D(minX,minY)。源圖矩形寬度sWidth為 maxX-minX,源圖矩形高度sHeight為 maxY-minY。
多個截圖框平鋪后的長度和寬度需要完全覆蓋源圖矩形,這樣才能完全分割源圖矩形的所有矢量元素。
因此算法說明如下:如果(源圖矩形寬度mod截圖框寬度)>0,則:列數(shù)=源圖矩形寬度/截圖框寬度+1,否則:列數(shù)=矢量圖寬度/截圖區(qū)域寬度;同理,如果(源圖高度mod截圖框高度)> 0,則:行數(shù)=矢量圖高度/截圖區(qū)域高度+ 1,否則:行數(shù)=矢量圖高度/截圖區(qū)域高度。
截圖框排序是為了最終輸出分幅打印圖框上的編號,并由此確定打印時的順序符合整幅施工圖的路由走向,是非常重要的操作。其詳細方法為:首先,依次遍歷每個截圖框內所有的路由節(jié)點元素并獲得位置編號,選取位置編號最小的值代表該截圖框的順序號。然后,對所有截圖框按其順序號進行排序,順序號越小,截圖框排序越靠前。最后,將沒有獲得順序號的截圖框排在最后。
截圖框合并是使連續(xù)多個(兩個或以上)經過調整(調小)的截圖框合并為一個標準大小的截圖框,其目的是將多個矢量內容較少的分幅合并為一個分幅,減少分幅的輸出打印,同時增加圖紙的可閱讀性和美觀度。根據(jù)圖紙輸出經驗,一般橫向內容會多于縱向走向的內容。因此,合并算法采用垂直合并優(yōu)先的方式。兩種合并方式的具體內容如下:
垂直合并:當連續(xù)兩個或以上截圖框的高度相加小于或等于標準截圖框高度乘以切圖縮放系數(shù),則將連續(xù)的截圖框內容從上到下復制到一個標準截圖框中。此標準截圖框的順序號取合并連續(xù)的截圖框中的最小編號,同時,將合并連續(xù)截圖框的順序號全置為-1,后續(xù)操作將不再使用。優(yōu)先采用垂直合并后,對相同的截圖框不再需要橫向合并。
橫向合并:當連續(xù)兩個或以上截圖框的寬度相加小于或等于標準截圖框高度乘以切圖縮放系數(shù),則將連續(xù)截圖框內容從左到右復制到一個標準截圖框中,此標準截圖框的順序號取合并連續(xù)的截圖框中的最小編號,同時,將合并連續(xù)截圖框的順序號全置為-1。
上面算法用到的縮放系數(shù),是用于控制合并后內容的比例尺大小的一個范圍參數(shù)。例如,標準比例尺為1∶3 600,即1張A4紙橫向呈現(xiàn)約1 km,如使用0.8的縮放系數(shù),則比例尺變?yōu)?∶4 500,1張A4紙橫向呈現(xiàn)約1.25 km。
AutoCAD從2010的版本起,提供了豐富的MicroSoft.NetAPI,主要封裝在acdbmgb.dll、acmgd.dll及AcCoreMgd.dll(2014版)中。.Net中編寫AutoCAD插件(AddIn)程序,是采用DLL項目的方式,只需在項目中引用這些相關dll,就可以通過.NetAPI訪問AutoCad提供的封裝的外包類。實際C#代碼中,還需要添加命名空間使用的語句,例如:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
//用于當前畫圖矢量圖形的存儲
using Autodesk.AutoCAD.Runtime;
//用于對接二次開發(fā)接口,進行插件初始化
using Autodesk.AutoCAD.Geometry;
//構建矢量圖形的基礎類,如圓、矩形、多邊形等
對于CAD矢量圖紙的程序,一般過程都是獲取CAD數(shù)據(jù)庫,依次打開塊表、塊表記錄,對實體進行增刪改查的操作,在操作完后關閉相關的塊表、塊表記錄。
作為AutoCAD的插件,必須實現(xiàn)Autodesk.AutoCAD.Runtime的 IExtensionApplication接口及其包含的Initialize與Terminate兩個函數(shù)。其實質是便于AutoCAD軟件進行插件的發(fā)現(xiàn)、加載和清除。
另外,要達到菜單交互的效果,還需要引用AcCui.dll來實現(xiàn)自定義的插件菜單,以下為在AutoCad菜單欄加入一個面板的代碼:
Using Autodesk.AutoCAD.Windows.PaletteSet
PaletteSet myPaletteSet=new PaletteSet(″我的面板″);
基于上文的原理和算法,結合AutoCAD.NetAPI的二次開發(fā)能力,使用Visual Studio 2013 C#語言作為開發(fā)工具,在AutoCAD 2014實現(xiàn)了施工圖上自動分幅切圖的插件。其主要功能是通過點選該插件上的菜單,可以打開已設計好的整幅施工圖,并通過插件菜單完成自動生成截圖框切割圖紙、截圖框排序、調整(交互)、合并及打印圖框的生成。除截圖框需要人工做簡單調整外,整個分幅切圖的過程基本能自動、快捷地完成。插件及截圖如圖2、圖3所示。
圖2 自動分幅切圖插件實現(xiàn)
圖3 自動分幅效果
為檢驗自動分幅切圖工具的效果,從某規(guī)劃設計院選取了幾個有詳細進行步驟工時記錄的管線規(guī)劃設計項目。這些項目發(fā)生在2015年6月到2017年6月,共計有約72個路由段施工圖設計任務,總長度約2 500 km,都記錄了分幅出圖步驟所使用的工時。
在72個設計任務中,隨機抽取了20個作為測試樣本。對這20個樣本采用自動分幅切圖工具對CAD矢量施工圖進行分幅切圖,并記錄耗時。表1為對20個樣本采用傳統(tǒng)方式和采用自動分幅切圖工具分幅耗時的對比。
表1 傳統(tǒng)手工分幅與工具自動分幅耗時對比
從表1可以清晰看到,采用自動分幅切圖的平均耗時約為傳統(tǒng)手工分幅切圖耗時的1/5,大幅節(jié)省了施工圖分幅出圖的時間。
本文針對通信管線規(guī)劃設計生產過程中,施工圖紙分幅切圖手工操作效率低的問題,提出了一種可以對CAD矢量格式的大版幅通信線路施工圖進行自動分幅并輸出到標準圖框進行打印的方法,并基于AutoCAD進行了實現(xiàn)研究。經過實際的檢驗測試表明,該方法可以大幅改進傳統(tǒng)手工效率低的問題,提升施工圖紙的制作效率。研究的下一步工作,可以考慮將此方法的應用推廣到通信管線的相近領域,如水利、電力等的施工圖使用。