基于Auto CAD VBA获取河长的研究
2014-12-25成丽婷
成丽婷
(山西省水利水电勘测设计研究院 山西太原030024)
1 问题提出
水文流域参数是进行各项水文分析计算的基础数据,这些参数的快速准确的获取直接影响到水文分析计算的效率与精度。研究简单易行的水文流域参数的获取方法,不仅可以保证参数的准确性,为后续的水文分析计算工作提供可靠的数据,而且大大缩短了基础性工作的耗时,为后续的核心工作预留出宝贵的时间。尤其是在一些大型水利工程的前期工作中,往往涉及到成百上千个区域的水文参数的获取,若依靠现在的一些技术和方法,效率和精度上很难兼顾。
河长比降J是基本的水文流域参数,河流纵比降[1]的计算还需要获取分段河长,计算公式如下:
式中,L为自流域出口断面起沿主河道至分水岭的最长距离,包括主河道以上沟形不明显部分坡面流程的长度,当河道上有瀑布、跌坎、陡坡时,应当把突然变动比降段两端的特征点,都作为计算加权平均比降时的分段点,以使计算的比降反映沿程实际的水力条件,km;Z0、Z1…Zn为自流域出口断面起沿流程比降突变特征点的地面高程,m;L1、L2…Ln为两个特征值点之间的距离,km;L 为 L1、L2…Ln之和,见图1。
图1 河流纵比降计算示意图
基于1:10000或1:50000地形图计算比降,Z0、Z1…Zn需要人工读取,L1、L2…Ln数值通过Auto CAD获取。随着计算机技术的发展和绘图软件Auto CAD[2]在水文技术行业的广泛应用,水文流域参数的获取变得简单易行,而且相比之前具有以下优势:第一,再现性好,拼接完毕的图纸,勾勒的分水岭,绘制的河流等等数据都可以保存下来,可以随时查阅和校核;第二,消除了读数误差;第三,操作方便等等。即便如此,笔者在工作中量取河长计算比降的过程中发现传统的Auto CAD功能依然存在不足,尤其数据量大时,河长的获取相当繁琐耗时。但VBA[3](Visual Basic for Applications)应用软件集成于Auto CAD以后,上述问题迎刃而解。本研究以Windows XP,Auto CAD和VBA为开发环境,研制了获取河长参数软件,并进行了实例应用,以期为水文分析的参数获取提供可靠简便的操作方法,更是希望抛砖引玉,充分应用Auto CAD和VBA开发平台解决水文工作中的问题。
2 VBA的应用
VBA(Visual Basic for Application)是一种完全面向对象体系结构的编程语言,提供了一个基于对象的编程环境,具有丰富的开发功能,能直接在Auto CAD内部执行,开发者能够方便地替换和添加Auto CAD系统内部的模块。在VBA中,Auto CAD中的实体作为对象而存在,对这些实体的操作作为方法,编制处理过程或宏命令,从而实现了开发者进入到Auto CAD内部进行用户化处理[4]。由于VBA依附于主应用程序,因此它与主应用程序之间的通信简单而富有效率,其代码完全是在进程内部执行的。
应用VBA获取河长的步骤:
(1)建立选择集作为放置图形元素的容器;
(2)运用Select方法[5]选取图形对象,select方法具有5种选择方式,可以选择全部对象、上次创建的对象、上次选择的对象、矩形窗口内对象、矩形窗口内以及与边界相交的对象;
(3)运用Selectonscreen方法让用户手动选择对象,如同在Auto CAD中选取对象一样,可以逐一选取,也可以用窗口选取。如果需要有条件地选择对象,比如选择所有的多段线等,需要为Selectonscreen方法增加过滤器参数,通过过滤器可以从所选取的图形对象中筛选出某一类特定的图形对象;
(4)选择集过滤后所得到的图形对象属性数据的输出。
3 实例应用
Auto CAD批量获取各相邻高程点之间的距离,即分段河长,有3种方法,本文以一简单例子对上述三种方法进行对比。例子中提到的长度是指Auto CAD中量取的图上距离未利用比例尺转化为实际距离。
(1)方法一,借助多段线直接绘制自流域出口断面起沿主河道至分水岭的最长河长L,由于河道是曲折蜿蜒的,所以在点绘两相邻高程点之间河长时需要放置多个点,绘制河长L共放置49个点,见图2。利用“工具”—“查询”—“列表显示”,显示结果中包含了河长L中所有点的X、Y坐标值,表1中仅列出部分数据。首先利用勾股定理分别计算相邻两点之间长度,然后分组计算各相邻高程点之间的河长。高程点Z0与Z1区间,即相对应于河长L1,共包含8个点,1-8点区间距离之和11.7mm即河长L1;高程点Z1与Z2区间,即相对应于河长L2,共包含5个点,9-13点区间距离之和8.03mm即河长L2。以此类推可获取各相邻高程点之间的河长。这种方法只绘制一条多段线,为顺应河道走势需布设多个点,为获取分段河长需在各高程点处布设点,而且需在布设点的同时记录好每个点属于哪个分段河长区间,然后将点进行分组,分别获取各组多段线长度之和,才能与各个高程区间的河长一一对应。
(2)方法二,逐一绘制相邻高程点之间河长 L1、L2…Ln,共绘制8条多段线,见图3。然后选中全部多段线,利用“工具”—“查询”—“列表显示”,显示结果中分块显示不同河长的诸多属性特征,见图4。除了长度特征外,还包含了图层、线型、面积等特征,获取长度信息只能通过人工筛选并手工录入到EXCEL中。这种方法绘制n条多段线,CAD命令输出的是每条多段线的诸多信息,只能通过人工筛选长度信息并手工录入EXCEL中,n越大,人工筛选和手工录入的工作量就越大,不仅如此,在手工录入大量数据时为避免录入数据错误还需进行多次数据复核。
(3)方法三,逐一绘制相邻高程点之间河长 L1、L2…Ln,共绘制8条多段线,见图2。应用VBA,编制宏,实现2个功能,其一建立选择集作为一容器,经这个容器过滤后选择集中只保留多段线对象;其二,输出上述选择集中多段线的长度信息。然后只需运行宏,选中全部多段线,即可将各个高程区间的河长数据直接输出到EXCEL中。
图2 方法一示意图
图3 方法二、三示意图
图4 方法二结果示意图
以上可看出,方法一直接点绘整段河长L,获得49个点的X、Y坐标,计算出各相邻两点之间的距离,对49个点进行分组与高程区间一一对应,即得出分段河长值;方法二、方法三分段绘制河长L1、L2…L8,分别通过人工录入、VBA输出数据到EXCEL中。方法一和方法三都避免了人工录入数据,但方法一需要人工对数据进行分组;方法二与方法三思路基本一致,但在数据整理输出时,方法二通过人工筛选录入数据方式,而方法三简单易行,实现了将Auto CAD图形相对应的属性数据直接输出到EXCEL中。从表1可以看出三种方法所获取的结果完全一致,但方法三大大提高了工作效率,尤其是在数据量大时优势更为突出。
表1 三种方法获取分段河长结果表
4 结论
VBA(Visual Basic for Application),具有丰富的开发功能,能直接在Auto CAD内部执行,从而实现了开发者进入到Auto CAD内部进行用户化处理。本文基于VBA研制出在Auto CAD中获取河长软件,克服了传统方法依赖人工、不能实现Auto CAD与EXCEL数据的快捷与直接传递的缺陷,应用实例对此方法与传统方法进行比较,通过比较得出,VBA实现了批量将河长数据快速直接地导入EXCEL,提高了工作效率。
[1]山西省水利厅.山西省水文计算手册 [M].郑州:黄河水利出版社.2011.3
[2]李善锋主编.Auto CAD2012中文版基础教程[M].北京:人民邮电出版社.2012.9
[3]张帆主编.Auto CAD VBA二次开发教程[M].北京:清华大学出版社.2006.1
[4]陈 亮.基于VBA的堤防CAD系统研究与开发[D].华南理工大学硕士学位论文.2004:6-7
[5]乔平安主编.Visual Basic6.0程序设计[M].北京:人民邮电出版社.2013.2