APP下载

基于VBA的AutoCAD二次开发站场道岔绘制

2013-09-04黄冠涛吴德芳赵加奎

机械工程与自动化 2013年6期
关键词:切点站场道岔

黄冠涛,吴德芳,赵加奎

(中铁二院 昆明勘察设计研究院有限责任公司,云南 昆明 650200)

0 引言

在铁路站场平面布置图的绘制过程中,道岔绘制是一个重要的组成部分,所耗费的时间也多,因此提高道岔绘制速度可大大提高工作效率。在传统的道岔绘制过程中,主要是采用查表法进行手工绘制。对于一般的道岔(如单开道岔),可以根据道岔表[1]的参数手动快速绘制出,对于复杂道岔(如岔后缩短曲线、切线不平行无缓和曲线的反向缩短曲线)也可以通过查表法进行手动绘制,但是存在着两个缺陷:一是复杂道岔参数多,需要绘制辅助线;二是查表法存在局限性,如果表中没有需要的数据只能根据公式进行手工计算,然后再根据辅助线进行绘制,这种绘制方法操作时间长,工作量大。针对这种情况,本文提出了在Auto-CAD的平台上用VBA对其进行二次开发,对需要的数据进行参数化,自动绘制复杂道岔,并以岔后缩短曲线为例对本方法进行验证。

1 道岔选择

在实际铁路站场平面布置图中道岔的类型很多,诸如单开道岔、对称道岔、交叉渡线等。对于这些简单的道岔可以直接根据道岔的型号和类型在AutoCAD里面绘制,体现不出复杂道岔自动化绘制的优势,因此,本文选择稍微复杂的道岔——后缩短曲线作为案例对象。

2 VBA编程设计思路

为了在复杂道岔绘制过程中使用方便,本设计采用可视化参数绘图的原则进行设计。可视化参数绘图的设计流程如图1所示。

3 可视化参数绘图界面

为提高本设计方案的可操作性,根据道岔的特点以及所需的相关参数设计对应的可视化界面,如图2所示。

图1 可视化参数绘图的设计流程

图2 道岔绘制可视化界面图

4 代码实现

针对岔后缩短曲线的特点,首先对岔后缩短曲线进行抽象化处理,定义出各相关点,如图3所示。

图3中,a点为岔心,k点为岔后直线上任一点,其他点都是由输入的参数根据《铁路工程设计技术手册-站场及枢纽》中的相关公式进行计算确定的。

图3 岔后缩短曲线抽象示意图

最后编制的相关代码如下:

Sub绘制岔后缩短曲线_Click()

Dim pa(0To 2)As Double'道岔岔心

Dim pb(0To 2)As Double'切点一

Dim pc(0To 2)As Double'交点一

Dim pd(0To 2)As Double'切点二

Dim pe(0To 2)As Double'切点三

Dim pf(0To 2)As Double'交点二

Dim pg(0To 2)As Double'切点四

Dim ph(0To 2)As Double'圆心二

Dim pi(0To 2)As Double'圆心一

Dim pj(0To 2)As Double'直线点,与pf对应

Dim pk(0To 2)As Double'岔后直线任一点

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线角度,即基础线的旋转角度

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("请确认输入数据!")'防止输错数据

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 & "选择岔心:")'选择相对初始点

pa(0)=cc(0)

pa(1)=cc(1)

pa(2)=cc(2)

cc= ThisDrawing.Utility.GetPoint(,vbCrLf & "选择岔后直线上任一点:")'选择相对终点

pk(0)=cc(0)

pk(1)=cc(1)

pk(2)=cc(2)

Angpapk= ThisDrawing.Utility.AngleFromXAxis(pa,pk)'计算出ak线与X轴的夹角

pa(2)=0'定义a点的Z坐标为0

pk(2)=0'定义k点的Z坐标为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

'计算相关参数-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点坐标

tmp= ThisDrawing.Utility.PolarPoint(pa,dcj+ Angpapk,chzx)

pb(0)=tmp(0)

pb(1)=tmp(1)

pb(2)=0

'求c点坐标

tmp= ThisDrawing.Utility.PolarPoint(pa,dcj+ Angpapk,chzx+T1)

pc(0)=tmp(0)

pc(1)=tmp(1)

pc(2)=0

'求g点坐标

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点坐标

tmp= ThisDrawing.Utility.PolarPoint(pg,ppi+ Angpapk,T2)

pf(0)=tmp(0)

pf(1)=tmp(1)

pf(2)=0

'求j点坐标

tmp= ThisDrawing.Utility.PolarPoint(pf,Angpapk,100)

pj(0)=tmp(0)

pj(1)=tmp(1)

pj(2)=0

'求i点坐标

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点坐标

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点坐标

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点坐标

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

5 结果验证

笔者从《铁路工程设计技术手册-站场及枢纽》一书中的岔后缩短曲线数据表中挑选了有代表性的10个曲线案例与利用VBA编程自动绘制的岔后缩短曲线进行对比,结果发现,二者完全吻合。由此证明本方法完全可以满足岔后缩短曲线的绘制,并且还不受书中数据表有限的限制。

[1] 铁道第四勘察设计院.铁路工程设计技术手册——站场及枢纽[M].北京:中国铁道出版社,2009.

[2] 张国宝.AutoCAD2000VBA开发技术[M].北京:清华大学出版社,2000.

[3] 王若慧.基于VBA的AutoCAD二次开发及应用实例[J].自动化技术与应用,2007,26(9):30-33.

猜你喜欢

切点站场道岔
输气站场危险性分析
抛物线的切点弦方程的求法及性质应用
中低速磁浮道岔与轮轨道岔的差异
场间衔接道岔的应用探讨
既有线站改插铺临时道岔电路修改
一种伪内切圆切点的刻画办法
椭圆的三类切点弦的包络
铁路站场EBS工程量分解
KJH101-127型气动司控道岔的改造
特殊站场引导信号电路设计