# 生成直曲表 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)