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