肖 怡
(四川省交通勘察设计研究院有限公司,四川成都 610017)
在航道整治项目中,设计水深是设计人员经常需要用到的数据,这就要求测量人员根据设计水位将水下地形点换算成设计水深点[1]。由于江河等流域是存在上下游比降的,所以在处理水深点转换时不能用单一水面高减去水下高程点来计算水深。目前,很多测量人员都是根据水位比降[2]分段做水深改正,在航道长度长,水位比降大时,数据处理工作极其枯燥繁琐且耗时。
AutoCAD Civil 3D 是由Autodesk 公司推出的一款的建筑信息模型(BIM)设计软件。为用户提供强大的测量、设计、分析与文档处理解决方案。作为一款强大的平台软件,其提供的地形曲面数据处理功能对于一线测绘人员十分有用。对于有一定编程经验的测绘人员来说,可以通过Civil 3D 提供的API,用C# 语言对其进行二次开发。本文就介绍了Civil 3D 是如何用C# 二次开发解决设计水深点转换工作。
Civil 3D 曲面是由三角网构成的,可以用于表达地形、道路、河流等地形特征。Civil 3D 能真实计算出挖填方的工程量,而且还可以进行挖填平衡的自动调整[3]。在Civil 3D 中,曲面的创建有多种方法,其中最常用的是根据等高线和图形对象创建。创建好的曲面对象提供了曲面编辑、查询及分析功能。其中,编辑功能允许用户对曲面三角网或者点进行添加、删除、移动等操作;查询功能支持用户查询曲面上的数据,如高点程、距离、面积等;分析功能支持对曲面进行分析,如计算曲面面积、体积等。
在本程序中,主要是对曲面创建和任意高程点查询的应用。通过用调整后的设计水边线创建水面曲面,然后对水下高程点进行水面高程查询,最后,利用水面高程与水底高程求差计算出真实水深。
水边线高程点是指在根据水尺记录数据和设计水位对水边线进行修正后,在水边线上根据水位变化合理地插值出高程点[4],并用Cass 展绘到水边线地形图上。成图效果如图1 所示。
图1 按设计水位修正后水边线及水边高程点
在测量内业成图阶段,所有高程点的高程都是水准高。通常,等深线的绘制是在等高线图完成之后,用于绘制等深线的原始数据如图2 所示。
图2中,河道中的高程点不能直接用于绘制等深线,需要根据水边线高程做水深计算。
为了方便计算,需要把河道中的高程点用Cass 的“高程点生成数据文件功能”导出为*.dat 文件,也可以把所有地形点全导出,后续在程序中做水下点筛选。
程序设计思路为:首先使用“SSJS(水深计算)”命令启动程序,交互选择水边高程点,程序会自动读取高程点并构建水面曲面;其次读取水下高程点数据,程序自动用曲面内插计算出高程点对应水面高;最后通过内部设定的水深阈值,去掉地面高程点,即得到纯净的水深点,然后将水深点输出成.dat 文件。
程序运行流程如图3 所示。
图3 程序运行流程图
成果文件为.dat 格式,测绘人员可直接用Cass 加载并进行等深线的绘制。
水边线高程点内插加密需要基于测量时的水尺水位高、实测水边线和设计水位线,最后形成图1 中的水边高程点,水边高程点需要均匀分布以确保后续构建的水面曲面足够精确。
2.2.1 软件基础
Civil 3D 提供了3 种API,分别是.NET API、COM API 和C++[5],其中.NET 语言中的C#语言开发难度是相对较小的,而且有良好的开发支持。
2.2.2 开发环境配置
启动Visual Studio 2019,选择“创建新项目”,选择“类库(.NET Framework)”,然后框架选择“.NET Framework4.6”;添加accoremgd.dll、acdbmgd.dll、acmgd.dll、AecBaseMgd.dll 和AeccDbMgd.dll 程序集的引用,并将程序集的“复制本地”属性改为“false”(图4)。
图4 引用程序集
为了便于数据管理,在新建水面曲面时应该为其新建图层,然后选择高程点对象添加到曲面中。
2.3.1 新建图层
1)获取当前文档和数据库,并创建事务。
2)获取图层表,判断是否存在“0-Terrain”图层,如果不存在,则新建“0-Terrain”图层,并将其设置为当前图层,如果存在,则将“0-Terrain”图层设置为当前图层。
2.3.2 创建空曲面
创建曲面是利用Autodesk.Civil.DatabaseServices中的TinSurface 类,首先用TinSurface 的Create 方法创建一个空曲面ID,然后强制转换为三角网曲面对象。
2.3.3 拾取水边高程点
水边线高程点应为Cass 软件生成的高程点块,提取高程点前需要定义一个过滤条件用于筛选高程点。
然后用Editor 类提供的方法提取高程点对象,创建对象ID 集合。
2.3.4 添加高程点到曲面
接用TinSurface 的DrawingObjectsDefinition 属性的AddFromBlocks 方法将高程点添加到空曲面中。
利用TinSurface 对象的FindElevationAtXY 方法可以查找指定坐标处的高程值。
2.5.1 读取高程点文件
读取高程点调用了系统File 类中的ReadAllLines方法,将读取的行数据分别拆分存到指定变量。
2.5.2 计算点位设计水深
水深=水面高程-水下高程点水准高程。
利用该计算关系,循环遍历计算所有水下高程点对应的设计水深。
2.5.3 导出水深点文件
调用系统提供的StreamWriter 方法即可完成水深文本文件输出。
某项目平面图如图5 所示,项目全长约14.5 km,水边高程点685 个,共有5 754 个地形点(含水下高程点),高程点的格式为点名、编码、东坐标、北坐标(图6),经测试转换生成全部水下高程点用时约3.2 s(图7)。
图6 项目A 原始数据和成果数据示例
图7 项目B 程序计算花费时间
水下高程点转设计水深是一项十分简单的工作,但是如果不掌握科学的数据处理方法,简单工作将会变成一项任务繁重的体力活。Civil 3D 是一款强大的土木设计类软件,拥有完善的开发环境。C#是一门相对容易上手的编程语言,得益于编程软件Visual Studio 的强大提示功能,可以帮助初级编程人员补全大量代码。两者的结合则催生出了各种功能强大的插件,基于这些插件,可以将广大一线生产人员从大量重复繁琐的工作中解放出来。
在使用过程中做过的最长的某项目长度超过78 km,总地形点超过10 万个点,在水边高程点图形文件和所有地形点文本文件准备好的情况下,只用了不到10 s 的时间即可完成水深点文本文件的生成。如果用人工手动分段计算的话,项目上下游高差54 m,即使按每20 cm 分段需要分250 段,假如每段高程点提取转换需要2 min,则一个人所需花费的时间预计超过8 h,而实际上,一个人手动做这些数据转换可能得花费2~3 d 时间。
所以,基于Civil 3D 的开发的确能带来巨大的生产效率的提升,从上述论述也可以看到,Civil 3D 的初级开发不难,如果能善用二次开发,一定能为工作生产带来巨大的经济效益。