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