(江西省港航设计院,江西南昌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文件的复杂性,加快计算;③集三维可视化、剖面显示、方量计算等多功能与一体的软件,能更好地满足航道工程施工需求。当然程序还需要适当地优化提高操作的流畅性以及完善软件的功能,满足实际施工需求。