邱榮茂, 王大鳴, 張 濤, 張德瑩
(1. 石家莊鐵道學院土木工程分院,河北 石家莊 050043; 2. 石家莊鐵道學院機械工程分院,河北 石家莊 050043; 3. 同濟大學土木工程學院建筑工程系虛擬建筑教研室,上海 200092)
線路縱斷面圖包括圖樣和資料表兩部分,圖樣包括地面縱斷面線、設(shè)計路肩線以及橋涵、隧道、車站、水準點等構(gòu)造物的標識等內(nèi)容;資料表包括線路平面、里程樁號、地面高程、設(shè)計坡度、路肩高程、工程地質(zhì)特征等[1-2]。圖1 是某鐵路線路的一段縱斷面圖。
由于線路縱斷面圖包含的內(nèi)容較多,手工繪圖或者直接用AutoCAD 命令逐步繪制的效率很低,工作量極大,需要進行大量繁復的操作,非常容易出錯,而且繪圖精度不高。本文介紹利用VBA 對AutoCAD 進行自主定制,從而實現(xiàn)自動繪制線路縱斷面圖的方法。
圖1 線路縱斷面圖實例
線路縱斷面圖是線路設(shè)計的最終成果,在縱斷面設(shè)計過程中已經(jīng)得到了有關(guān)的設(shè)計數(shù)據(jù),例如,不同里程的地面高程、路肩高程、設(shè)計坡度以及橋、涵等構(gòu)筑物的結(jié)構(gòu)類型等,所有這些設(shè)計數(shù)據(jù)都與里程有關(guān)。從便于對數(shù)據(jù)進行處理的角度出發(fā),可將縱斷面圖的設(shè)計數(shù)據(jù)組織成以里程為主數(shù)據(jù)的Excel 數(shù)據(jù)表。以圖1 為例,可以組織成下面的4 個表(表1~表4)。
在表3 中,第六列是根據(jù)橋涵的不同類型創(chuàng)建的帶有屬性的圖塊的塊名,第四列表示橋涵的結(jié)構(gòu)類型。對于大中橋有可能采用兩種不同類型的梁,此時第四列為梁一的類型特征,第五列為梁二的類型特征;若只有一種梁,則第五列為空。
表1 里程-地面高程、路肩高程
表2 里程-設(shè)計坡度
表3 里程-橋涵
表4 里程-平面曲線
進入VBA 集成開發(fā)環(huán)境,選擇“工具”→“引用”菜單項,打開如圖2 所示的對話框,鉤選Microsoft Excel 11.0 Object Library(Excel 類型庫,其版本與計算機上安裝的Office 版本有關(guān),11.0 是Office 2003 對應(yīng)的版本)、Microsoft Visual Basic for Applications Extensibility 5.3(VBA 類型庫)兩項。
在引用了Excel 和VBA 類型庫后,就可以編寫VBA 代碼對Excel 數(shù)據(jù)表進行訪問。
首先聲明一個指定類ID 的對象變量,并用CreateObject 函數(shù)創(chuàng)建下面Microsoft Excel 引用:
在 CreateObject 函數(shù)創(chuàng)建并返回一個對Microsoft Excel 對象的引用后,可以用集合Workbooks 的Open 方法打開一個Excel 文檔,其位置就是Excel 數(shù)據(jù)表所在位置。例如,在上面創(chuàng)建Microsoft Excel 引用后欲打開絕對路徑為“F:數(shù)據(jù)匯總.xls”的工作簿文件(假設(shè)該文件中包含上述4 個Excel 數(shù)據(jù)表),可以運用下面的語句:
ExcelApp.Workbooks.Open “F: 數(shù) 據(jù) 匯總.xls”
圖2 引用Excel 類型庫和VBA IDE 類型庫
要訪問已經(jīng)打開的工作簿中的工作表可以使用工作簿的Sheets 屬性,例如下面代碼將打開當前活動工作簿“F:數(shù)據(jù)匯總.xls”中名為“里程-地面高程、路肩高程”的工作表,并賦予對象變量ExcelSheet:
Dim ExcelSheet As Excel.Worksheet
Set ExcelSheet = ExcelApp.ActiveWorkbook. Sheets("里程-地面高程、路肩高程")
最后用ExcelSheet 的Cells 屬性從打開的工作表中讀取指定的單元格的數(shù)據(jù)。例如:
ExcelSheet.Cells(i, j).value 可獲得Excel 的“里程-地面高程、路肩高程”表第i 行第j 列的單元格的值。利用讀出的數(shù)據(jù),AutoCAD 就可以在繪圖窗口中繪圖。
線路縱斷面圖的上半部為線路縱斷面示意圖,表示線路縱斷面概貌和沿線建筑物特征。細線表示地面線,粗線表示路肩線。線路上相應(yīng)的里程位置應(yīng)該標出大小橋涵、中間站和立體交叉等圖形符號。
4.1.1 地面線及路肩線
地面線和路肩線只是高程不同,繪制的方法相同,用AutoCAD 中的多段線來繪制,可以實現(xiàn)地面線和路肩線的連貫和一致,便于管理和修改。
在當前AutoCAD 文檔的模型空間中創(chuàng)建二維多段線的方法為:
Set plineObj=ThisDrawing.ModelSpace. AddLightWeightPolyline(points)
其中plineObj 為所創(chuàng)建的二維多段線的對象變量,points 為存儲二維多段線頂點二維坐標的數(shù)組名,它所含有的坐標值個數(shù)必須為偶數(shù)且至少為4 個(即兩個頂點)。
在這里不是把構(gòu)成二維多段線的所有頂點坐標一次性放入points 數(shù)組,而是采用了向多段線添加頂點的方法AddVertex[4]:
plineObj.AddVertex VertexNumber, newVertex
newVertex 為存儲了新加入頂點二維坐標值的數(shù)組,VertexNumber 是新加入頂點在整個多段線頂點順序數(shù)列中的號碼,以初始點為0、累計遞增所得。
4.1.2 橋涵的標識與大、中橋示意圖
(1) 橋、涵的標識
橋、涵的標識采用AutoCAD 屬性塊的方式插入。
首先定義如圖3 所示的幾種類型的圖塊,分別代表立體交叉(如框架涵)、涵洞(包括圓涵和蓋板涵)、大中橋,每種圖塊都包含中間的圖素和兩側(cè)的屬性,左側(cè)的屬性代表橋梁或涵洞的類型特征,右側(cè)的屬性代表該涵洞的里程標記(離開百米樁的距離)或橋梁的名稱和里程;由于有些大、中橋采用兩種不同類型的梁,所以統(tǒng)一在圖素的左側(cè)定義兩個屬性,第一個代表梁1 的類型特征,第二個代表梁2 的類型特征。如果只有一種類型的梁,則左側(cè)第二個屬性(梁2 的類型特征)為空。
圖3 帶屬性的圖塊
上述圖塊在插入時,它們的插入點的橫、縱坐標可分別從它們的里程、路肩高程得到。
1) VBA 在AutoCAD 中插入圖塊的方法
Set objBlkRef = ThisDrawing.ModelSpace. InsertBlock(BlkInsertPnt, BlkName, 1, 1, 1, 0)
其中BlkInsertPnt 為保存插入點三維坐標的數(shù)組名,BlkName 為所要插入的塊名(表3 中第六列的數(shù)據(jù)),后面4 個常數(shù)分別為X、Y、Z 向的比例因子和圖塊插入時的旋轉(zhuǎn)角度。
2) 取得圖塊屬性,然后更改圖塊屬性值
varAttributes = objBlkRef.GetAttributes
用圖塊對象的GetAttributes 方法獲得插入圖塊的屬性,varAttributes 是用于存儲圖塊objBlkRef 屬性的變體數(shù)組。
接著就可以逐個更改屬性值:
varAttributes(0).textstring = “+” & excelsheet. Cells(i , 3)
varAttributes(1).textstring = excelsheet.Cells (i , 4)
若插入的圖塊名為“DZHQ”,則
varAttributes(0).textstring = excelsheet.Cells (i , 7)
varAttributes(2).textstring = excelsheet.Cells (i , 5)
(2) 大中橋示意圖
大中橋示意圖的繪制比標識要復雜些。Excel數(shù)據(jù)表“里程-橋涵表”只是給出了大中橋的中心里程和橋長,當需要繪制大中橋的前后橋臺時需要計算出它們各自的里程,而“里程-橋涵表”數(shù)據(jù)表里并不能正好設(shè)有此里程,從而也并不能得出橋臺插入點的高程,并且橋梁的上下承結(jié)構(gòu)需要在前后橋臺之間繪制距橋面一定距離的橋面平行線,此平行線兩個端點高程的獲得存在同樣的問題。
繪制橋臺的方法如下:
1) 中心里程增減一半的橋長即可得出前后橋臺的里程。
2) 在繪制路肩線的數(shù)據(jù)表里搜索比前橋臺插入里程稍大的百米樁號i1和比后橋臺插入里程稍小的百米樁號i2。
3) 從這兩個百米樁號即可得到前后橋臺的近似高程,其精度已足夠滿足繪圖要求。
4) 利用得到的前后橋臺里程和高程,繪制前后橋臺。
橋面平行線兩個端點的里程和前后橋臺的里程一致,而兩個端點的高程需要將橋臺上端點的高程同時向下(或上)移動少量距離(約1~1.5m);橋面平行線的繪制可根據(jù)i1和i2的關(guān)系分為3 種情況:① i1<i2:此情況如圖4(a)所示。首先需要連接前端點和i1處、后端點和i2處的橋面平行線,最后用和繪制路肩線同樣的方法補充出從i1到i2的橋面平行線;② i1=i2和i1>i2:此兩種情況分別如圖4(b)、圖4(c)所示。只需要連接前端點和后端點(只是統(tǒng)一地前端點取i2處的高程、后端點取i1處的高程)即可。
圖4 橋臺與百米樁的3 種相對位置
(3) 橋涵標識符號的挪動
當前后兩個標識符號的插入點距離較近時,前后標識符號的顯示會相互影響,因此需要將標識符號挪動一定距離,如圖5 所示。方法是:
先從理論插入點引出一條折線,向后面牽引一個適當距離,然后以此處作為圖塊的真正插入點,和其它地方一樣正常插入,即可實現(xiàn)標識符號的挪動。
為了圖形繪制的緊湊,挪動的距離可按下列的方法計算:
L=n×字高×1.2-d
其中 n 為前后兩個圖形符號之間描述文字行數(shù)(有些大中橋采用兩種類型的梁架設(shè),這時描述文字為3 行),其值等于屬性個數(shù);d 為前后兩個標識符號的理論插入點間的距離。
線路縱斷面圖的下半部為線路資料和數(shù)據(jù),自下而上順序有:線路平面、里程樁號、地面高程、設(shè)計坡度、路肩高程、工程地質(zhì)特征等欄目。其中,地面高程和路肩高程實現(xiàn)繪制的方法雷同,而工程地質(zhì)和它們的標記方法也基本一致,均是書寫文本,而文本的內(nèi)容就是Excel 數(shù)據(jù)表中的數(shù)據(jù)(因為篇幅限制,本文未給出地質(zhì)特征的Excel 數(shù)據(jù)表)。例如,書寫地面高程、路肩高程所需要的數(shù)據(jù)就是表1 中的第二、三列數(shù)據(jù);表中的第一列(里程)數(shù)據(jù)既是橫坐標,要書寫的里程樁號文本也可從中稍加處理而得到。下面主要分析線路平面示意圖和設(shè)計坡度的實現(xiàn)方法。
圖5 橋涵標識符號的挪動
4.2.1 線路平面示意圖
如圖6,線路平面示意圖主要由左曲線、右曲線、夾直線、里程標記、曲線要素等組成,它們的繪圖數(shù)據(jù)來自“里程-平面曲線”表。
圖6 線路平面示意圖
(1) 緩圓點和圓緩點里程的確定
緩圓點的里程=曲線起點里程+緩和曲線長度l。
圓緩點的里程=曲線終點里程–緩和曲線長度l。
(2) 里程標記
因為夾直線均在左曲線或右曲線之間,所以左曲線或右曲線的終點便是夾直線的起點,夾直線的終點便是左曲線或右曲線的起點,不論左曲線、右曲線還是夾直線,它們交界處(緩直點或直緩點)均需要繪制比里程標記稍長的豎向短線,它們的長度均一致,在豎線的左側(cè)要標注該點的里程標記(該點到百米標的距離且字頭向左)。因此,要截取Excel 數(shù)據(jù)表里完整里程數(shù)的后4位,并換算單位成m。其實現(xiàn)的VBA 代碼如下:
textstring =Format_
(Val(Right(Format(excelsheet.Cells(i , 1).Value, "0.00000"), 4)) * 0.01, "00.00")
1) 用Format(excelsheet.Cells(i , 1).Value, "0.00000")將取出的單元格數(shù)值統(tǒng)一成5 位小數(shù)的千米數(shù)。
2) 在其中取右邊后4 位用Right(…, 4),顯然此時這4 個數(shù)字的單位已經(jīng)變成了cm 。
3) 變換單位成m,需要將上邊的數(shù)縮小0.01倍。
4) 顯示成小數(shù)點前后均為2 位的形式用Format 函數(shù)實現(xiàn):Format(…, "00.00")。
然后,即可在緩直點(或圓直點)及直緩點(或直圓點)處標記里程,應(yīng)用添加文字的方法
Txtpt 為文字插入點坐標數(shù)組,25000 規(guī)定了字高。
接著用Rotation 方法將它們逆時針旋轉(zhuǎn)π/2: textObj.Rotation = Atn(1) * 2
Atn(1)是1 的反正切值,即π/4,所以上式將得到π/2 的精確值。
(3) 曲線要素
曲線要素包括轉(zhuǎn)向角(α)、曲率半徑(R)、緩和曲線長(l)、切線長(T)和曲線長(L)等。它們均是直接從Excel 數(shù)據(jù)表讀出,可以逐個用添加文字的方法將其繪出。但為了省略每次均為它們獨立設(shè)置文字位置的麻煩,本程序的實現(xiàn)依然采用插入圖塊的方法,只不過這個圖塊不含有任何圖形元素,只含有由文本組成的塊屬性。各文本屬性在圖塊中的顯示位置設(shè)置好以后,只需定位好該圖塊的插入點,然后更改屬性即可。
4.2.2 設(shè)計坡度
只需將前后兩個變坡點連線即可得坡度線。變坡點的x 坐標可由里程得到,y 坐標則固定在上下兩條水平線上。在變坡點處需要設(shè)置和平面曲線一樣的短豎線,并標記變坡點里程,所以實現(xiàn)的方法也一樣,但需要注意的是緊跟在平坡后面的變坡點的標記不能和其它變坡點一樣標記在豎線的左側(cè),應(yīng)該調(diào)整到右側(cè),否則其顯示會與坡度線重疊。
坡度線的上方應(yīng)顯示坡度值(以‰為單位);坡度線的下方應(yīng)顯示其坡長。為了使整個標記顯示完整而勻稱,平坡的坡度和坡長可顯示在該段坡度線的中部上側(cè)和下側(cè);上坡的坡度顯示在該段坡度線的上方中部偏左位置,坡長顯示在該段坡度線的下方中部偏右位置;下坡的坡度顯示在該段坡度線的上方中部偏右位置,坡長標記顯示在該段坡度線的下方中部偏左位置。
(1) 根據(jù)上述方法研制開發(fā)的線路縱斷面圖自動繪圖軟件,已經(jīng)用于朔黃鐵路竣工圖詳細縱斷面圖的繪制,用戶反映良好;本文圖1 就是用所開發(fā)的程序自動繪制的。
(2) 由于篇幅所限,本文只對線路縱斷面圖中的主要要素進行較詳細的分析并給出VBA實現(xiàn)方法,還有一些要素(如水準點、斷鏈、車站等的標識,這些要素在縱斷面圖中所占的比重較?。┍疚奈醋鹘榻B,但繪制的方法與橋涵標識的繪制類似。
[1] 楊春風. 道路工程[M]. 北京: 中國建材工業(yè)出版社, 2000. 34-50.
[2] 張新來. 工程制圖(第2 版)[M]. 北京: 中國鐵道出版社, 2001. 224-226.
[3] 張 帆, 鄭立楷, 盧擇臨, 等. AutoCAD VBA 二次開發(fā)教程[M]. 北京: 清華大學出版社, 2006. 313-316.
[4] 王 鈺. 用VBA 開發(fā)AutoCAD 2000 應(yīng)用程序[M]. 北京: 人民郵電出版社, 1999. 153-155.
[5] 潘學英. 北京鐵路局京九線縱斷面繪圖軟件的研制與應(yīng)用[J]. 鐵路航測, 2001, 4l(2): 32-33.
[6] 王永輝, 胡青泥, 李紅彩. AutoCAD 二次開發(fā)方法的研究[J]. 計算機系統(tǒng)應(yīng)用, 2007, (3): 94-96, 100.
[7] 張 鋒, 陳愛萍. AutoCAD 二次開發(fā)環(huán)境的探討[J]. 機械設(shè)計與制造, 2005, (9): 125-127.