999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于VBA 的線路縱斷面圖的自動繪制

2010-01-01 01:44:42邱榮茂王大鳴張德瑩
圖學學報 2010年2期

邱榮茂, 王大鳴, 張 濤, 張德瑩

(1. 石家莊鐵道學院土木工程分院,河北 石家莊 050043; 2. 石家莊鐵道學院機械工程分院,河北 石家莊 050043; 3. 同濟大學土木工程學院建筑工程系虛擬建筑教研室,上海 200092)

1 概 述

線路縱斷面圖包括圖樣和資料表兩部分,圖樣包括地面縱斷面線、設計路肩線以及橋涵、隧道、車站、水準點等構造物的標識等內容;資料表包括線路平面、里程樁號、地面高程、設計坡度、路肩高程、工程地質特征等[1-2]。圖1 是某鐵路線路的一段縱斷面圖。

由于線路縱斷面圖包含的內容較多,手工繪圖或者直接用AutoCAD 命令逐步繪制的效率很低,工作量極大,需要進行大量繁復的操作,非常容易出錯,而且繪圖精度不高。本文介紹利用VBA 對AutoCAD 進行自主定制,從而實現自動繪制線路縱斷面圖的方法。

圖1 線路縱斷面圖實例

2 線路縱斷面圖的數據組織

線路縱斷面圖是線路設計的最終成果,在縱斷面設計過程中已經得到了有關的設計數據,例如,不同里程的地面高程、路肩高程、設計坡度以及橋、涵等構筑物的結構類型等,所有這些設計數據都與里程有關。從便于對數據進行處理的角度出發,可將縱斷面圖的設計數據組織成以里程為主數據的Excel 數據表。以圖1 為例,可以組織成下面的4 個表(表1~表4)。

在表3 中,第六列是根據橋涵的不同類型創建的帶有屬性的圖塊的塊名,第四列表示橋涵的結構類型。對于大中橋有可能采用兩種不同類型的梁,此時第四列為梁一的類型特征,第五列為梁二的類型特征;若只有一種梁,則第五列為空。

表1 里程-地面高程、路肩高程

表2 里程-設計坡度

表3 里程-橋涵

表4 里程-平面曲線

3 AutoCAD VBA 和Excel 之間的交互

3.1 AutoCAD VBA 對Excel 的引用[3]

進入VBA 集成開發環境,選擇“工具”→“引用”菜單項,打開如圖2 所示的對話框,鉤選Microsoft Excel 11.0 Object Library(Excel 類型庫,其版本與計算機上安裝的Office 版本有關,11.0 是Office 2003 對應的版本)、Microsoft Visual Basic for Applications Extensibility 5.3(VBA 類型庫)兩項。

3.2 從Excel 表中讀取數據

在引用了Excel 和VBA 類型庫后,就可以編寫VBA 代碼對Excel 數據表進行訪問。

首先聲明一個指定類ID 的對象變量,并用CreateObject 函數創建下面Microsoft Excel 引用:

在 CreateObject 函數創建并返回一個對Microsoft Excel 對象的引用后,可以用集合Workbooks 的Open 方法打開一個Excel 文檔,其位置就是Excel 數據表所在位置。例如,在上面創建Microsoft Excel 引用后欲打開絕對路徑為“F:數據匯總.xls”的工作簿文件(假設該文件中包含上述4 個Excel 數據表),可以運用下面的語句:

ExcelApp.Workbooks.Open “F: 數 據 匯總.xls”

圖2 引用Excel 類型庫和VBA IDE 類型庫

要訪問已經打開的工作簿中的工作表可以使用工作簿的Sheets 屬性,例如下面代碼將打開當前活動工作簿“F:數據匯總.xls”中名為“里程-地面高程、路肩高程”的工作表,并賦予對象變量ExcelSheet:

Dim ExcelSheet As Excel.Worksheet

Set ExcelSheet = ExcelApp.ActiveWorkbook. Sheets("里程-地面高程、路肩高程")

最后用ExcelSheet 的Cells 屬性從打開的工作表中讀取指定的單元格的數據。例如:

ExcelSheet.Cells(i, j).value 可獲得Excel 的“里程-地面高程、路肩高程”表第i 行第j 列的單元格的值。利用讀出的數據,AutoCAD 就可以在繪圖窗口中繪圖。

4 線路縱斷面圖構成要素的數字分析及VBA 實現

4.1 線路縱斷面示意圖

線路縱斷面圖的上半部為線路縱斷面示意圖,表示線路縱斷面概貌和沿線建筑物特征。細線表示地面線,粗線表示路肩線。線路上相應的里程位置應該標出大小橋涵、中間站和立體交叉等圖形符號。

