張 坤
(中鐵第一勘察設(shè)計院集團(tuán)有限公司,陜西西安 710043)
AutoCAD是目前勘察設(shè)計行業(yè)最常用的設(shè)計軟件之一,廣泛應(yīng)用于鐵路、公路、水利等行業(yè)。作為一種通用的輔助設(shè)計軟件,在面對特殊用途的設(shè)計中,如果僅僅利用CAD自身提供的功能,往往造成人工工作量大,而且很多工作量都是重復(fù)性勞動。在此情況下,只是會用軟件的基本功能是不夠的,根據(jù)專業(yè)性質(zhì)和用戶要求進(jìn)行CAD二次開發(fā)就成了解決問題的有效途徑。
目前工作中,勘探孔編號、坐標(biāo)、里程及偏移量多是通過人機(jī)交互的方式直接在CAD中測量讀取,工作量大且具有重復(fù)性。人工讀取數(shù)據(jù)有以下三個不足,一是費(fèi)時,二是錯誤率高,三是精度無法保證。為了解決這些問題,選擇VBA對CAD進(jìn)行二次開發(fā)就成了必要。VBA入門簡單,開發(fā)速度快。在鉆孔投影里程程序的開發(fā)中,鉆孔以帶屬性的塊的形式存在,程序能夠很方便的獲取鉆孔圖塊的編號和插入點(diǎn),然后通過VBA調(diào)用Lisp的曲線類函數(shù),能夠獲取鉆孔圖塊的插入點(diǎn)在線路上的投影里程和偏移量,最后在VBA中調(diào)用Excel的類型庫,將鉆孔的相關(guān)數(shù)據(jù)保存在Excel中。程序運(yùn)行方便,準(zhǔn)確度高,減少了專業(yè)人員的工作量,取得了良好的效果,值得推廣和運(yùn)用。
程序主要包括一個讀過程和一個寫過程,讀取鉆孔信息全部操作均在CAD中完成,并且在CAD命令窗口中有信息提示;在數(shù)據(jù)存儲方面,程序采用了大家習(xí)慣的Excel文件來保存鉆孔的編號、坐標(biāo)、里程及偏移量(如圖1所示)。
圖1 程序運(yùn)行流程圖
程序運(yùn)行完畢后,鉆孔的以上數(shù)據(jù)自動傳輸?shù)紼xcel中,可以替代目前逐個量取鉆孔坐標(biāo)、里程及偏移量繁瑣的工作。
鉆孔投影里程程序主要由三部分組成:宏啟動程序、用戶窗體和類模塊。
宏啟動模塊代碼如下:
Sub RunMicro()
frmMain.Show
End Sub
該程序的目的是調(diào)用主窗口,其中窗體的名稱為frmMain。
窗體包括一個里程冠號輸入框,兩個命令按鈕:運(yùn)行和退出。程序的運(yùn)行的所有代碼都包含在運(yùn)行命令按鈕的過程中(如圖2所示)。
圖2 程序窗體
類模塊主要包含Vlax和Curve兩個類模塊。在VBA中對于曲線的操作是一個弱項(xiàng),因?yàn)锳ctiveX沒有太多有關(guān)曲線方面的內(nèi)容,但LISP中很多有用的函數(shù)在ActiveX中都沒有對應(yīng)的屬性方法。為了解決這一個問題,已經(jīng)有前人用該類型庫編寫成為VLAX類模塊,這樣就可以在VBA中可以直接調(diào)用該類,然后實(shí)現(xiàn)該類型庫中提供的重要功能,也即在程序中引用了VLAX和Curve兩個類模塊。
這兩個類模塊適合的曲線類型包括:直線、多段線、弧線等,鉆孔投影里程程序中利用的功能主要包括:返回曲線的起點(diǎn)和終點(diǎn)坐標(biāo),曲線上一點(diǎn)到曲線起點(diǎn)的長度,曲線外一點(diǎn)到曲線距離最近點(diǎn)坐標(biāo),也即點(diǎn)到線的垂足。代碼主要部分如下:
Dim objCurve As Curve
Set objCurve=New Curve
objCurve.StartPoint
objCurve.EndPoint
objCurve.GetClosestPointTo(PntPick)
objCurve.GetDistanceAtPoint(PntPick)
AutoCAD中塊有以下優(yōu)勢,便于建立塊圖形庫;能夠節(jié)約磁盤空間;圖形修改方便;能夠攜帶屬性信息。塊屬性是從屬塊的非圖形信息,它是塊的一個組成部分,實(shí)際上,也可以說屬性是塊中的文本實(shí)體,即:塊=若干實(shí)體+屬性。
在平時工作中,CAD中鉆孔的標(biāo)示方法是鉆孔圖形和編號獨(dú)立存在,但是這樣做有一個缺點(diǎn)就是程序不能將鉆孔和與之對應(yīng)的編號一一聯(lián)系起來。為了解決這個問題,可以用鉆孔塊和塊屬性的方法來表示鉆孔信息。
因此,程序開發(fā)中將鉆孔做成塊的形式,編號做成塊屬性,這樣就能夠很容易獲取相關(guān)的鉆孔編號和塊插入點(diǎn)坐標(biāo),也即鉆孔的平面位置坐標(biāo)。
(1)建立CAD-VBA與Excel程序連接
在“工具”-“引用”里面引用Excel對象庫,這樣就可以在 CAD-VBA中實(shí)現(xiàn) CAD和 Excel的數(shù)據(jù)通信[4-5]。
關(guān)鍵代碼實(shí)現(xiàn)如下:
(2)選擇需要投影里程的線路
該方法要求用戶在圖形屏幕上拾取一個點(diǎn)來選中線路實(shí)體,一旦選擇成功后有消息提示框提示線路選擇成功。
關(guān)鍵代碼實(shí)現(xiàn)如下:
ThisDrawing.Utility.GetEntity Ent,PickedPoint,
"選擇線路"
(3)選取線路上一點(diǎn)并輸入里程
在選擇線路上一點(diǎn)時,對象捕捉模式設(shè)置為最近點(diǎn)捕捉和交點(diǎn)捕捉,目的是為了選取線路上標(biāo)示里程樁號與線路的交點(diǎn),根據(jù)線路上一點(diǎn)的里程和任意一點(diǎn)的相對距離,就可以算出線路上該點(diǎn)的里程。
計算原理如下:假設(shè)線路上所選取A點(diǎn)的里程數(shù)為X0,需要計算B點(diǎn)的里程數(shù)為X1,A點(diǎn)距離線路起點(diǎn)的線路上L0,B點(diǎn)距離線路起點(diǎn)的距離為L1,很容易計算得B點(diǎn)的里程
關(guān)鍵代碼實(shí)現(xiàn)如下:
ThisDrawing.SetVariable"OSMODE",544
其中,在系統(tǒng)變量OSMODE中,最近點(diǎn)捕捉數(shù)值為512,交點(diǎn)捕捉數(shù)值為32,這兩個數(shù)值的和544即為選中這兩種捕捉模式。
(4)確保程序中只有唯一的選擇集
需要注意的是,這里的選擇集名為“test1”,第2次運(yùn)行時程序不能還用此名創(chuàng)建選擇集,否則就要出錯。因此,在程序中運(yùn)行時需要判斷CAD中選擇集是否存在,如果存在,則刪除此選擇集,并且創(chuàng)建一個新的選擇集。
關(guān)鍵代碼實(shí)現(xiàn)如下:
(5)獲取鉆孔坐標(biāo)和偏移量
選取鉆孔塊后,通過訪問鉆孔塊InsertionPoint屬性能夠得到該點(diǎn)的坐標(biāo),假設(shè)該插入點(diǎn)為C,然后通過GetClosestPointTo函數(shù)能夠求得曲線上距離該插入點(diǎn)距離最近點(diǎn)D坐標(biāo),同時D點(diǎn)也為垂足,然后根據(jù)C點(diǎn)和D點(diǎn)坐標(biāo)求出CD間的距離,也即鉆孔離線路的偏移量。
關(guān)鍵代碼實(shí)現(xiàn)如下:
ptPick=ssetObj.Item(i).InsertionPoint
ClosestPnt=objCurve.GetClosestPointTo(ptPick)
(6)鉆孔在線路左右側(cè)的判斷
線路畫線方向一般是從小里程到大里程,通過
PtStar=objCurve.StartPoint
PtEnd=objCurve.EndPoint
能夠獲取線路的起點(diǎn)和終點(diǎn)坐標(biāo),在XY坐標(biāo)系中,假如起點(diǎn)坐標(biāo)分量X1小于終點(diǎn)坐標(biāo)分量X2,在CAD中線路小里程到大里程表現(xiàn)為從左往右,當(dāng)鉆孔插入點(diǎn)C坐標(biāo)分量 Y1大于垂足 D點(diǎn)的坐標(biāo)分量Y2時,返回一個字符”左”;當(dāng)Y1小于垂足D點(diǎn)的坐標(biāo)分量Y2時,返回一個字符”右”;當(dāng)Y1等于垂足D點(diǎn)的坐標(biāo)分量Y2時,返回一個空字符””,即鉆孔在線路上。根據(jù)同樣的道理,可以很容易判斷出線路從小里程到大里程表現(xiàn)為從右往左的情況。
(7)將里程轉(zhuǎn)換為鐵路表示方法
假如獲得某一鉆孔的里程為1 100m,左偏1m,然后將此改寫成符合工作中的表達(dá)習(xí)慣,如“DK1+100左1m”。
計算原理如下:假設(shè)里程為 X,首先X/1000取整,即Y=Int(X/1000),Y為里程千米數(shù),然后計算百米部分,即Z=X-1000×Int(X/1000),Z為百米部分,最后用連接符“&”將各字符連接即可。
程序的應(yīng)用實(shí)例選取蘭新第二雙線嘉峪關(guān)聯(lián)絡(luò)線左線和右線進(jìn)行測試,線路方案穩(wěn)定后,左線長約3.7 km,右線長約3.1 km,根據(jù)鐵路工程地質(zhì)勘察規(guī)范布置鉆孔[6],共布設(shè)鉆孔53個。
程序運(yùn)行步驟如下:
①打開cad圖,并且新建一張Excel表格,用來存儲鉆孔的相關(guān)信息。運(yùn)行宏,界面如圖3所示。
圖3 程序運(yùn)行界面
②點(diǎn)擊運(yùn)行,選中所要投影的線路,一旦線路實(shí)體選擇成功,會有消息提示,然后點(diǎn)擊確定,如圖4所示。
圖4 消息提示框
③選擇線路上任意一點(diǎn)里程已知的位置,初始化整條線路的里程,并且在彈出的對話框中輸入該點(diǎn)的里程,如選擇的點(diǎn)A的里程是DK1+100,輸入1 100,點(diǎn)擊確定。程序運(yùn)行界面如圖5、圖6所示。
圖5 消息提示框
圖6 線路點(diǎn)里程輸入框
④選擇將要投影的鉆孔,選擇完畢后,點(diǎn)擊Enter鍵,鉆孔的編號、x坐標(biāo)、y坐標(biāo)、里程和偏移量自動傳輸?shù)紼xcel中,表格形式表1所示,表1中選取了其中8個鉆孔作為演示。表中數(shù)據(jù)可以直接用于鉆探任務(wù)書的下發(fā),減少了工作量,節(jié)約了工作時間。
表1 鉆孔信息一覽
(1)鉆孔投影里程程序能夠自動獲取鉆孔的坐標(biāo)和里程信息,并保存于大家習(xí)慣的Excel工作表中,操作簡單,極大提高了工作自動化程度,減少了相關(guān)人員的工作量。
(2)VBA程序能夠在VB6.0中編譯生成.exe可執(zhí)行文件,不需安裝,運(yùn)行方便,且有利于源代碼的保護(hù)。
(3)雖然程序中只實(shí)現(xiàn)了鉆孔的投影里程,根據(jù)同樣的道理,可以將其他勘探孔信息,例如試坑、靜探孔等的坐標(biāo)和投影線路里程讓程序自動讀出,并保存在Excel中,需要做的只是完善相關(guān)塊及塊屬性庫,方便以后調(diào)用。
(4)本程序暫時支持CAD2004與Excel2003的通信,其中 Excel2003對象庫引用的是 Microsoft Excel 11.0 Object Library,其他版本的Excel類型庫運(yùn)行會報錯,要重新編譯,才能重新運(yùn)行。
(5)Vlax類和Curve類模塊中,要在VBA中調(diào)用Lisp庫函數(shù),Lisp和VBA兩者通信過程中在其他計算機(jī)上會出現(xiàn)一些未知錯誤,程序運(yùn)行的穩(wěn)定性有待進(jìn)一步提高。
[1]張晉西.Visual Basic與AutoCAD二次開發(fā)[M].北京:清華大學(xué)出版社,2002
[2]二代龍震工作室.AutocAD VBA函數(shù)庫查詢辭典[M].北京:中國鐵道出版社,2003
[3]張帆,鄭立楷.盧擇臨,等.AutoCAD VBA二次開發(fā)教程[M].北京:清華大學(xué)出版社,2006
[4]閆海濤,岳全貴,詹才平.基于VBA的地質(zhì)勘察CAD軟件開發(fā)[J].交通科技,2010(7)
[5]李景健,楊安.AutoCAD表格和Excel表格的相互轉(zhuǎn)換[J].交通科技,2010(7)
[6]鐵道部第一勘測設(shè)計院.鐵路工程地質(zhì)手冊[M].北京:中國鐵道出版社,2005