143 lines
4.6 KiB
Python
143 lines
4.6 KiB
Python
|
|
# 生成直曲表
|
||
|
|
|
||
|
|
import math
|
||
|
|
import numpy as np
|
||
|
|
|
||
|
|
#计算方位角
|
||
|
|
def azimuth(x1, y1, x2, y2):
|
||
|
|
dx = x2 - x1
|
||
|
|
dy = y2 - y1
|
||
|
|
if abs(dy) < 1e-6:
|
||
|
|
if dx > 0:
|
||
|
|
return 0
|
||
|
|
else:
|
||
|
|
return math.pi
|
||
|
|
theta = math.atan(dy / dx)
|
||
|
|
if dx < 0:
|
||
|
|
theta += math.pi
|
||
|
|
#print(dx, dy, theta / math.pi * 180)
|
||
|
|
return theta
|
||
|
|
|
||
|
|
#计算两点距离
|
||
|
|
def distance(x1, y1, x2, y2):
|
||
|
|
dx = x2 - x1
|
||
|
|
dy = y2 - y1
|
||
|
|
return math.sqrt(dx**2 + dy**2)
|
||
|
|
|
||
|
|
|
||
|
|
#平面资料表
|
||
|
|
sheet_surface = sheet("surface_statistics")
|
||
|
|
|
||
|
|
#直曲表
|
||
|
|
sheet_align = sheet("alignment_table")
|
||
|
|
|
||
|
|
#创建3*5矩阵 数据类型为64位浮点数 初始值为0
|
||
|
|
#用于存储中间数据
|
||
|
|
pm = np.zeros((3, 5), dtype = np.float64)
|
||
|
|
|
||
|
|
with sheet_surface:
|
||
|
|
jd = cell(0, 1).value
|
||
|
|
pm[0, 0] = cell(0, 2).value
|
||
|
|
pm[0, 1] = cell(0, 3).value
|
||
|
|
stt = cell(0, 7).value
|
||
|
|
|
||
|
|
with sheet_align:
|
||
|
|
sheet_align.clear_content()
|
||
|
|
sheet_align.initial()
|
||
|
|
|
||
|
|
cell(3, 0).value = jd
|
||
|
|
cell(3, 1).value = pm[0, 0]
|
||
|
|
cell(3, 2).value = pm[0, 1]
|
||
|
|
cell(3, 3).value = stt
|
||
|
|
|
||
|
|
for row in range(0, sheet_surface.row):
|
||
|
|
with sheet_surface:
|
||
|
|
if cell(row + 2, 2).empty():
|
||
|
|
break
|
||
|
|
|
||
|
|
pm[0,0] = cell(row, 2).value
|
||
|
|
pm[0,1] = cell(row, 3).value
|
||
|
|
jd = cell(row + 1, 1).value
|
||
|
|
|
||
|
|
for col in range(2, 7):
|
||
|
|
pm[1, col - 2] = cell(row + 1, col).value
|
||
|
|
pm[2, col - 2] = cell(row + 2, col).value
|
||
|
|
|
||
|
|
theta1 = azimuth(pm[0, 0], pm[0, 1], pm[1, 0], pm[1, 1])
|
||
|
|
theta2 = azimuth(pm[1, 0], pm[1, 1], pm[2, 0], pm[2, 1])
|
||
|
|
d = distance(pm[0, 0], pm[0, 1], pm[1, 0], pm[1, 1])
|
||
|
|
dtheta = theta2 - theta1
|
||
|
|
sign = 1
|
||
|
|
if dtheta < 0:
|
||
|
|
sign = -1
|
||
|
|
dtheta = abs(dtheta)
|
||
|
|
|
||
|
|
# 计算曲线要素
|
||
|
|
q1 = pm[1, 3] / 2 - pm[1, 3] ** 3 / (240 * pm[1, 2] ** 2) + pm[1, 3] ** 5 / (34560 * pm[1, 2] ** 4)
|
||
|
|
q2 = pm[1, 4] / 2 - pm[1, 4] ** 3 / (240 * pm[1, 2] ** 2) + pm[1, 4] ** 5 / (34560 * pm[1, 2] ** 4)
|
||
|
|
p1 = pm[1, 3] ** 2 / (24 * pm[1, 2]) - pm[1, 3] ** 4 / (2688 * pm[1, 2] ** 3) + pm[1, 3] ** 6 / (506880 * pm[1, 2] ** 5)
|
||
|
|
p2 = pm[1, 4] ** 2 / (24 * pm[1, 2]) - pm[1, 4] ** 4 / (2688 * pm[1, 2] ** 3) + pm[1, 4] ** 6 / (506880 * pm[1, 2] ** 5)
|
||
|
|
t1 = q1 + (pm[1, 2] + p2 - (pm[1, 2] + p1) * math.cos(dtheta)) / math.sin(dtheta)
|
||
|
|
t2 = q2 + (pm[1, 2] + p1 - (pm[1, 2] + p2) * math.cos(dtheta)) / math.sin(dtheta)
|
||
|
|
ly = pm[1, 2] * dtheta - (pm[1, 3] + pm[1, 4]) / 2
|
||
|
|
ll = ly + pm[1, 3] + pm[1, 4]
|
||
|
|
eh = (pm[1, 2] + p1 / 2 + p2 / 2) / math.cos(dtheta / 2) - pm[1, 2]
|
||
|
|
|
||
|
|
# 计算主点桩号
|
||
|
|
|
||
|
|
# 填写直曲表
|
||
|
|
cell(row + 4, 0).value = jd
|
||
|
|
cell(row + 4, 1).value = pm[1, 0]
|
||
|
|
cell(row + 4, 2).value = pm[1, 1]
|
||
|
|
if sign == 1:
|
||
|
|
cell(row + 4, 5).value = dtheta
|
||
|
|
else:
|
||
|
|
cell(row + 4, 4).value = dtheta
|
||
|
|
cell(row + 4, 6).value = pm[1, 2] #半径
|
||
|
|
cell(row + 4, 7).value = pm[1, 3] #第一缓和曲线
|
||
|
|
cell(row + 4, 8).value = pm[1, 4] #第二缓和曲线
|
||
|
|
cell(row + 4, 9).value = t1 #第一切线长
|
||
|
|
cell(row + 4, 10).value = t2 #第二切线长
|
||
|
|
cell(row + 4, 11).value = ll #曲线长
|
||
|
|
cell(row + 4, 12).value = eh #外距
|
||
|
|
cell(row + 4, 19).value = d #交点间距
|
||
|
|
|
||
|
|
t1_before = cell(row + 3, 9).value or 0
|
||
|
|
t2_before = cell(row + 3, 10).value or 0
|
||
|
|
ll_before = cell(row + 3, 11).value or 0
|
||
|
|
cell(row + 4, 18).value = cell(row + 4, 19).value - t2_before - cell(row + 4, 9).value #夹直线长度
|
||
|
|
cell(row + 4, 20).value = theta1 #计算方位角
|
||
|
|
cell(row + 4, 21).value = sign #路线左右偏代码
|
||
|
|
cell(row + 4, 13).value = cell(row + 3, 3).value - t1_before + ll_before + cell(row + 4, 18).value #ZH点桩号
|
||
|
|
cell(row + 4, 3).value = cell(row + 4, 13).value + cell(row + 4, 9).value #交点桩号
|
||
|
|
cell(row + 4, 17).value = cell(row + 4, 13).value + cell(row + 4, 11).value #HZ点桩号
|
||
|
|
cell(row + 4, 14).value = cell(row + 4, 13).value + cell(row + 4, 7).value #HY点桩号
|
||
|
|
cell(row + 4, 16).value = cell(row + 4, 17).value - cell(row + 4, 8).value #YH点桩号
|
||
|
|
cell(row + 4, 15).value = cell(row + 4, 14).value + ly / 2 #QZ点桩号
|
||
|
|
|
||
|
|
with sheet_surface:
|
||
|
|
pm[0, 0] = cell(row, 2).value
|
||
|
|
pm[0, 1] = cell(row, 3).value
|
||
|
|
jd = cell(row + 1, 1).value
|
||
|
|
|
||
|
|
for col in range(5):
|
||
|
|
pm[1, col] = cell(row + 1, col + 2).value
|
||
|
|
|
||
|
|
#计算方位角
|
||
|
|
theta1 = azimuth(pm[0, 0], pm[0, 1], pm[1, 0], pm[1, 1])
|
||
|
|
d = distance(pm[0, 0], pm[0, 1], pm[1, 0], pm[1, 1])
|
||
|
|
|
||
|
|
#填写直曲表
|
||
|
|
cell(row + 4, 0).value = jd
|
||
|
|
cell(row + 4, 1).value = pm[1, 0]
|
||
|
|
cell(row + 4, 2).value = pm[1, 1]
|
||
|
|
cell(row + 4, 19).value = d
|
||
|
|
cell(row + 4, 18).value = cell(row + 4, 19).value - cell(row + 3, 10).value - (cell(row + 4, 9).value or 0)
|
||
|
|
cell(row + 4, 3).value = cell(row + 3, 17).value + cell(row + 4, 18).value
|
||
|
|
cell(row + 4, 20).value = theta1
|
||
|
|
|
||
|
|
sheet_align.fit_content()
|
||
|
|
|
||
|
|
script_file = os.path.join(config.script_path,"create_linear_feature.py")
|
||
|
|
window.load_script(script_file)
|