4.1.1 地面線及路肩線

地面線和路肩線只是高程不同,繪制的方法相同,用AutoCAD 中的多段線來繪制,可以實現地面線和路肩線的連貫和一致,便于管理和修改。

在當前AutoCAD 文檔的模型空間中創建二維多段線的方法為:

Set plineObj=ThisDrawing.ModelSpace. AddLightWeightPolyline(points)

其中plineObj 為所創建的二維多段線的對象變量,points 為存儲二維多段線頂點二維坐標的數組名,它所含有的坐標值個數必須為偶數且至少為4 個(即兩個頂點)。

在這里不是把構成二維多段線的所有頂點坐標一次性放入points 數組,而是采用了向多段線添加頂點的方法AddVertex[4]:

plineObj.AddVertex VertexNumber, newVertex

newVertex 為存儲了新加入頂點二維坐標值的數組,VertexNumber 是新加入頂點在整個多段線頂點順序數列中的號碼,以初始點為0、累計遞增所得。

4.1.2 橋涵的標識與大、中橋示意圖

(1) 橋、涵的標識

橋、涵的標識采用AutoCAD 屬性塊的方式插入。

首先定義如圖3 所示的幾種類型的圖塊,分別代表立體交叉(如框架涵)、涵洞(包括圓涵和蓋板涵)、大中橋,每種圖塊都包含中間的圖素和兩側的屬性,左側的屬性代表橋梁或涵洞的類型特征,右側的屬性代表該涵洞的里程標記(離開百米樁的距離)或橋梁的名稱和里程;由于有些大、中橋采用兩種不同類型的梁,所以統一在圖素的左側定義兩個屬性,第一個代表梁1 的類型特征,第二個代表梁2 的類型特征。如果只有一種類型的梁,則左側第二個屬性(梁2 的類型特征)為空。

圖3 帶屬性的圖塊

上述圖塊在插入時,它們的插入點的橫、縱坐標可分別從它們的里程、路肩高程得到。

1) VBA 在AutoCAD 中插入圖塊的方法

Set objBlkRef = ThisDrawing.ModelSpace. InsertBlock(BlkInsertPnt, BlkName, 1, 1, 1, 0)

其中BlkInsertPnt 為保存插入點三維坐標的數組名,BlkName 為所要插入的塊名(表3 中第六列的數據),后面4 個常數分別為X、Y、Z 向的比例因子和圖塊插入時的旋轉角度。

2) 取得圖塊屬性,然后更改圖塊屬性值

varAttributes = objBlkRef.GetAttributes

用圖塊對象的GetAttributes 方法獲得插入圖塊的屬性,varAttributes 是用于存儲圖塊objBlkRef 屬性的變體數組。

接著就可以逐個更改屬性值:

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數據表“里程-橋涵表”只是給出了大中橋的中心里程和橋長,當需要繪制大中橋的前后橋臺時需要計算出它們各自的里程,而“里程-橋涵表”數據表里并不能正好設有此里程,從而也并不能得出橋臺插入點的高程,并且橋梁的上下承結構需要在前后橋臺之間繪制距橋面一定距離的橋面平行線,此平行線兩個端點高程的獲得存在同樣的問題。

繪制橋臺的方法如下:

1) 中心里程增減一半的橋長即可得出前后橋臺的里程。

2) 在繪制路肩線的數據表里搜索比前橋臺插入里程稍大的百米樁號i1和比后橋臺插入里程稍小的百米樁號i2。

3) 從這兩個百米樁號即可得到前后橋臺的近似高程,其精度已足夠滿足繪圖要求。

4) 利用得到的前后橋臺里程和高程,繪制前后橋臺。

橋面平行線兩個端點的里程和前后橋臺的里程一致,而兩個端點的高程需要將橋臺上端點的高程同時向下(或上)移動少量距離(約1~1.5m);橋面平行線的繪制可根據i1和i2的關系分為3 種情況:① i1<i2:此情況如圖4(a)所示。首先需要連接前端點和i1處、后端點和i2處的橋面平行線,最后用和繪制路肩線同樣的方法補充出從i1到i2的橋面平行線;② i1=i2和i1>i2:此兩種情況分別如圖4(b)、圖4(c)所示。只需要連接前端點和后端點(只是統一地前端點取i2處的高程、后端點取i1處的高程)即可。

圖4 橋臺與百米樁的3 種相對位置

(3) 橋涵標識符號的挪動

