data_process_ui/app/script/calc_elevation.py
2026-01-12 09:21:42 +08:00

68 lines
1.8 KiB
Python

# 计算中桩设计高程
import color
#纵断面表
sheet_longitudinal = sheet("longitudinal_profile")
#坐标计算表
sheet_coord = sheet("coord_calc")
def sgn(x):
if x > 0:
return 1
if x < 0:
return -1
return 0
def calc_elevation():
with sheet_longitudinal:
row = 0
while not cell(row, 0).empty():
row += 1
if row < 2:
print(f"{color.red}错误{color.nc}:纵断面表缺少高程设计数据")
return
max_row = row
min_chainage = cell(0, 0).value
max_chainage = cell(max_row - 1, 0).value
row = 2
d = 0
while not sheet_coord[row, 1].empty():
chainage = sheet_coord[row, 1].value
if min_chainage <= chainage <= max_chainage:
row2 = 1
while not cell(row2, 0).empty():
if chainage < cell(row2, 0).value:
break
row2 = row2 + 1
start_chainage = cell(row2 - 1, 0).value #起始里程
end_chainage = cell(row2, 0).value #终止里程
if cell(row2 - 1, 2).empty():
start_radius = None
else:
start_radius = cell(row2 - 1, 2).value * sgn(cell(row2, 4).value - cell(row2 - 1, 4).value) #起始半径
end_radius = cell(row2, 2).value * sgn(cell(row2 + 1, 4).value - cell(row2, 4).value) #终止半径
start_t = cell(row2 - 1, 6).value or 0 #起始切线长
end_t = cell(row2, 6).value #终止切线长
start_h = cell(row2 - 1, 1).value #起始高程
ratio = cell(row2, 4).value / 100 #坡度
elevation = start_h + (chainage - start_chainage) * ratio
if chainage < start_chainage + start_t:
d = (start_chainage + start_t - chainage) ** 2 / 2 / start_radius
elif chainage > end_chainage - end_t:
if end_t < 0.000001:
d = 0
else:
d = (chainage - end_chainage + end_t) ** 2 / 2 / end_radius
elevation += d
sheet_coord[row, 5].value = elevation
row += 1
calc_elevation()