李 垚,夏富洲,刘富奎
(1.安徽省水利水电勘测设计院,安徽 合肥 230000;2.武汉大学水利水电学院,湖北 武汉 430072;3.中山市水利水电勘测设计咨询有限公司,广东 中山 528400)
在河道堤防的工程设计当中,需要绘制河道的横、纵断面图、堤防线等线的平面图、计算堤防的工程量等,如果用手工绘图或计算要花费大量的时间。目前有些程序虽然也能够快速绘制横、纵断面图,但是这些程序鲜有考虑到程序的兼容性。比如,现状横断面线是由设计者A用某个主流软件绘制,交给设计者B绘制设计横断面线,标注水位,计算工程量的时候,由于一些计算参数的缺失,导致再次使用程序绘图、计算时出现错误。本论文着重研究一种快速进行堤防工程设计的方法,同时编制出一套功能完整、兼容性高的应用程序。
横断面的绘制内容包括以下几个方面:现状横断面线,设计横断面线,网格线,坐标标注,桩号标注,水位标注等。
绘制图形的时候,要求把图形放到各个图层中。如现状横断面线可以放到图层“TW_横断面”中,设计横断面线可以放到图层“TW_挖填线”中。
在通常的设计流程中,首先把现状横断面线,网格线,坐标标注等绘制完成;然后根据绘制好的现状横断面线绘制设计横断面线,标注水位等等。
由于设计断面线以及水位标注需要绘制到指定的高程上,且横断面图众多,一个一个进行断面设计花费时间太多。其它程序通常的做法是:将所有横断面图的原点坐标设置成统一的坐标值,并把这些坐标值写入到外文件中,比如txt文件中。当需要绘制设计断面线以及水位标注时需读取txt文件中的原点坐标来完成绘制图形。这种做法的弊端是:当设计者A将现状横断面线、网格线、坐标标注绘制完成后,将设计断面线以及水位标注的工作交给另一设计者B绘制时,需要把txt文件一起交给设计者B,这样可避免设计者B的再一个个把设计断面线以及水位标注这些图形绘制到断面图中。
本文将介绍一种在dwg格式文件中通过数据搜索的方式自动读取横断面的原点坐标,进而绘制出设计断面线以及水位标注等图形的方法。由于采用了数据搜索技术,可以不需要把横断面的原点坐标设置成统一的原点坐标,也不需要将原点坐标写入到外文件当中,以下介绍这种数据搜索技术。
数据搜索技术中需要用到一个辅助的图形,如图1中的图框所示。该图框的作用是把每个横断面图分割成一个个独立的区域,然后程序分别对各个横断面图进行堤防设计及标注。
图1 横断面图
(setq qd_list
(cons '(-4 . " (append SL<-SW_li3 (list '(-4 . " '(-4 . ">=,>=,*") (cons 10 qd_minpt) '(-4 . "AND>") '(-4 . " '(-4 . "<=,<=,*") (cons 10 qd_maxpt) '(-4 . "AND>") '(-4 . "AND>") ) ) ) ) (ssget "_C" qd_minpt qd_maxpt qd_list) 其中:qd_minpt为图框的左下角点,qd_maxpt为图框的右上角点。SL<-SW_li3视情况,如果需要得到图1中的桩号图形集合,则可以为′((0."TEXT")(8."TW_桩号"));如果需要得到图1中的坐标图形,则可以为′((0."TEXT")(8."TW_注记"));如果需要得到网格线,则可以为′((0."LINE")(8."TW_网格")),其中(0."TEXT")中的TEXT是指被搜索图元的类型,(8."TW_桩号")中的TW_桩号是指被搜索图元的图层。 设通过过滤获得网格线的集合为SL<-SW_SS,首先将SL<-SW_SS中坐标x值相等的网格线分选出来,并把分选出来的线按x坐标递增的方向排序,将新得到线集合设为SL<-SW_SSX; 然后把SL<-SW_SS中坐标y值相等的网格线分选出来,并把分选出来的线按y坐标递增的方向排序,将新得到线集合设为SL<-SW_SSY。以线集合SL<-SW_SSX为例,取出线集合SL<-SW_SSX中的某条直线以窗交选的方式搜索坐标数据,如下代码: (setq SL<-clxy_Textss (ssget "_C" SL<-clxy_TextPoint SL<-clxy_TextPoint2 SL<-SW_li2)) SL<-clxy_TextPoint,SL<-clxy_TextPoint2是网格线周围的两点,用于选择网格线周围的坐标。SL<-SW_li2为′((0."TEXT")(8."TW_注记"))。通过此方法可以搜索到网格线下的x坐标值。如图1中,假如网格线1搜索到的数值为zb1,网格线2搜索到的数值为zb2,又知道网格线1在线集合SL<-SW_SSX中的序号为d1,网格线2在线集合SL<-SW_SSX中的序号为d2,且相邻两根网格线的距离可以通过取相邻两条网格线x坐标之差来求得,将此值设为M。则可以求出x向的比例为: x向比例={(d2-d1)×M}÷(zb2-zb1)÷1000 (1) 此时再来求原点的x坐标,设网格线1搜索到的数值为zb1,网格线1在线集合SL<-SW_SSX中的序号为d1,原点处网格线序号为0,相邻两条网格线x坐标之差为M,则原点的x坐标为: x坐标=d1×M÷x向比例÷1000-zb1 (2) 按照上述方法同样可以求出原点的y坐标。 通过数据搜索技术可以自动分辨出每个横断面的原点坐标,以及x、y向的比例尺从而可以快速将设计断面线以及水位标注绘制到各个横断面图中,从而大大提高绘图效率。 纵断面通常需要绘制左堤顶线、右堤顶线以及深泓线等。纵断面图形的绘制需要注意y轴的标尺的最大值和最小值的取值。设左堤顶线各断面高程的最小值为m1,最大值为n1;右堤顶线各断面高程的最小值为m2,最大值为n2;深泓线各断面高程的最小值为m3,最大值为n3。如果m1,m2,m3中m2最小,则y轴的标尺标注的最小值为:(-(fixm2)1);当n1,n2,n3中n2最大,y轴的标尺标注的最大值为:(+(fixn2)1)。 工程量的计算内容分为:左右岸挖方量、左右岸填方量、左右清基方量、左右岸临水侧硬质护坡、左右岸背水侧草皮护坡。 图2 挖填方计算示意图 如图2所示,有条挖填线与现状堤防线的交点为P1、P2、P3,P1、P2之间的S1为填方量,P2、P3之间的S2为挖方量。程序判断挖方量和填方量,只需要把P1与P2的中点所在的位置取一直线分别交于P1与P2之间的挖填线点Pt1和现状堤防线点Pt2,判断Pt1,Pt2的y坐标大小即可以判断是挖方还是填方。如果Pt1的y坐标值大于Pt2的y坐标值,则为填方量,反之则为挖方量。 求S1的面积,设S1由点集(Q1,Q2,Q3,…,Qn)组成,坐标分别为:Q1(X1,Y1),Q2(X2,Y2),Q3(X3,Y3),…,Qn(Xn,Yn)。 S=1/2×{(X1×Y2-Y1×X2)+(X2×Y3-Y2×X3)+…+(Xn×Y1-Yn×X1)}/bx/by/1000/1000 (3) 其中bx为x向比例,by为y向比例,公式中S以m2计。 欲求左、右岸清基方量,需求清基的长度,按0.3m的挖深即可求得。清基的长度如图2所示,P1、P2截取现状堤防线的长度再按一定的比例计算得到。设P1、P2截取现状堤防线的点集为(Pt1,Pt2,Pt3,…,Ptn-1,Ptn),坐标分别为:Pt1(X1,Y1),Pt2(X2,Y2),Pt3(X3,Y3),…,Ptn-1(Xn-1,Yn-1),Ptn(Xn,Yn)。 清基的长度为: (4) 式中,bx—x向比例;by—y向比例,公式中的d以m计。 本节需要解决以下3个问题: (1)堤防、河底等线在桩号线上的坐标标注; (2)河道中心线位置的读取; (3)堤防、河底等线的平面图绘制。 要解决这3个问题,需要使用另外一种数据搜索技术。现把这种数据搜索技术的算法阐述如下。 图3 平面图数据搜索 (1)首先选取所有的桩号文字,并获得包含桩号文字的四个矩形顶点的坐标,如图3所示。 (2)如图3所示,顶点分别为:P1、P2、P3、P4。在P1、P2、P3、P4垂直于各点所围矩形的长边方向上搜索桩号线。 (3)最后根据桩号线的方向及基点的坐标就能够精确确定横断面图各特征点在平面图上的位置。 这样就能够实现堤防、河底等线的坐标标注,河道中心线的位置读取,堤防、河底等线的平面图绘制等功能。 我们通常需要获得堤防线、河底线等与桩号线的交点的坐标数据,并把这些数据分别打印到CAD模型空间和CSV格式的文件当中。 其中将交点打印到CAD模型空间使用代码: (setq Mtextobj(vla-addMtext mSpace pt20.0(strcat "X="(rtos (car p1)2 2)"
Y="(rtos(cadr p1)2 2)))),把交点的X坐标和Y坐标分别打印到模型空间中。 把交点打印到CSV格式文件:需要打印桩号、交点的X坐标和Y坐标。然而一个交点需要与一个断面号对应起来。利用4.1节介绍的平面图上的数据搜索技术,可以把桩号文字与桩号线(如图2)组合在一起了,而交点是桩号线和堤防、河底等线求交所得,因此可以把每个交点对应的桩号以及交点的X坐标和Y坐标打印到CSV格式文件当中。 横断面图绘制完成后,需要将堤防线,河底线绘制到平面图上。在横断面图上以及平面图上都有一个基点,可以通过这个基点把横断面图上测得的离基点的距离放样到平面图上。在这里需要注意2个问题: (1)离基点的距离可以为正也可以为负,在把距离放样到平面图上时,也需要规定一个方向。 (2)横断面图上测得的离基点的距离的顺序是无序的,需要通过按里程从小到大进行排序。 解决第一个问题的方法是:我们做一条辅助线(设该辅助线为PM),使线PM与桩号线的交点(设此交点为P)始终保持在基点的左侧。如果离基点的距离为负值,则将点绘制到基点的左侧,即与交点P同侧的方向,如果离基点的距离为正值,则将点绘制到基点的右侧,即与交点P异侧的方向。 解决第二个问题的方法是:把图3中的字符串N23(29+672.3)、N24(29+628.2)、N25(29+597.1)等分别转化为数字29672.3、29628.2、29597.1后再根据桩号的大小进行排序。 另外,完成堤防、河底等线的平面图绘制依然需要用到4.1节的“平面图上的数据搜索技术”。通过数据搜索可以获得桩号文字、桩号线、基点的组合信息,然后通过桩号文字中的信息从小到大进行排序,由于桩号文字、桩号线、基点是组合在一起的,桩号线、基点也跟着桩号文字的大小值进行排序。这样经过排序后求得的在桩号线上的点相连以后堤防线、河底线等才不会出现交叉缠绕的现象。 本文主要介绍了快速绘制纵横断面图、计算工程量,绘制平面线的方法。着重介绍了数据搜索技术,使用数据搜索技术进行的纵横断面绘图、平面线绘图,大大提高了设计者的工作效率。本文介绍的应用程序已经在《丰乐河流域综合治理工程》、《无为县五千亩至万亩圩口除险加固工程(Ⅰ期)》、《安徽省淮河流域西淝河等沿淮洼地治理应急工程》、《2015年度拦路港堤防除险加固工程》等项目中得到很好的应用。2 纵断面绘制
3 工程量的计算
3.1 左、右岸挖填方量
3.2 左、右清基方量
4 堤防,河底等线的平面图
4.1 平面图上的数据搜索技术
4.2 堤防、河底等线在桩号线上的坐标标注
4.3 堤防、河底等线的平面图绘制
5 结论