基于.Net开发道路纵横断面检查软件及其应用
2012-02-08袁兆奎
袁兆奎
(武汉市政工程设计研究院有限责任公司,湖北武汉 430023)
1 引言
在市政工程中,道路的纵横断面测量是一项重要的工作内容。一般来说,在获取地形图之后,应进行纵横断面的实地测量,包括各中桩点和碎部断面点的高程测量,测得的数据人工填入记录纸上。内业时,首先将记录纸上的数据按指定的格式录入电脑,然后进行格式及数据内容检查,确认无误后交付给设计人员。
笔者经过长期的工作实践,发现上述工作流程中,存在如下问题:①人工录入的数据大,耗时长,且容易出错;②数据录入后,查错纠正很难满足要求;③纵横断面图形检查的功能很难发现细微的错误,且运行效率低下。
对此,笔者提出了一种简码格式,能减少断面录入的工作量,提高工作效率;并基于.Net平台,用C#语言在Visual Studio 2005上开发了一款能进行断面数据检查的软件;最后研究了纵横断面的绘制及图形检查,并在AutoCAD上进行二次开发,实现了该功能。经过一年多的推广应用,该软件已经较为成熟、完善。
2 断面文件格式及其简化
武汉市政工程设计研究院有限责任公司勘测设计院设计软件所能支持的纵横断面文件为下述格式:
这种格式称为全码格式,对该格式进行分析,可以看出其有如下特点:
(1)每一个新的横断面都是以“Z=”作为开头,其后为中桩的里程、正负高程。
(2)横断面的数据以从左到右的顺序列出,内容为断面点与中桩的距离,断面点的高程。如果断面点位于中桩的左侧,距离取负,若在右侧,距离取正;高程全部取负。
(3)在纵断面中,若有加桩,只需以“Z=”为开头,然后输入里程和正负高程即可。
笔者认为,上述文件格式虽为道路设计软件所专用,但却可以大大简化,减少手工录入的工作量,提高效率:
①在中桩所在的数据行,可以只录入一个高程值,不必录入两个。
②横断面的数据既然已规定为从左至右,因此左侧的距离数据可以不用取负号,直接按正号录入;断面点的高程也只按正号录入。
因此,笔者设计了一种简化的纵横断面文件格式:
以上这种格式可称为“简码”格式。可以看出,若采用简码格式,内业数据录入时,可以大大减少工作量(没有“-”号和“,”号),且所有的操作都可以集中在键盘的“数字键盘”区域内,能极大提高效率。
3 断面文件数据检查及格式转换
虽然采用简码格式可以大大减少手工录入的工作量,但仍然会出现各种错误,尤其是当道路很长,且断面宽度较大时,错误一般很难避免。另一方面,在没有采用简码格式之前,以前的工作中存在着很多全码格式的断面文件,也需要进行检查。因此,要实现简码格式和全码格式的数据检查,并能将简码转换成全码。
3.1 断面文件数据检查
经过长期工作实践,发现手工录入后,断面文件中一般有以下几种类型的错误,如表1所示。
断面文件中可能出现的错误类型 表1
编写程序时,有两处需要注意:
(1)断面文件应一次性全部读入,不能逐行读入,否则针对一个横断面的检查时就很难操作。具体来说,用StreamReader.ReadToEnd()将断面文件全部读入,并用Regex.Split()将数据分割成string类型的数组:
如此,在进行一个横断面的检查时,先在file_content_array中寻找该断面的起止位置,然后再进行内部检查;检查完毕后,寻找下一个横断面的起止位置,重复上面的检查。
(2)在横断面内部,检查断面点与桩号间的距离是否严格按从左到右的顺序时,可以先定义一个初始值为false的bool类型变量zero_comeout。当zero_comeout为false,且断面点与桩号间的距离为递减时,认为无误,否则认为有错误,并输出错误的位置;当距离为0时,认为读到桩号处,将zero_comeout设为true,并检查该处高程是否与桩号处一致;当zero_comeout为true,且断面点与桩号间的距离递增时,认为无误,否则认为有错误,并输出错误的位置。该处可用如下代码实现:
断面文件数据检查这部分程序的结构示意图如图1所示。
在该软件中,可以通过对话框设置检查参数,检查完毕后生成报告,详细指出错误所在的行数及错误的类别,从而可以快速进行定位、纠正。对于数据很长的断面文件,该功能尤其有效。检查工作有必要多次进行,以确保无误。图2为软件的主界面。
图1 断面文件数据检查程序示意图
图2 断面数据处理程序主界面
3.2 简码转换成全码
该部分要实现将简码格式的断面文件生成全码格式,实现起来较为简单,主要注意以下两点:
(1)桩号处。提取一行的数据,若其中含有“*”,认为该行为桩号处,将“*”号替换成“Z=”,并添加正负高程。
(2)桩号内部。首先仍定义一个初始值为false的bool类型变量zero_comeout。当断面点与桩号处的距离不为0,且zero_comeout为 false时,距离取负号,高程取负号;当断面点与桩号间的距离为0时,设置zero_comeout为true,高程取负号;当断面点与桩号间的距离不为0,且zero_comeout为ture时,距离取正号,高程取负号。
每一步处理完后,均将处理结果写入新的文件,直到断面文件全部处理完毕。
4 断面图的绘制及图形检查
虽然上述程序对断面文件内的数据进行了详细的检查,但并不能保证其已经完全没有问题。例如,在录入时,陡砍上、下的高程值有可能输成一样,但前文的检查并不能发现。作为工作成果的纵横断面文件在归档及交付设计人员、业主时,应确保无误,因此,绘制纵横断面及进行图形检查很有必要。
笔者基于.Net平台,用C#语言对AutoCAD进行二次开发,实现了纵横断面图的自动绘制,其后即可以进行图形检查。相对于AutoLisp或者VBA等传统的开发语言,C#可以编写出运行效率更高的应用程序。这对配置较低的电脑或者绘制数据量较大的纵横断面尤为重要。
4.1 程序编写
编写程序时,主要有以下几方面需要注意:
(1)图层。为便于绘制及检查,笔者对纵横断面图进行分析,自定义了5个图层:
①断面点:显示纵断面的中桩点和横断面的碎部断面点,均以“红圈”突出显示。
②断面线:由纵断面的所有中桩点或横断面的所有碎部断面点以直线方式连接而成的多段线,以绿色显示。
③断面参考坐标系:为平面直角坐标系。对于纵断面,以起始中桩为原点,里程增加方向为横轴,高程增加方向为纵轴;对于横断面,以中桩点为原点,从左至右为横轴,高程增加方向为纵轴。纵轴上的高程值范围均严格标示,例如高程标示为[17,22],说明所有点的高程值均在如下范围内:17≤H≤22。
④断面点高程:在纵断面中桩点和横断面碎部断面点的旁边显示其高程值。
⑤断面点桩号点位置:显示中桩点的里程值,或者横断面所有碎部断面点距离中桩的距离值。
(2)在AutoCAD中绘制文字、断面点和断面线。它们的实现方式差不多,以较为复杂的绘制断面线为例,程序中主要用到AddLine()这个函数:
(3)针对不同版本的AutoCAD进行开发的问题。在Visual Studio 2005的“解决方案资源管理器”中点“引用”,右键选择“添加引用(R)…”,在对话框中选择“浏览”,然后进入AutoCAD的安装目录,选择“acdbmgd.dll”、“acmgd.dll”。然后将程序重新编译、生成,如此便生成针对该AutoCAD版本的程序了。
该部分程序的结构示意如图3所示。
图3 断面图绘制程序示意图
4.2 程序使用
打开AutoCAD后,输入“netload”命令,在对话框中选择已生成的dll文件,然后再输入“drawdm”命令,弹出纵横断面绘制程序的主界面(图4)。
图4 纵横断面绘制程序主界面
在该界面上可以进行一些参数设置,以适应不同的比例尺等。“确定”之后程序自动绘制断面,并调节缩放比例,让所有断面满布在窗口中,图5是绘制的某个横断面。
图5 绘制出的横断面
纵横断面绘制完毕后,即可以进行图形检查,发现并纠正细微的错误。
5 道路断面工作量统计
在纵横断面文件检查完毕后,可以统计本次工程的工作量,以作为计算产值、费用等的依据。工作量的计算分纵向和横向。对于纵向,只需提取里程的最小、最大值,进行相减即可。对于横向,需计算每一个横断面的工作宽度,即对最左侧断面点和桩号处的距离与最右侧断面点和桩号处的距离求和,然后累加所有的工作宽度,同时还应累计横断面的个数,如图6所示。
图6 纵横断面工作量统计
6 结论
本文对道路的纵横断面文件格式进行了分析,提出了一种简码格式,能大大减少手工录入的工作量,减少出错,提高工作效率,并实现了简码格式转换为设计软件所能识别处理的全码格式,以及对全码格式断面文件的检查。其次,研究了纵横断面文件的数据检查和图形化检查。数据检查能发现9大类错误,图形化检查能在AutoCAD上绘制纵横断面并人工发现细微的错误。最后,实现了道路断面的工作量统计。经过长期推广应用,该程序已较为成熟、完善。
[1]潘正风,杨正尧,程效军等.数字测图原理与方法[M].武汉大学出版社,2004.
[2] 张正禄.工程测量学[M].武汉:武汉大学出版社,2005.
[3]余兴胜.用.NET进行AutoCAD二次开发的方案探索[EB/OL].http://news.e800.com.cn/articles/2008/12/1199238090246_1.html,2008.
[4] ObjectARX编程站.Hello World:访问ObjectARX.NET封装类[EB/OL].http://www.mjtd.com/Manual/Article-Show.asp?ArticleID=836,2005.
[5]博客园.AutoCAD.net二次开发官方教程及源码C#版[EB/OL].http://kb.cnblogs.com/a/1257334/,2008.