基于Excel VBA的盾构中心线计算程序设计
2014-04-18苏小文高俊强
苏小文,高俊强
(1. 南京工业大学 测绘学院,江苏 南京 210009)
基于Excel VBA的盾构中心线计算程序设计
苏小文1,高俊强1
(1. 南京工业大学 测绘学院,江苏 南京 210009)
为克服现有盾构中心线计算软件难以解决曲线出洞和断链等问题,结合工程实际,采用Excel VBA进行二次开发。使用表明,程序计算准确,计算误差达mm级,且便于修改,很好地解决了以前计算方式的不足。
盾构中心线;Excel VBA;程序
盾构施工中,盾构中心线的计算是一项很重要的工作[1]。目前常用的方法有手工计算和程序计算。手工计算工作量大,且容易出错。现有的多种计算程序虽能实现三维坐标的批量快速计算,但存在许多不足。如海瑞克的计算软件,默认管片距为1.0 m,而国内通常为1.2 m;三维坐标计算必须从直线段算起,难以满足曲线出洞的需要;也难以处理断链问题。为解决以上问题,采用首环计算和非首环计算的思想,基于Excel VBA进行程序开发。
1 线路模型
1.1 平面曲线模型
盾构平面轴线设计一般由直线、圆曲线和缓和曲线组成。
1.1.1 直线模型
假设控制点A的坐标为(XA,YA),控制点到待定点的坐标方位角为α,两点间距离为l,则待定点坐标可按下式计算:
1.1.2 圆曲线模型
图1 圆曲线示意图
如图1,以曲线起点ZY(或终点YZ)为坐标原点,其切线为x轴,过ZY点(或YZ点)的半径为y轴,建立直角坐标系。根据曲线上任意一点i的曲线长li及半径R来确定i点的坐标xi与yi。建立参数方程[2]:
以代入上式并用级数展开,可得圆曲线参数方程:
i的坐标是在局部坐标系下的,需转换为工程坐标系下的坐标:
上式中,按计算方向,曲线右偏时δ取+1,左偏时δ取-1。
1.1.3 缓和曲线模型
以ZH点为原点,过ZH点的缓和曲线的切线为x轴,ZH点上缓和曲线的半径为y轴,建立直角坐标系。采用切线支距法计算标准缓和曲线上任意点的坐标[3]:
在盾构推进过程中,由于存在超高h和超距e的影响,缓和曲线方程变为:
式中,l0为缓和曲线长;li为以ZH点起算的弧长;e为偏移量;R为圆曲线半径。在具体设计中,大部分将偏移后的曲线方程表现成以下两个方程[4]:
式中,a、b、c、d为缓和曲线的待定系数;l0为缓和曲线长;R1为偏移后的圆曲线半径。
为了能在直线和圆曲线之间插入缓和曲线,必须将原有圆曲线向内移动一定的距离p。通常采用圆心不动、半径减小,待定系数a可通过偏移后曲线终点的横坐标求之;同时纵坐标也为b、c、d的求解提供了一个条件,再找异于起点和终点的两点坐标即可求出b、c、d[5]。将x、y代入式(4),计算出工程坐标。
1.2 竖曲线模型
如图2,已知竖曲线起点A及其高程HA、曲中点B、坡度i1、i2、竖曲线半径R、离开A的里程x。纵断面上的曲折角可以认为α = ∆i = i1-i2,i1、i2为两相邻的纵向坡度值。若α>0,表示竖曲线为凸曲线;反之,则是凹曲线。两种模型如下[6]。
凸曲线模型:
图2 竖曲线示意图
2 程序设计
2.1 计算程序编制
程序设计思路如下:模型分段分类存储曲线的要素,并根据实际需要,分里程从小到大和从大到小2种计算方式,按首环计算和非首环计算2种形式,考虑可能存在的断链。
2.1.1 首环计算
在对应线型中输入特征点数据、起始方位角和首环距特征点距离。若数据为空,则报错提醒输入数据。根据首环距就可以推算第一环里程。由于每环为1.2 m,可以算出线型内每一环里程。套用模型公式,算出每一环 和 坐标,当管片里程和最后特征点里程差小于1.2 m计算完毕,输出计算结果。
以缓和曲线为例,部分主要代码如下:
1)对输入参数定义并赋值。
Dim shj, fwjdfm, fwj, zhlc, zhx, zhy, hylc, hyx, hyy, a, b, c, d, l0, r, li, l, xi, yi, x, y, kk, fjlc, fjx, fjy As Double
Dim qcgpj, hcgpj, qclc, hclc, qcx, qcy, qch, hcx, hcy, hch, qcxi, qcyi, hcxi, hcyi, qcfjlc, hcfjlc, qcfjx, qcfjy, hcfjx, hcfjy, qcli, hcli As Double
Dim n, i, p As Integer
Dim tempmsgbox As VbMsgBoxResult
pi = Application.pi()
shj = Range("e8").Value
fwjdfm = Range("g8").Value
zhlc = Range("E9").Value
zhx = Range("E10").Value
zhy = Range("E11").Value
hylc = Range("h9").Value
hyx = Range("h10").Value
hyy = Range("h11").Value
a = Range("E16").Value
b = Range("g16").Value
c = Range("E17").Value
d = Range("g17").Value
r = Range("g18").Value
2)判断输入是否齐全。
If shj = "" Or zhlc = "" Or fwjdfm = "" Or zhx = "" Or zhy = "" Or hylc = "" Or hyx = "" Or hyy = "" Or a = "" Or b = "" Or c = "" Or d = "" Or r = "" Then
tempmsgbox = MsgBox("请回输入初始参数", vbOKOnly, "错误1")
Exit Sub
End If
3)判断计算方式并通过公式计算。
If Worksheets("三维坐标计算").CheckBox1.Value = True Then ’从小里程到大里程
fwj = (Int(fwjdfm) + Int((fwjdfm - Int(fwjdfm)) * 100) / 60 + (fwjdfm * 10000 - Int(fwjdfm) * 10000 -Int((fwjdfm - Int(fwjdfm)) * 100) * 100) / 3600) * pi / 180’角度换算弧度
If hylc > zhlc Then ’直线到圆的缓和曲线
fjlc = zhlc + shj
n = Int((hylc - fjlc) / 1.2)
For i = 0 To n ’缓和曲线坐标计算
li = shj + i * 1.2
qcli = li + qcgpj
hcli = li + hcgpj
l = li + zhlc
qclc = l + qcgpj
hclc = l + hcgpj
p = i + 3
xi = li - (li * li * li * li * li) / a / (r * r) / (l0 * l0)
yi = b * xi * xi * xi - c * xi * xi + d * xi
qcxi = qcli - (qcli * qcli * qcli * qcli * qcli) / a / (r * r) / (l0 * l0)
qcyi = b * qcxi * qcxi * qcxi - c * qcxi * qcxi + d * qcxi
hcxi = hcli - (hcli * hcli * hcli * hcli * hcli) / a / (r * r) / (l0 * l0)
hcyi = b * hcxi * hcxi * hcxi - c * hcxi * hcxi + d * hcxi
If Worksheets("三维坐标计算").OptionButton1. Value = True Then ’曲线左转
x = zhx + xi * Cos(fwj) + yi * Sin(fwj)
y = zhy + xi * Sin(fwj) - yi * Cos(fwj)
qcx = zhx + qcxi * Cos(fwj) + qcyi * Sin(fwj)
qcy = zhy + qcxi * Sin(fwj) - qcyi * Cos(fwj)
hcx = zhx + hcxi * Cos(fwj) + hcyi * Sin(fwj)
hcy = zhy + hcxi * Sin(fwj) - hcyi * Cos(fwj)
End If
2.1.2 非首环计算
非首环计算的关键在于提取上一环的里程和平面坐标,其他计算和首环计算一致。
提取上环里程和平面坐标的代码如下:
tempx = Worksheets("三维坐标").Range("b65536").End(xlUp).Row
p = Worksheets("三维坐标").Range("a" & tempx).Value ’P为上一环环数
plc = Worksheets("三维坐标").Range("b" & tempx).Value ’plc为上一环里程
2.1.3 断链处理
断链有长链和短链之分:断前里程-断后里程>0,长链;断前里程-断后里程<0,短链[7]。我们称断链前里程为新里程dllxc,断链后里程为旧里程dljlc,里程差lcc。为计算断链后各环的里程,需先判别断链是长链还是短链,同时计算长、短断链值。计算思路如下:
lcc=lxc-jlc,长链lcc>0,短链lcc<0,则断链后任意环里程l=l-lcc。具体代码如下:
lcc = dlxlc - dljlc
If l >= dlxlc Then
l = l - lcc
End If
2.1.4 高程计算
平面计算结束后每一环都有了里程,高程只需根据每一环里程对应的设计线型加以计算。判别代码为:
For Each temprag In Worksheets("三维坐标").Range ("b2:b" & Worksheets("三维坐标").Range ("b65536").End(xlUp).Row)’temprag为每一环里程
If (temprag.Value >= stzdlc And temprag.Value <= mtzdlc) Then
li = temprag.Value - stzdlc
li2 = mtzdlc - temprag.Value
2.2 实例应用
利用本程序计算无锡一号线某区间盾构中心线三维坐标,各线型中选取一环,将结果与手算结果比较,最大计算误差为0.4 mm,完全满足施工需要。
[1] 陈祥,饶雪平.轨道交通盾构推进中心坐标计算软件[J].中国市政工程,2007(4):78-80
[2] 王维.地铁盾构法施工人工导向测量研究[D].南京:南京工业大学,2008
[3] 李青岳.工程测量学[M].北京:测绘出版社,1995
[4] 王荣,杨雪.计算隧道轴线三维坐标偏差方法的介绍及探讨[J].测绘技术装备,2011,2(13):37-39
[5] 冉利刚.地铁隧道偏移计算方法探讨[J].隧道地下工程,2009(1):79-83
[6] 张德海.地铁隧道盾构自动定位系统开发研究[D].上海:同济大学,2006
[7] 郝红彬.公路线路断链编程计算及平面中线编程绘制[J].山西建筑,2003,29(13):112-113
[8] 李文军,唐争气,周青山.基于Excel全路线三维坐标计算与实现[J].电脑编程技巧与维护,2011(10):22-24
P258
B
1672-4623(2014)06-0129-03
10.3969/j.issn.1672-4623.2014.06.045
苏小文,硕士,研究方向为精密工程测量。
2013-07-12。