歐陽平
(漳州市測繪設計研究院,福建 漳州 363000)
現(xiàn)代經(jīng)濟發(fā)展迅速,舊有道路標準已經(jīng)不能適應現(xiàn)代交通、物流的需要,新修道路及舊有道路的更新都需要測繪提供準確的道路縱橫斷面數(shù)據(jù),而不同道路設計軟件所要求的縱橫斷面數(shù)據(jù)格式不一。南方CASS一類常用測圖軟件并不能直接生成常用道路設計軟件所需格式斷面數(shù)據(jù)。道路橫斷面高程點很多,純手工編輯道路設計所需斷面數(shù)據(jù),工作量大且容易出錯。本文以常用的緯地道路輔助設計系統(tǒng)(HintCAD)所要求的橫斷面數(shù)據(jù)格式為例(縱斷面比較簡單,在此不與描述),利用AutoCAD的VBA編程語言進行二次開發(fā)來實現(xiàn)半自動提取高程點及平距,使得工作起來事半功倍,準確快捷[1]。
在實際工作中,我們需要測繪出道路各個橫斷面上的實際高程,沿道路中心線的里程增加方向,左側高程點到中樁點的平距(通過兩點的坐標反算得到[2])為負,右側高程點到中樁點的平距為正,并按照從左到右的順序依次排序,將高程點高程及相應平距輸入到表格中,一個橫斷面為一行,格式如表1橫斷面高程表(緯地道路輔助設計系統(tǒng)要求格式之一)所示。為了方便闡述程序的編寫過程,將分為以下幾個步驟分別說明:
(1)讀取一個中樁號,并在圖上點選中樁位置的高程點;
(2)框選左側橫斷面上的高程點,并根據(jù)距中樁點的位置遠近進行降序,并在距離值前加上負號;
(3)框選右側橫斷面上的高程點,并根據(jù)距中樁點的位置遠近進行升序排列,將成果依次輸入Excel表格中,如表1所示。
橫斷面高程表 表1
首先在啟動程序之后自動加載菜單,其界面如圖1所示。點選道路橫斷面高程點提取子菜單后,彈出圖2窗口,設置好成果保存路徑,即可進行高程點提取工作。
圖1 菜單界面
圖2 主程序界面
主程序運行流程如圖3所示:
圖3 主程序運行流程圖
AutoCAD二次開發(fā)語言有VBA、LISP以及Object-ARX等,VBA及其環(huán)境易于學習和使用,它是一個面向對象的編程環(huán)境,提供了豐富的開發(fā)工程。VBA工程可以是獨立的,也可以嵌入到圖形中,為開發(fā)人員提供了非常靈活的方式來發(fā)布程序[3],下面給出本程序的部分VBA源代碼。
(1)選擇高程點并將結果寫入Excel中[4]
Set sSet = ThisDrawing.Application.ActiveDocument.SelectionSets.Add("GCDZDM")
dxf_code(0) = 2: dxf_value(0) = "GC200"
ThisDrawing.Application.ActiveDocument.Utility.Prompt ("請選擇左邊的高程點:" & vbCr)
sSet.SelectOnScreen dxf_code,dxf_value
If sSet.Count > 0 Then
ReDim DISTANDGCD(sSet.Count - 1,1)
numofssetcount = sSet.Count
End If
i = 0
For Each objEnt In sSet
xyz(0) = objEnt.InsertionPoint(0)
xyz(1) = objEnt.InsertionPoint(1)
xyz(2) = objEnt.InsertionPoint(2)
DISTANDGCD(i,0) = dist(pointMid,xyz)
DISTANDGCD(i,1) = xyz(2)
i = i + 1
Next
'對數(shù)組排序
Call QuickSortDecend (DISTANDGCD(),0,sSet.Count - 1)
'將數(shù)組寫進excel中
xlsheet.Cells(num,1) = strlicheng
xlsheet.Cells(num,2) = pointMid(2)
For i = 0 To sSet.Count - 1
xlsheet.Cells(num,2 * i + 3) = -DISTANDGCD(i,0)
xlsheet.Cells(num,2 * i + 4) = DISTANDGCD(i,1)
Next
sSet.Delete
(2)對平距進行降序排列函數(shù)[5]
Sub QuickSortDecend(MyArray() As Variant,L,R)
Dim i As Integer,j As Integer,X As Single,Y As Single,M As Single
i = L
j = R
'找出數(shù)組的中點
M = MyArray((L + R) / 2,0)
While (i <= j)
'找出比中點大的數(shù)
While (MyArray(i,0) > M And i < R)
i = i + 1
Wend
'找出比中點小的數(shù)
While (M > MyArray(j,0) And j > L)
j = j - 1
Wend
'互換這兩個數(shù)
If (i <= j) Then
X = MyArray(i,0)
Y = MyArray(i,1)
MyArray(i,0) = MyArray(j,0)
MyArray(i,1) = MyArray(j,1)
MyArray(j,0) = X
MyArray(j,1) = Y
i = i + 1
j = j - 1
End If
Wend
'未完成時遞歸調用
If (L < j) Then Call QuickSortDecend(MyArray(),L,j)
If (i < R) Then Call QuickSortDecend(MyArray(),i,R)
End Sub
圖4為某古城內道路改造工程現(xiàn)有道路實測橫斷面高程圖(部分),此圖不能被緯地道路輔助設計系統(tǒng)直接讀取、使用,需把實測高程點轉換為其自定義格式Excel表后讀取使用。
圖4 橫斷面高程圖
運行本程序后橫斷面高程點轉換為表2。
橫斷面高程表(成果) 表2
(1)本插件在本院多條道路改造項目的原始橫斷面數(shù)據(jù)提取中投入使用,節(jié)省了時間及人力,取得了一定的經(jīng)濟效益。
(2)本插件運行仍需手工輸入道路設計里程,選取斷面高程點,后期優(yōu)化方向是自動識別里程,讀取高程點,判斷道路方向及平距的正負。
(3)本插件僅僅針對緯地道路輔助設計系統(tǒng)讀取原始地面橫斷面使用,針對不同軟件需進行調整,輸出不同格式。
[1] 李文柱. AutoCAD VBA二次開發(fā)在道路橫斷面數(shù)據(jù)處理中的應用[J]. 城市勘測,2008(3):127~129.
[2] 吳獻豐. 道路橫斷面文件自動生成程序開發(fā)與實現(xiàn)[J]. 城市勘測,2013(3):150~151,154.
[3] 劉軍,王小維. 基于AutoCAD地形高程基準轉化程序設計[J]. 城市勘測,2015(1):116~118.
[4] 潘瑜. Visual Basic程序設計[M]. 北京:科學出版社,2006.
[5] 高春艷,李俊民,劉彬彬. Visual Basic應用開發(fā)完全手冊[M]. 北京:人民郵電出版社,2006.