當前后兩個標識符號的插入點距離較近時,前后標識符號的顯示會相互影響,因此需要將標識符號挪動一定距離,如圖5 所示。方法是:

先從理論插入點引出一條折線,向后面牽引一個適當距離,然后以此處作為圖塊的真正插入點,和其它地方一樣正常插入,即可實現標識符號的挪動。

為了圖形繪制的緊湊,挪動的距離可按下列的方法計算:

L=n×字高×1.2-d

其中 n 為前后兩個圖形符號之間描述文字行數(有些大中橋采用兩種類型的梁架設,這時描述文字為3 行),其值等于屬性個數;d 為前后兩個標識符號的理論插入點間的距離。

4.2 線路資料和數據

線路縱斷面圖的下半部為線路資料和數據,自下而上順序有:線路平面、里程樁號、地面高程、設計坡度、路肩高程、工程地質特征等欄目。其中,地面高程和路肩高程實現繪制的方法雷同,而工程地質和它們的標記方法也基本一致,均是書寫文本,而文本的內容就是Excel 數據表中的數據(因為篇幅限制,本文未給出地質特征的Excel 數據表)。例如,書寫地面高程、路肩高程所需要的數據就是表1 中的第二、三列數據;表中的第一列(里程)數據既是橫坐標,要書寫的里程樁號文本也可從中稍加處理而得到。下面主要分析線路平面示意圖和設計坡度的實現方法。

圖5 橋涵標識符號的挪動

4.2.1 線路平面示意圖

如圖6,線路平面示意圖主要由左曲線、右曲線、夾直線、里程標記、曲線要素等組成,它們的繪圖數據來自“里程-平面曲線”表。

圖6 線路平面示意圖

(1) 緩圓點和圓緩點里程的確定

緩圓點的里程=曲線起點里程+緩和曲線長度l。

圓緩點的里程=曲線終點里程–緩和曲線長度l。

(2) 里程標記

因為夾直線均在左曲線或右曲線之間,所以左曲線或右曲線的終點便是夾直線的起點,夾直線的終點便是左曲線或右曲線的起點,不論左曲線、右曲線還是夾直線,它們交界處(緩直點或直緩點)均需要繪制比里程標記稍長的豎向短線,它們的長度均一致,在豎線的左側要標注該點的里程標記(該點到百米標的距離且字頭向左)。因此,要截取Excel 數據表里完整里程數的后4位,并換算單位成m。其實現的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")將取出的單元格數值統一成5 位小數的千米數。

2) 在其中取右邊后4 位用Right(…, 4),顯然此時這4 個數字的單位已經變成了cm 。

3) 變換單位成m,需要將上邊的數縮小0.01倍。

4) 顯示成小數點前后均為2 位的形式用Format 函數實現:Format(…, "00.00")。

然后,即可在緩直點(或圓直點)及直緩點(或直圓點)處標記里程,應用添加文字的方法

Txtpt 為文字插入點坐標數組,25000 規定了字高。

接著用Rotation 方法將它們逆時針旋轉π/2: textObj.Rotation = Atn(1) * 2

Atn(1)是1 的反正切值,即π/4,所以上式將得到π/2 的精確值。

(3) 曲線要素

曲線要素包括轉向角(α)、曲率半徑(R)、緩和曲線長(l)、切線長(T)和曲線長(L)等。它們均是直接從Excel 數據表讀出,可以逐個用添加文字的方法將其繪出。但為了省略每次均為它們獨立設置文字位置的麻煩,本程序的實現依然采用插入圖塊的方法,只不過這個圖塊不含有任何圖形元素,只含有由文本組成的塊屬性。各文本屬性在圖塊中的顯示位置設置好以后,只需定位好該圖塊的插入點,然后更改屬性即可。

4.2.2 設計坡度

只需將前后兩個變坡點連線即可得坡度線。變坡點的x 坐標可由里程得到,y 坐標則固定在上下兩條水平線上。在變坡點處需要設置和平面曲線一樣的短豎線,并標記變坡點里程,所以實現的方法也一樣,但需要注意的是緊跟在平坡后面的變坡點的標記不能和其它變坡點一樣標記在豎線的左側,應該調整到右側,否則其顯示會與坡度線重疊。

坡度線的上方應顯示坡度值(以‰為單位);坡度線的下方應顯示其坡長。為了使整個標記顯示完整而勻稱,平坡的坡度和坡長可顯示在該段坡度線的中部上側和下側;上坡的坡度顯示在該段坡度線的上方中部偏左位置,坡長顯示在該段坡度線的下方中部偏右位置;下坡的坡度顯示在該段坡度線的上方中部偏右位置,坡長標記顯示在該段坡度線的下方中部偏左位置。

