肖 怡
(四川省交通勘察設計研究院有限公司,四川成都 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 的初級開發不難,如果能善用二次開發,一定能為工作生產帶來巨大的經濟效益。