肖 怡
(四川省交通勘察設(shè)計研究院有限公司,四川成都 610017)
在航道整治項目中,設(shè)計水深是設(shè)計人員經(jīng)常需要用到的數(shù)據(jù),這就要求測量人員根據(jù)設(shè)計水位將水下地形點換算成設(shè)計水深點[1]。由于江河等流域是存在上下游比降的,所以在處理水深點轉(zhuǎn)換時不能用單一水面高減去水下高程點來計算水深。目前,很多測量人員都是根據(jù)水位比降[2]分段做水深改正,在航道長度長,水位比降大時,數(shù)據(jù)處理工作極其枯燥繁瑣且耗時。
AutoCAD Civil 3D 是由Autodesk 公司推出的一款的建筑信息模型(BIM)設(shè)計軟件。為用戶提供強大的測量、設(shè)計、分析與文檔處理解決方案。作為一款強大的平臺軟件,其提供的地形曲面數(shù)據(jù)處理功能對于一線測繪人員十分有用。對于有一定編程經(jīng)驗的測繪人員來說,可以通過Civil 3D 提供的API,用C# 語言對其進(jìn)行二次開發(fā)。本文就介紹了Civil 3D 是如何用C# 二次開發(fā)解決設(shè)計水深點轉(zhuǎn)換工作。
Civil 3D 曲面是由三角網(wǎng)構(gòu)成的,可以用于表達(dá)地形、道路、河流等地形特征。Civil 3D 能真實計算出挖填方的工程量,而且還可以進(jìn)行挖填平衡的自動調(diào)整[3]。在Civil 3D 中,曲面的創(chuàng)建有多種方法,其中最常用的是根據(jù)等高線和圖形對象創(chuàng)建。創(chuàng)建好的曲面對象提供了曲面編輯、查詢及分析功能。其中,編輯功能允許用戶對曲面三角網(wǎng)或者點進(jìn)行添加、刪除、移動等操作;查詢功能支持用戶查詢曲面上的數(shù)據(jù),如高點程、距離、面積等;分析功能支持對曲面進(jìn)行分析,如計算曲面面積、體積等。
在本程序中,主要是對曲面創(chuàng)建和任意高程點查詢的應(yīng)用。通過用調(diào)整后的設(shè)計水邊線創(chuàng)建水面曲面,然后對水下高程點進(jìn)行水面高程查詢,最后,利用水面高程與水底高程求差計算出真實水深。
水邊線高程點是指在根據(jù)水尺記錄數(shù)據(jù)和設(shè)計水位對水邊線進(jìn)行修正后,在水邊線上根據(jù)水位變化合理地插值出高程點[4],并用Cass 展繪到水邊線地形圖上。成圖效果如圖1 所示。
圖1 按設(shè)計水位修正后水邊線及水邊高程點
在測量內(nèi)業(yè)成圖階段,所有高程點的高程都是水準(zhǔn)高。通常,等深線的繪制是在等高線圖完成之后,用于繪制等深線的原始數(shù)據(jù)如圖2 所示。
圖2中,河道中的高程點不能直接用于繪制等深線,需要根據(jù)水邊線高程做水深計算。
為了方便計算,需要把河道中的高程點用Cass 的“高程點生成數(shù)據(jù)文件功能”導(dǎo)出為*.dat 文件,也可以把所有地形點全導(dǎo)出,后續(xù)在程序中做水下點篩選。
程序設(shè)計思路為:首先使用“SSJS(水深計算)”命令啟動程序,交互選擇水邊高程點,程序會自動讀取高程點并構(gòu)建水面曲面;其次讀取水下高程點數(shù)據(jù),程序自動用曲面內(nèi)插計算出高程點對應(yīng)水面高;最后通過內(nèi)部設(shè)定的水深閾值,去掉地面高程點,即得到純凈的水深點,然后將水深點輸出成.dat 文件。
程序運行流程如圖3 所示。
圖3 程序運行流程圖
成果文件為.dat 格式,測繪人員可直接用Cass 加載并進(jìn)行等深線的繪制。
水邊線高程點內(nèi)插加密需要基于測量時的水尺水位高、實測水邊線和設(shè)計水位線,最后形成圖1 中的水邊高程點,水邊高程點需要均勻分布以確保后續(xù)構(gòu)建的水面曲面足夠精確。
2.2.1 軟件基礎(chǔ)
Civil 3D 提供了3 種API,分別是.NET API、COM API 和C++[5],其中.NET 語言中的C#語言開發(fā)難度是相對較小的,而且有良好的開發(fā)支持。
2.2.2 開發(fā)環(huán)境配置
啟動Visual Studio 2019,選擇“創(chuàng)建新項目”,選擇“類庫(.NET Framework)”,然后框架選擇“.NET Framework4.6”;添加accoremgd.dll、acdbmgd.dll、acmgd.dll、AecBaseMgd.dll 和AeccDbMgd.dll 程序集的引用,并將程序集的“復(fù)制本地”屬性改為“false”(圖4)。
圖4 引用程序集
為了便于數(shù)據(jù)管理,在新建水面曲面時應(yīng)該為其新建圖層,然后選擇高程點對象添加到曲面中。
2.3.1 新建圖層
1)獲取當(dāng)前文檔和數(shù)據(jù)庫,并創(chuàng)建事務(wù)。
2)獲取圖層表,判斷是否存在“0-Terrain”圖層,如果不存在,則新建“0-Terrain”圖層,并將其設(shè)置為當(dāng)前圖層,如果存在,則將“0-Terrain”圖層設(shè)置為當(dāng)前圖層。
2.3.2 創(chuàng)建空曲面
創(chuàng)建曲面是利用Autodesk.Civil.DatabaseServices中的TinSurface 類,首先用TinSurface 的Create 方法創(chuàng)建一個空曲面ID,然后強制轉(zhuǎn)換為三角網(wǎng)曲面對象。
2.3.3 拾取水邊高程點
水邊線高程點應(yīng)為Cass 軟件生成的高程點塊,提取高程點前需要定義一個過濾條件用于篩選高程點。
然后用Editor 類提供的方法提取高程點對象,創(chuàng)建對象ID 集合。
2.3.4 添加高程點到曲面
接用TinSurface 的DrawingObjectsDefinition 屬性的AddFromBlocks 方法將高程點添加到空曲面中。
利用TinSurface 對象的FindElevationAtXY 方法可以查找指定坐標(biāo)處的高程值。
2.5.1 讀取高程點文件
讀取高程點調(diào)用了系統(tǒng)File 類中的ReadAllLines方法,將讀取的行數(shù)據(jù)分別拆分存到指定變量。
2.5.2 計算點位設(shè)計水深
水深=水面高程-水下高程點水準(zhǔn)高程。
利用該計算關(guān)系,循環(huán)遍歷計算所有水下高程點對應(yīng)的設(shè)計水深。
2.5.3 導(dǎo)出水深點文件
調(diào)用系統(tǒng)提供的StreamWriter 方法即可完成水深文本文件輸出。
某項目平面圖如圖5 所示,項目全長約14.5 km,水邊高程點685 個,共有5 754 個地形點(含水下高程點),高程點的格式為點名、編碼、東坐標(biāo)、北坐標(biāo)(圖6),經(jīng)測試轉(zhuǎn)換生成全部水下高程點用時約3.2 s(圖7)。
圖6 項目A 原始數(shù)據(jù)和成果數(shù)據(jù)示例
圖7 項目B 程序計算花費時間
水下高程點轉(zhuǎn)設(shè)計水深是一項十分簡單的工作,但是如果不掌握科學(xué)的數(shù)據(jù)處理方法,簡單工作將會變成一項任務(wù)繁重的體力活。Civil 3D 是一款強大的土木設(shè)計類軟件,擁有完善的開發(fā)環(huán)境。C#是一門相對容易上手的編程語言,得益于編程軟件Visual Studio 的強大提示功能,可以幫助初級編程人員補全大量代碼。兩者的結(jié)合則催生出了各種功能強大的插件,基于這些插件,可以將廣大一線生產(chǎn)人員從大量重復(fù)繁瑣的工作中解放出來。
在使用過程中做過的最長的某項目長度超過78 km,總地形點超過10 萬個點,在水邊高程點圖形文件和所有地形點文本文件準(zhǔn)備好的情況下,只用了不到10 s 的時間即可完成水深點文本文件的生成。如果用人工手動分段計算的話,項目上下游高差54 m,即使按每20 cm 分段需要分250 段,假如每段高程點提取轉(zhuǎn)換需要2 min,則一個人所需花費的時間預(yù)計超過8 h,而實際上,一個人手動做這些數(shù)據(jù)轉(zhuǎn)換可能得花費2~3 d 時間。
所以,基于Civil 3D 的開發(fā)的確能帶來巨大的生產(chǎn)效率的提升,從上述論述也可以看到,Civil 3D 的初級開發(fā)不難,如果能善用二次開發(fā),一定能為工作生產(chǎn)帶來巨大的經(jīng)濟(jì)效益。