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