5 結 束 語

(1) 根據上述方法研制開發的線路縱斷面圖自動繪圖軟件,已經用于朔黃鐵路竣工圖詳細縱斷面圖的繪制,用戶反映良好;本文圖1 就是用所開發的程序自動繪制的。

(2) 由于篇幅所限,本文只對線路縱斷面圖中的主要要素進行較詳細的分析并給出VBA實現方法,還有一些要素(如水準點、斷鏈、車站等的標識,這些要素在縱斷面圖中所占的比重較小)本文未作介紹,但繪制的方法與橋涵標識的繪制類似。

[1] 楊春風. 道路工程[M]. 北京: 中國建材工業出版社, 2000. 34-50.

[2] 張新來. 工程制圖(第2 版)[M]. 北京: 中國鐵道出版社, 2001. 224-226.

[3] 張 帆, 鄭立楷, 盧擇臨, 等. AutoCAD VBA 二次開發教程[M]. 北京: 清華大學出版社, 2006. 313-316.

[4] 王 鈺. 用VBA 開發AutoCAD 2000 應用程序[M]. 北京: 人民郵電出版社, 1999. 153-155.

[5] 潘學英. 北京鐵路局京九線縱斷面繪圖軟件的研制與應用[J]. 鐵路航測, 2001, 4l(2): 32-33.

[6] 王永輝, 胡青泥, 李紅彩. AutoCAD 二次開發方法的研究[J]. 計算機系統應用, 2007, (3): 94-96, 100.

[7] 張 鋒, 陳愛萍. AutoCAD 二次開發環境的探討[J]. 機械設計與制造, 2005, (9): 125-127.

主站蜘蛛池模板: 国产福利拍拍拍| 国产办公室秘书无码精品| 成人精品午夜福利在线播放| 国产成人av一区二区三区| 亚洲综合天堂网| 色偷偷一区二区三区| a级毛片免费在线观看| 日韩福利在线观看| 久久夜色精品| 久久窝窝国产精品午夜看片| 无码日韩人妻精品久久蜜桃| 婷婷六月色| 亚洲高清国产拍精品26u| 不卡色老大久久综合网| 国产精品专区第一页在线观看| 香蕉eeww99国产在线观看| 日本伊人色综合网| 色妞永久免费视频| 亚洲91在线精品| 综合色88| 成人午夜福利视频| 91色综合综合热五月激情| 国产精品亚洲一区二区三区在线观看| 亚洲色欲色欲www网| 国产精品真实对白精彩久久| 国产小视频在线高清播放| 国产精品乱偷免费视频| 亚洲欧美另类色图| 国产麻豆aⅴ精品无码| 久久久久青草大香线综合精品| 超清无码熟妇人妻AV在线绿巨人 | 婷婷亚洲视频| 成人亚洲视频| 欧美三级自拍| 精品自窥自偷在线看| 色综合网址| 精品一区二区三区水蜜桃| 国产人在线成免费视频| 国产Av无码精品色午夜| 青青草原偷拍视频| 91精品国产91久无码网站| 丁香五月激情图片| 亚洲第一香蕉视频| 亚洲国产欧美国产综合久久 | 成人综合在线观看| 欧美午夜在线视频| 午夜日本永久乱码免费播放片| 亚洲人成色在线观看| 国产欧美日韩在线在线不卡视频| 亚洲人成人伊人成综合网无码| 人妻精品久久久无码区色视| 亚洲中字无码AV电影在线观看| 国产欧美日韩免费| 成人福利视频网| 亚洲欧美成人在线视频| 国产精品污视频| 在线国产欧美| 国产在线无码av完整版在线观看| 亚洲毛片一级带毛片基地| 午夜爽爽视频| 国产微拍一区| 91综合色区亚洲熟妇p| 久久99精品久久久大学生| 亚洲天堂高清| 污网站免费在线观看| 日本在线国产| 午夜福利无码一区二区| 超清无码一区二区三区| 亚洲欧美国产视频| 国产96在线 | 天天色天天综合网| 暴力调教一区二区三区| 黄色片中文字幕| 一本视频精品中文字幕| 99精品伊人久久久大香线蕉 | 亚洲综合中文字幕国产精品欧美 | 999国内精品视频免费| 国产在线麻豆波多野结衣| 精品剧情v国产在线观看| 女人18毛片久久| 欧美天堂在线| 综合人妻久久一区二区精品 |