簡(jiǎn)介: VBA作為一個(gè)集成的開發(fā)環(huán)境,能夠使AutoCAD數(shù)據(jù)與其它的VBA應(yīng)用程序,如Microsoft Excel,直接共享,實(shí)現(xiàn)無縫連接,交換數(shù)據(jù)。本文介紹如何利用VBA編程建立AutoCAD2000與Excel2000的通信,實(shí)現(xiàn)數(shù)據(jù)交換,快速繪制公路縱斷面地面線。
關(guān)鍵字:公路縱斷面設(shè)計(jì) 地面線 VBA AutoCAD與Excel的通信
1 前言
縱斷面設(shè)計(jì)圖是道路縱斷面設(shè)計(jì)的主要成果,也是道路設(shè)計(jì)的重要技術(shù)文件之一。在縱斷面設(shè)計(jì)圖上有兩條主要的線:一條是地面線,它是根據(jù)中線上各樁點(diǎn)的高程而點(diǎn)繪的一條不規(guī)則的折線,反映了沿著中線地面的起伏變化;另一條是設(shè)計(jì)線,它是經(jīng)過技術(shù)上、經(jīng)濟(jì)上以及美學(xué)上等多方面比較后定出的一條規(guī)則形狀的幾何線。
公路設(shè)計(jì)中,在沒有專業(yè)設(shè)計(jì)軟件輔助的情況下,繪制公路縱斷面圖是很繁瑣的事,需要進(jìn)行大量的、重復(fù)的操作,既勞神,又容易出錯(cuò)。特別在公路外業(yè)勘測(cè)階段,需要在短時(shí)間內(nèi)將所測(cè)量的中樁高程轉(zhuǎn)化成縱斷面圖上的地面線,才可以進(jìn)行路線縱坡設(shè)計(jì),分析測(cè)量成果(選線)是否合理。
如何快速繪制公路縱斷面地面線呢?答案是:利用Microsoft Excel、AutoCAD都提供的VBA功能,編制程序進(jìn)行繪制,即把Microsoft Excel表格中的樁號(hào)、地面高程等信息讀取出來,在AutoCAD文件里以文字、線條的方式寫出來,就可繪出中樁地面線。
2 VBA簡(jiǎn)介
Visual Basic for Application(VBA)是Microsoft面向最終用戶的應(yīng)用軟件編程語言。它最早出現(xiàn)于Microsoft的Excel和Project中,如今VBA已成為VB和所有Office產(chǎn)品的組件。常用的繪圖軟件AutoCAD也已支持VBA作為二次開發(fā)工具。
VBA最大特點(diǎn)和最大優(yōu)點(diǎn)是利用面向?qū)ο螅∣OP)的ActiveX Automation技術(shù),使語言的引擎在技術(shù)上與開發(fā)環(huán)境分離。它的功能在很大程度上依賴于它的客戶顯露的Automation接口。同時(shí),由于VBA是基于ActiveX Automation技術(shù),它可以使用任何Automation技術(shù)的應(yīng)用程序共同工作。
基于AutoCAD的VBA應(yīng)用程序就是高級(jí)程序語言的計(jì)算功能與AutoCAD的繪圖功能結(jié)合,使用VBA程序語句來控制對(duì)AutoCAD圖形的操作。
VBA作為一個(gè)集成的開發(fā)環(huán)境,它提供了高質(zhì)量的用戶化編程能力,能夠使AutoCAD數(shù)據(jù)與其它的VBA應(yīng)用程序,如Microsoft Excel軟件,直接共享,實(shí)現(xiàn)無縫連接,交換數(shù)據(jù)非常方便。
3 工作機(jī)理分析
在Microsoft Excel中,與表對(duì)應(yīng)的對(duì)象是工作表(Sheet或Worksheet),與每一個(gè)表格方格對(duì)應(yīng)的對(duì)象是單元格區(qū)域(range),它可以僅包括一個(gè)單元格(cell),也可以由多個(gè)單元格合并而成。工作表對(duì)象中的cells屬性,在單元格的選擇方面可以達(dá)到與range相同的效果,它是以行(row)和列(gol)作為參數(shù)的,對(duì)于行和列的選擇可以采用變量的形式。在本例中,可設(shè)定工作表(Worksheet)的每一行第一列(cells(i,1))為中樁樁號(hào),每一行第二列(cells(i,2))為對(duì)應(yīng)的地面高程。
在AutoCAD中,沒有與表對(duì)應(yīng)的對(duì)象,但可以根據(jù)表中前后樁號(hào)定義水平距離,根據(jù)地面高程定義垂直距離,將表中數(shù)據(jù)理解為線條與文字對(duì)象的集合。這樣,通過讀取Microsoft Excel文件中的最小對(duì)象—單元格區(qū)域(cells(i,j))的主要信息,利用VBA建立AutoCAD與Excel的通信,然后在AutoCAD文件里指定的圖層、位置畫線條,書寫文字。通過循環(huán),遍歷所有單元格區(qū)域(cells(i,j)),邊讀邊寫,最終完成縱斷面地面線的繪制及樁號(hào)、地面高程的書寫。
4 具體實(shí)現(xiàn)方法
4.1 在AutoCAD中創(chuàng)建Excel應(yīng)用程序
要編寫存取Excel的應(yīng)用程序,必須通過VBA將Excel中的對(duì)象能夠讓用戶使用,這就需要參考 Excel對(duì)象的數(shù)據(jù)庫。其步驟如下:
4.1.1 打開AutoCAD的VBA編輯器(命令:VBAIDE);
4.1.2 選擇“工具”\“引用”項(xiàng),在彈出的“引用”對(duì)話框的“可使用的引用”列表框內(nèi),選擇“Microsoft Excel 8.0 Object Library”項(xiàng);
4.1.3 單擊“確定”按鈕;
4.1.4 接下來使用下列代碼可創(chuàng)建完整的應(yīng)用程序?qū)ο髮?shí)例:
Dim Excel As Excel.Application
'激活要與之通信的Excel應(yīng)用程序
On Error Resume Next
Set Excel = GetObject(, "Excel.Application")
If Err <> 0 Then
Set Excel = CreateObject("Excel.Application")
End If
4.2 讀入坐標(biāo)點(diǎn)畫地面線
4.2.1 設(shè)定工作表(Worksheet)的每一行第一列(cells(i,1))為中樁樁號(hào),每一行第二列(cells(i,2))為對(duì)應(yīng)的地面高程。由于公路路線縱斷面圖水平方向比例為1:2000,垂直方向比例為1:200,故讀入時(shí),y坐標(biāo)應(yīng)乘以10倍。
4.2.2 以(0,0,0)為原點(diǎn),以樁號(hào)里程為x坐標(biāo),以10倍所對(duì)應(yīng)的地面高程為y坐標(biāo),0為z坐標(biāo),定義某一樁號(hào)對(duì)應(yīng)的地面點(diǎn)坐標(biāo);然后循環(huán)讀取各里程樁號(hào)數(shù)據(jù)信息,定義各樁號(hào)所對(duì)應(yīng)的地面點(diǎn)坐標(biāo);最后以直線段連接各地面點(diǎn)坐標(biāo),則為地面線。
4.2.3 下述代碼可讀入Excel數(shù)據(jù)信息畫地面線
Dim i As Integer
Dim lineobj As AcadLine
Dim sPnt(0 To 2) As Double
Dim ePnt(0 To 2) As Double
‘讀入坐標(biāo)畫地面線
Worksheets("sheet1").Activate
i = 3 ‘由第三行起
Do Until cells(i, 1).Value = ""
If cells(i + 1, 1) = 0 Then
Exit Do
End If
sPnt(0) = cells(i, 1).Value
sPnt(1) = 10 * cells(i, 2).Value
sPnt(2) = 0
ePnt(0) = cells(i + 1, 1).Value
ePnt(1) = 10 * cells(i + 1, 2).Value
ePnt(2) = 0
Set lineobj = ThisDrawing.ModelSpace.AddLine(sPnt, ePnt)
i = i + 1
Loop
4.3 樁號(hào)及高程的寫入
4.3.1 定義文字的插入位置 以樁號(hào)里程為x坐標(biāo),0為y坐標(biāo),0為z坐標(biāo),確定文字的插入點(diǎn)。
4.3.2 以單行文字形式創(chuàng)建樁號(hào)及高程文字,定義文字的格式、字體、高度、傾斜角度。插入后的文字應(yīng)逆時(shí)針旋轉(zhuǎn)90度。
4.4 輔助網(wǎng)格線的繪制
4.4.1 輔助網(wǎng)格線能較為直觀地表示樁號(hào)及地面高程的對(duì)應(yīng)關(guān)系,有助于縱坡設(shè)計(jì);
4.4.2 以樁號(hào)里程為x坐標(biāo),0為y坐標(biāo),0為z坐標(biāo),確定網(wǎng)格線第一點(diǎn);以樁號(hào)里程為x坐標(biāo),10倍所對(duì)應(yīng)的地面高程為y坐標(biāo),0為z坐標(biāo),確定網(wǎng)格線第二點(diǎn);兩點(diǎn)連線,則為網(wǎng)格線。
5 實(shí)例
5.1 運(yùn)行AutoCAD2000程序;
5.2 打開AutoCAD的VBA編輯器(命令:VBAIDE);
5.3 創(chuàng)建成下面的過程及代碼,并運(yùn)行之:
Sub ZDM()
Dim Excel As Excel.Application
Dim ExcelSheet As Object
Dim ExcelWorkbook As Object
Dim i As Integer
Dim lineobj As AcadLine
Dim klineobj As AcadLine
Dim sPnt(0 To 2) As Double
Dim ePnt(0 To 2) As Double
Dim kPnt(0 To 2) As Double
Dim hPnt(0 To 2) As Double
Dim ksPnt(0 To 2) As Double
Dim kePnt(0 To 2) As Double
Dim dmPnt(0 To 2) As Double
Dim textObj As AcadText
Dim txtStr As String
Dim insPnt As Variant
Dim txtHeight As Double
Dim layObj As AcadLayer
Dim newLayer As AcadLayer
Set layObj = ThisDrawing.Layers.Add("標(biāo)注")
Set layObj = ThisDrawing.Layers.Add("地面線")
Set layObj = ThisDrawing.Layers.Add("網(wǎng)格線")
Dim atTxtobj As AcadTextStyle
Set atTxtobj = ThisDrawing.ActiveTextStyle
atTxtobj.fontFile = "c:\windows\fonts\simfang.ttf"
'創(chuàng)建Excel應(yīng)用程序
On Error Resume Next
Set Excel = GetObject(, "Excel.Application")
If Err <> 0 Then
Set Excel = CreateObject("Excel.Application")
End If
'打開Excel表
ExcelName = InputBox("路徑:")
Excel.Workbooks.Open ExcelName
'表格不可見
Excel.Visible = False
'讀入坐標(biāo)點(diǎn)畫地面線
Worksheets("sheet1").Activate
i = 3
Do Until cells(i, 1).Value = ""
If cells(i + 1, 1) = 0 Then
Exit Do
End If
sPnt(0) = cells(i, 1).Value
sPnt(1) = 10 * cells(i, 2).Value
sPnt(2) = 0
ePnt(0) = cells(i + 1, 1).Value
ePnt(1) = 10 * cells(i + 1, 2).Value
ePnt(2) = 0
Set newLayer = ThisDrawing.Layers("地面線")
ThisDrawing.ActiveLayer = newLayer
newLayer.Color = acWhite
Set lineobj = ThisDrawing.ModelSpace.AddLine(sPnt, ePnt)
If cells(i, 2) = "" Then lineobj.Delete
i = i + 1
Loop
'畫輔助網(wǎng)格線及插入數(shù)據(jù)
i = 3
Do Until cells(i, 1).Value = ""
'畫輔助網(wǎng)格線
ksPnt(0) = cells(i, 1).Value: ksPnt(1) = 0: ksPnt(2) = 0
kePnt(0) = cells(i, 1).Value: kePnt(1) = 10 * cells(i, 2).Value: kePnt(2) = 0
dmPnt(0) = cells(i, 1).Value: dmPnt(1) = 48: dmPnt(2) = 0
Set newLayer = ThisDrawing.Layers("網(wǎng)格線")
ThisDrawing.ActiveLayer = newLayer
newLayer.Color = acGreen
Set klineobj = ThisDrawing.ModelSpace.AddLine(ksPnt, kePnt)
'插入樁號(hào)
Set newLayer = ThisDrawing.Layers("標(biāo)注")
ThisDrawing.ActiveLayer = newLayer
newLayer.Color = acCyan
a = cells(i, 1).Value
b = Int(a / 1000)
c = Format((a - b * 1000), "000.000")
'd = a - Int(a)
E = "+" + Format(c, "000.000")
If c = 0 Then E = "K" + LTrim(Str(b))
txtStr = E
txtHeight = 4
textObj.Rotation = 3.14159 / 2
insPnt = ksPnt
Set textObj = ThisDrawing.ModelSpace.AddText(txtStr, insPnt, txtHeight)
If cells(i, 2) = "" Then textObj.Delete
'插入地面高程
txtStr = Format(cells(i, 2).Value, "###0.##0")
txtHeight = 4
textObj.Rotation = 3.14159 / 2
insPnt = dmPnt
Set textObj = ThisDrawing.ModelSpace.AddText(txtStr, insPnt, txtHeight)
i = i + 1
Loop
ZoomAll
'該語句用來等待查看顯示結(jié)果
MsgBox "按‘確定’鍵將關(guān)閉Excel的運(yùn)行!"
'保存?zhèn)鬟^來的數(shù)據(jù)
ExcelWorkbook.Close
ExcelWorkbook.Save
'關(guān)閉Excel應(yīng)用程序
Excel.Application.Quit
'刪除Excel應(yīng)用程序?qū)嵗?/p>
Set Excel = Nothing
End Sub
5.4 運(yùn)行上述代碼后,將會(huì)彈出窗口,提示輸入Excel文件的路徑;輸入后回車,就可以生成縱斷面地面線,可以進(jìn)行路線縱坡設(shè)計(jì)。
5.5 本程序需要Microsoft Excel 2000和AutoCAD2000運(yùn)行環(huán)境,編譯后通過。
6 結(jié)束語
6.1 在經(jīng)過綜合分析、反復(fù)比較定出設(shè)計(jì)縱坡之后,可以確定各變坡點(diǎn)及其高程、豎曲線要素。在上述代碼中,加入合適的詞句,可以完整地繪制公路縱斷面設(shè)計(jì)圖。
6.2 公路工程設(shè)計(jì)中,經(jīng)常遇到許多類似的大量的、重復(fù)的、有邏輯性的操作,只要合理利用VBA,發(fā)揮其強(qiáng)大的功能,實(shí)現(xiàn)AutoCAD與Excel應(yīng)用程序的無縫連接,快速交換數(shù)據(jù),就可以在短時(shí)間內(nèi)完成所需的設(shè)計(jì)工作,達(dá)到事半功倍的效果。