黃冠濤,吳德芳,趙加奎
(中鐵二院 昆明勘察設(shè)計研究院有限責(zé)任公司,云南 昆明 650200)
在鐵路站場平面布置圖的繪制過程中,道岔繪制是一個重要的組成部分,所耗費(fèi)的時間也多,因此提高道岔繪制速度可大大提高工作效率。在傳統(tǒng)的道岔繪制過程中,主要是采用查表法進(jìn)行手工繪制。對于一般的道岔(如單開道岔),可以根據(jù)道岔表[1]的參數(shù)手動快速繪制出,對于復(fù)雜道岔(如岔后縮短曲線、切線不平行無緩和曲線的反向縮短曲線)也可以通過查表法進(jìn)行手動繪制,但是存在著兩個缺陷:一是復(fù)雜道岔參數(shù)多,需要繪制輔助線;二是查表法存在局限性,如果表中沒有需要的數(shù)據(jù)只能根據(jù)公式進(jìn)行手工計算,然后再根據(jù)輔助線進(jìn)行繪制,這種繪制方法操作時間長,工作量大。針對這種情況,本文提出了在Auto-CAD的平臺上用VBA對其進(jìn)行二次開發(fā),對需要的數(shù)據(jù)進(jìn)行參數(shù)化,自動繪制復(fù)雜道岔,并以岔后縮短曲線為例對本方法進(jìn)行驗證。
在實(shí)際鐵路站場平面布置圖中道岔的類型很多,諸如單開道岔、對稱道岔、交叉渡線等。對于這些簡單的道岔可以直接根據(jù)道岔的型號和類型在AutoCAD里面繪制,體現(xiàn)不出復(fù)雜道岔自動化繪制的優(yōu)勢,因此,本文選擇稍微復(fù)雜的道岔——后縮短曲線作為案例對象。
為了在復(fù)雜道岔繪制過程中使用方便,本設(shè)計采用可視化參數(shù)繪圖的原則進(jìn)行設(shè)計??梢暬瘏?shù)繪圖的設(shè)計流程如圖1所示。
為提高本設(shè)計方案的可操作性,根據(jù)道岔的特點(diǎn)以及所需的相關(guān)參數(shù)設(shè)計對應(yīng)的可視化界面,如圖2所示。
圖1 可視化參數(shù)繪圖的設(shè)計流程
圖2 道岔繪制可視化界面圖
針對岔后縮短曲線的特點(diǎn),首先對岔后縮短曲線進(jìn)行抽象化處理,定義出各相關(guān)點(diǎn),如圖3所示。
圖3中,a點(diǎn)為岔心,k點(diǎn)為岔后直線上任一點(diǎn),其他點(diǎn)都是由輸入的參數(shù)根據(jù)《鐵路工程設(shè)計技術(shù)手冊-站場及樞紐》中的相關(guān)公式進(jìn)行計算確定的。
圖3 岔后縮短曲線抽象示意圖
最后編制的相關(guān)代碼如下:
Sub繪制岔后縮短曲線_Click()
Dim pa(0To 2)As Double'道岔岔心
Dim pb(0To 2)As Double'切點(diǎn)一
Dim pc(0To 2)As Double'交點(diǎn)一
Dim pd(0To 2)As Double'切點(diǎn)二
Dim pe(0To 2)As Double'切點(diǎn)三
Dim pf(0To 2)As Double'交點(diǎn)二
Dim pg(0To 2)As Double'切點(diǎn)四
Dim ph(0To 2)As Double'圓心二
Dim pi(0To 2)As Double'圓心一
Dim pj(0To 2)As Double'直線點(diǎn),與pf對應(yīng)
Dim pk(0To 2)As Double'岔后直線任一點(diǎn)
Dim dch As Double'定義道岔號
Dim R1As Double'定義第一個圓半徑
Dim R2As Double'定義第二個圓半徑Dim jzx As Double'定義夾直線
Dim chzx As Double'定義岔后直線
Dim xjj As Double'定義線間距
Dim Angpapk As Double'定義ak線角度,即基礎(chǔ)線的旋轉(zhuǎn)角度
Dim dcj As Double'定義道岔角度
Dim ppi As Double'定義pi值
ppi= Atn(1)*4
If Txt1.Text=""Or Txt1.Text=""Or Txt2.Text=""Or Txt3.Text=""Or Txt4.Text=""Or Txt5.Text= ""Or Txt6.Text=""Then
MsgBox("請確認(rèn)輸入數(shù)據(jù)!")'防止輸錯數(shù)據(jù)
End
Else
dch= Txt1.Text
R1= Txt2.Text
R2= Txt3.Text
jzx= Txt4.Text
chzx= Txt5.Text
xjj= Txt6.Text
Me.Hide
End If
Dim cc As Variant
cc= ThisDrawing.Utility.GetPoint(,vbCrLf & "選擇岔心:")'選擇相對初始點(diǎn)
pa(0)=cc(0)
pa(1)=cc(1)
pa(2)=cc(2)
cc= ThisDrawing.Utility.GetPoint(,vbCrLf & "選擇岔后直線上任一點(diǎn):")'選擇相對終點(diǎn)
pk(0)=cc(0)
pk(1)=cc(1)
pk(2)=cc(2)
Angpapk= ThisDrawing.Utility.AngleFromXAxis(pa,pk)'計算出ak線與X軸的夾角
pa(2)=0'定義a點(diǎn)的Z坐標(biāo)為0
pk(2)=0'定義k點(diǎn)的Z坐標(biāo)為0
'Call ThisDrawing.ModelSpace.AddLine(pa,pk)'繪制ak直線
If dch= 6Then
dcj=9.4622222222*ppi/180
ElseIf dch = 7Then
dcj=8.13*ppi/180
ElseIf dch = 9Then
dcj=6.3402777778*ppi/180
ElseIf dch = 12Then
dcj=4.7636111111*ppi/180
ElseIf dch = 18Then
dcj=3.1797222222*ppi/180
Else
MsgBox("道岔角度輸入有誤,請重新輸入!")
End
End If
'計算相關(guān)參數(shù)-EXCLE
Dim beta,T1,T2,fi,x1,y1,x2,y2,L,temp As Double
beta= Atn(jzx/(R1+ R2))
temp= (R1*Cos(dcj)+chzx*Sin(dcj)+ R2-xjj)* Cos(beta)/(R1+ R2)
fi= Atn(-temp/Sqr(-temp*temp+1))+2* Atn(1)-beta-dcj'計算fi角
T1= R1* (Sin(fi/2)/Cos(fi/2))
T2= R2* (Sin((fi+dcj)/2)/Cos((fi+dcj)/2))
x1= (chzx+ T1)* Cos(dcj)
y1= (chzx+ T1)*Sin(dcj)
x2=x1+ (T1+T2+jzx)*Cos(dcj+fi)
y2=xjj-y1
L=x2+T2
Dim tmp As Variant
Angpapk= ThisDrawing.Utility.AngleFromXAxis(pa,pk)
'求b點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pa,dcj+ Angpapk,chzx)
pb(0)=tmp(0)
pb(1)=tmp(1)
pb(2)=0
'求c點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pa,dcj+ Angpapk,chzx+T1)
pc(0)=tmp(0)
pc(1)=tmp(1)
pc(2)=0
'求g點(diǎn)坐標(biāo)
Dim aa As Double
aa=L/Sqr(L*L+xjj*xjj)
pg(0)=pa(0)+Sqr(L* L+xjj*xjj)* Cos(Angpapk+Atn(-aa/Sqr(-aa*aa+1))+2* Atn(1))
pg(1)=pa(1)+ Sqr(L* L+xjj*xjj)* Sin(Angpapk+Atn(-aa/Sqr(-aa*aa+1))+2* Atn(1))
pg(2)=0
'求f點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pg,ppi+ Angpapk,T2)
pf(0)=tmp(0)
pf(1)=tmp(1)
pf(2)=0
'求j點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pf,Angpapk,100)
pj(0)=tmp(0)
pj(1)=tmp(1)
pj(2)=0
'求i點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pb,ppi/2 + dcj+Angpapk,R1)
pi(0)=tmp(0)
pi(1)=tmp(1)
pi(2)=0
'計算ac與cf線的夾角
Dim Angpcpa,Angpcpf,Angpipb,AngJJ1,Angpipd As Double
'pc到pa的角度
Angpcpa= ThisDrawing.Utility.AngleFromXAxis(pc,pa)
'pc到pf的角度
Angpcpf= ThisDrawing.Utility.AngleFromXAxis(pc,pf)
'求d點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pc,Angpcpf,T1)
pd(0)=tmp(0)
pd(1)=tmp(1)
pd(2)=tmp(2)
'pi到pb的角度
Angpipb= ThisDrawing.Utility.AngleFromXAxis(pi,pb)
'算出PaPcPf的角度
AngJJ1=ppi*2-Angpcpa+Angpcpf
'繪制直線ab及圓弧bd
Angpipd= ThisDrawing.Utility.AngleFromXAxis(pi,pd)
Call ThisDrawing.ModelSpace.AddLine(pa,pb)
Call ThisDrawing.ModelSpace.AddArc(pi, R1, Angpipb,Angpipd)
'求e點(diǎn)坐標(biāo)
tmp= ThisDrawing.Utility.PolarPoint(pd,Angpcpf,jzx)
pe(0)=tmp(0)
pe(1)=tmp(1)
pe(2)=tmp(2)
'計算ef與fg之間的角度
Dim Angpfpe,Angpfpg,Angphpe,Angphpg,AngJJ2As Double
'pf到pe的角度
Angpfpe= ThisDrawing.Utility.AngleFromXAxis(pf,pe)'pc到pf的角度
Angpfpg= ThisDrawing.Utility.AngleFromXAxis(pf,pg)
'算出PePfPg的角度
AngJJ2=ppi*2-Angpfpe+Angpfpg
'計算h點(diǎn)坐標(biāo)
tmp=ThisDrawing.Utility.PolarPoint(pe,2.5* ppi-AngJJ2+Angpapk,R2)
ph(0)=tmp(0)
ph(1)=tmp(1)
ph(2)=tmp(2)
'計算hg與he的角度
'ph到pe的角度
Angphpe= ThisDrawing.Utility.AngleFromXAxis(ph,pe)
'pc到pf的角度
Angphpg= ThisDrawing.Utility.AngleFromXAxis(ph,pg)
'繪制直線de和圓弧eg及gj
Call ThisDrawing.ModelSpace.AddLine(pd,pe)
Call ThisDrawing.ModelSpace.AddArc(ph,R2,Angphpg,Angphpe)
Call ThisDrawing.ModelSpace.AddLine(pg,pj)
End Sub
筆者從《鐵路工程設(shè)計技術(shù)手冊-站場及樞紐》一書中的岔后縮短曲線數(shù)據(jù)表中挑選了有代表性的10個曲線案例與利用VBA編程自動繪制的岔后縮短曲線進(jìn)行對比,結(jié)果發(fā)現(xiàn),二者完全吻合。由此證明本方法完全可以滿足岔后縮短曲線的繪制,并且還不受書中數(shù)據(jù)表有限的限制。
[1] 鐵道第四勘察設(shè)計院.鐵路工程設(shè)計技術(shù)手冊——站場及樞紐[M].北京:中國鐵道出版社,2009.
[2] 張國寶.AutoCAD2000VBA開發(fā)技術(shù)[M].北京:清華大學(xué)出版社,2000.
[3] 王若慧.基于VBA的AutoCAD二次開發(fā)及應(yīng)用實(shí)例[J].自動化技術(shù)與應(yīng)用,2007,26(9):30-33.