# 计算中桩设计高程 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()