(江西省港航設計院,江西南昌330038)
MATLAB作為比較流行的三大商業數學軟件之一,開始階段主要用于矩陣運算目的,逐步用于算法開發、數據可視化、數據分析以及數值計算等高級技術計算語言和交互式環境,如今高級版本還支持多種語言程序軟件如:C、C++、JAVA等,不僅如此MATLAB還可以進行大量的數據處理畫圖表,簡單、方便、美觀;而AutoCAD主要是用于二維繪圖、工程施工繪圖以及基本三維制圖設計,尤其是在工程制圖方面應用非常廣泛。
AutoCAD作為可靠的制圖軟件,人們都嘗試去與其他交集軟件相對接,以達到擴展某一軟件的特定功能,并取得一定的成效。劉天立[1]、曹蘭芳[2]、王潤云[3]等就通過C語言實現了與AutoCAD的對接;馬云飛[4]等人編程實現了AutoCAD到MapInfo的數據轉換;以及將已有的AutoCAD格式的數據轉換成GIS數據庫等案例數不勝數[5-6];唯獨在MATLAB與AutoCAD的對接沒有類似的研究。DXF文件是作為AutoCAD數據存儲的重要形式和數據傳遞的接口,其文件結構研究也非常重要[7],李芳珍進行DXF文件格式及其外部接口的研究[8],并通過Visual C++編程讀取DXF格式文件,實現DXF文件的外部對接,并且在AutoCAD與自行開發軟件之間數據創建了通道,實現數據資源輸入、輸出和共享。秦永[9]介紹MATLAB圖形數據轉換為DXF格式的研究方法;胡春霞[10]應用VB和MATLAB實現三維數據可視化;王華強[11]、曹偉國[12]、劉文龍[13]等用MATLAB進行過數據的可視化繪圖研究。但是AutoCAD與MATLAB的數據對接并且輸出可視化結果還沒有提到。目前航道方面王仙美[14]使用VB開發了水運船閘及航道工程土方計算系統軟件,主要是土方計算和數據輸出;侯志強開發了航道工程剖面分析軟件,主要功能是航道斷面尺寸的分析;楊波[15]使用C++就航道疏浚開發了疏浚航跡剖面顯示軟件。
本研究使用MATLAB語言實現拋石地形數據的三維可視化。通過軟件進行數據分析計算施工過程中的拋石方量、面積以及輸出斷面等。可以實時監測航道拋石作業中拋石的質量和精度來提高施工質量、節約時間和經濟成本。
DXF是AutoCAD支持的格式之一,是與其他軟件之間進行CAD數據交互的CAD數據格式文件,因此實現MATLAB與AutoCAD的交互DXF格式文件是研究的重點和突破口。兩者之間互通主要需先了解DXF文件的格式特點,再利用MATLAB語言讀寫和提取相關數據,然后利用MATABL強大的功能進行其他的數據分析,最后將圖形數據按照DXF格式輸出保存。DXF文件是以文檔的形式來描述圖形數據,且以特定的數據格式來存儲數據,故可以使用文本文檔方式查看。DXF文件主要由七大段組成,見圖1a;而圖1b則是部分實體圓、圓弧和線段儲存格式。其中分隔符0為開始行,下一行則是表示實體名稱如:LINE、ARC、CRCLE;AcDbEntity下面兩行“8”代表圖層組碼,第二行為圖層名稱;“10”“20”“30”分別是X、Y、Z軸的組碼,其后一行為對應的X、Y、Z坐標值;圓和圓弧而言“40”是半徑的組碼,“11”“21”“31”是線段終點坐標X、Y、Z的組碼,“50”“51”是圓弧的始末角度組碼。組代碼和組值為一個組如:圓弧實體下“40”, 43.600 458 71,就為一個完整的組,通過組代碼可以容易識別組值的內在含義。有些數字在不同的實體代表不同的含義,而有些是固定的含義。遇到更多形式的實體可以參考組碼含義(表1)或者閱讀AutoCAD使用手冊[16]中DXF相關文檔,這里就不詳細實例列舉。
組代碼含義組代碼含義0標志一個事物的開始38實體高度1一個文本,如字符串的值等39實體厚度2名字,如段、表、塊的名字40~48高度、寬度、距離3~4字符型數據的值,如線型說明49重復性的值5實體描述字50~58角度值6線型名62顏色好7字樣名66實體跟隨標志8圖層名70~78整數值,如重復次數、標志位、模式等9標題變量名210X方向分量10~18X坐標值220Y方向分量20~28Y坐標值230Z方向分量30~37Z坐標值999解釋行
航道地形的可視化需要得到三維地形數據,然后利用MTALAB編譯功能,將地形數據轉化為視覺以及進一步的分析數據。首先是要能夠讀取數據,MATLAB讀取地形數據方式較方便,且方法多樣、操作簡單。例如先在CAD地形圖中進行屬性提取,選擇X、Y、Z坐標選項,導出*xls或者*txt格式文件等。運用MATLAB讀取數據文件,針對不同格式文件所用函數有所區別。
a) {'xls' ,'xlsx'}文件使用“xlsread”讀取具體代碼如下:
[num,~,~] = xlsread([pathname,filename]);(讀取某路徑下的文件)
X=num(:,1);(讀取X坐標數據)
Y=num(:,2);(讀取Y坐標數據)
Z=num(:,3);(讀取Z坐標數據)
b) {'txt','dat','csv'}文件使用“textscan”讀取具體代碼如下:
fileID = fopen([pathname,filename]);(打開某路徑下的文件)
Data = textscan(fileID,'%f,%f,%f','headerlines',1);(提取文件數據)
fclose(fileID);
X=Data{1,1};(讀取X坐標數據)
Y=Data{1,2};(讀取Y坐標數據)
Z=Data{1,3};(讀取Z坐標數據)
MATLAB中函數種類齊全,基本可以滿足需求,讀取XYZ數據后,先通過函數“delaunay”進行非結構化,目的是為下一步三維地形顯示進行預處理。
tri=delaunay(X, Y);(數據非結構化)
接下來通過高程來控制地形在三維視圖的顏色,這樣視覺效果顯的更加好:
ColorZ=zeros(size(Z));(定義維度為Z的空矩陣)
ColorZ(:)=min(Z);(獲取Z的最小值)
最后使用“trimesh”函數將地形三維可視化,
XYZ=trimesh(tri,X,Y,Z,ColorZ);(可視化)
也可以使用“contour3”/“contour” 函數實現等值線圖、云圖等,使得地形的顯示多樣化:
[C,h]=contour3(X,Y,Z,]);(等值線化)
圖2中可以看到地形數據經過MATLAB處理以后,可以實現地形3D查看,地形形態直接明了,也可以顯示為CAD中的等高線形式,等高線的高差還可以自己任意控制。
MATLAB數據傳遞到CAD中,必須將數據寫入特定的DXF文件中。寫成DXF文件有2種方法:①通過程序完整的一次性寫成DXF文件;②預先準備空的DXF文件或者有特定內容的DXF文件,再通過程序寫入需要的圖形數據即可。顯然第二種方法要簡單、方便得多;第一種則針對性強,一一對應。本文只對第二種方法進行闡述。
Step1預先打開AutoCAD保存一個空的DXF或者自定義的DXF模板,首先使用“textread”函數讀取預設的DXF文件。
A=textread('Drawing2004new.dxf','%s','delimiter','/n');(讀取DXF腳本)
Step2然后利用“find”找到DXF文件中實體數據的位置,為插入實體數據做準備。
m=find(strcmp(A,'ENTITIES'));(找到腳本中數據插入點)
Step3再使用自編的“Dxf_Polyline”函數(該函數只適用于自己的實例就不詳細說明)得到實體數據并寫入數據。
dxf=Dxf_Polyline(XY,n,Ai);(獲取實體對象,XY數據存儲矩陣,n為實體個數,Ai)
Dxf_Polyline函數是通過輸入數據矩陣,實體個數以及Ai,達到按照DXF格式寫好的的數據矩陣。
A_new=[A(1:m,1);name;dxf;A(m+1:end,1)];(將生成的實體對象串成一個結構)
Step4最后新建一個DXF文件完整的寫入數據保存。
fid=fopen([pathname,filename],'a');(保存文件路徑、文件名)
for i=1:length(A_new)
fprintf(fid,'%s/r/n',A_new{i,1});(寫入數據)
end
fclose(fid);(關閉文件)
航道拋石施工斷面監測軟件就是通過MATLAB語言編譯成的,其主要功能是可同時導入原始地形、拋石過程地形和設計地形,然后根據采集的拋石地形實時的監測拋石質量和控制拋石精度,可以方便快捷的完成拋石工程[17]。航道工程施工的基本過程見圖3,軟件監測主要是從兩方面來反映:①通過設計拋石體積,計算應拋石的區域實時已拋石量;②通過把拋石區域沿壩軸線截取許多拋石斷面,通過設計、原始、已拋石的橫截面曲線來反映,可以計算出未拋石的橫截面面積,從而得知各個斷面的拋石情況。通過應用上文提到的MATLAB與AutoCAD交互的技術路線和思路,將地形進行可視化,然后也可以通過監測軟件輸出或批量輸出拋石斷面圖(DXF格式文件),方便現場施工,加快施工進度和提高施工質量。在MATLAB編譯的軟件中還可通過其他函數進行放大縮小、三維旋轉、數據游標、等值線化、面積計算、體積計算等一系列操作,彌補在CAD中所不能實現的功能。航道拋石施工斷面監測軟件的功能基本能滿足水下拋石工程的需求,將水下不容易觀測的東西通過軟件實現可視化。
通過航道原始地形和拋石地形的加載可以進行三維對比(圖4),也可以選擇以散點形式顯示。深藍色區域為拋石后的新的地形,通過左方的差值顯示,可以顯示新舊地形的等值線圖。
在4.2的基礎上還可以加載設計的整治建筑。通過定義的設計軸線和斷面參數將設計形體放置于地形當中(圖5)。斷面參數可以調用數據庫文件,亦可通過參數設置界面臨時設置并且可以保存,以便下次使用。通過加載的軸線,可以劃分多個斷面,同時在右上角的小圖框中可以查看顯示拋石地形、原始地形的斷面線與設計斷面的相差情況。設計方案顯示見圖6。
進入右上角的獨立界面后,可以查看具體信息包括設計斷面面積、當前已完成面積。點擊信息查看按鈕后可以查看斷面另一點的信息,包括距離軸線多遠、已拋高度、未拋高度等。返回主界面,在菜單欄中點擊拋石方量計算,可以計算總的工程量,可以通過分層厚度來提高計算精度(圖7)。
為了滿足施工的需要,CAD出圖是最好的選擇,可以方便攜帶至施工現場。通過前面的思路,編寫的程序在拋石監測軟件中成功實現了數據在DXF文件中的傳遞,CAD出圖效果見圖8。圖中可以看到從MATLAB中輸出了設計、原始、拋石的地形線,在有護腳的拋石工程中同樣可以顯示,以及斷面名稱、距離壩軸線的橫距和對應的高度,一目了然。
通過MATLAB軟件平臺實現了對地形數據進行可視化處理并且可以進行更多的數據分析,更好地進行施工指導。本文主要可以得到以下結論:①通過MATLAB平臺,結合自有函數和自編函數在一定程度上實現了航道工程地形數據的三維可視化和進行進一步的數據分析;②充分闡述了AutoCAD的DXF文件結構,可以更好地實現數據在應用軟件中的輸入與輸出,并建議在輸出DXF文件時,預先設置好DXF文件腳本可以減少寫入DXF文件的復雜性,加快計算;③集三維可視化、剖面顯示、方量計算等多功能與一體的軟件,能更好地滿足航道工程施工需求。當然程序還需要適當地優化提高操作的流暢性以及完善軟件的功能,滿足實際施工需求。