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

72 lines
2.1 KiB
Python

#计算轨道数据
import numpy as np
import color
#轨道数据表
sheet_measure = sheet("measure_data")
def linear_regression(x, y):
n = x.size
sx = x.sum()
sx2 = (x ** 2).sum()
sy = y.sum()
sxy = (x * y).sum()
delta = n * sx2 - sx ** 2
a = (n * sxy - sx * sy) / delta
b = (sx2 * sy - sx * sxy) / delta
return a, b
def calc_measure_data():
diff_param = param("height_diff_param").strip()
if not diff_param:
print(f"{color.yellow}警告:{color.nc}缺少高差参数")
diff_param = 0
else:
diff_param = float(diff_param)
with sheet_measure:
row = 0
left = []
right = []
while not cell(row, 1).empty():
left.append(cell(row, 1).value)
right.append(cell(row, 3).value)
row += 1
left = np.array(left, dtype = np.float64)
right = np.array(right, dtype = np.float64)
n = left.size
index = np.array(range(left.size), dtype = np.float64)
h_diff = (left - right) * 1000 + diff_param
# left_a, left_b = linear_regression(index, left)
# right_a, right_b = linear_regression(index, right)
left_a = (left[-1] - left[0]) / (n - 1)
left_b = left[0]
right_a = (right[-1] - right[0]) / (n - 1)
right_b = right[0]
left_diff = (left - left_a * index - left_b) * 1000
right_diff = (right - right_a * index - right_b) * 1000
left_diff2 = left_diff[1: -1] - (left_diff[2:] + left_diff[:-2]) / 2
right_diff2 = right_diff[1: -1] - (right_diff[2:] + right_diff[:-2]) / 2
for row, data in enumerate(h_diff):
cell(row, 4).value = data
for row, data in enumerate(left_diff):
cell(row, 5).value = data
for row, data in enumerate(right_diff):
cell(row, 6).value = data
for row, data in enumerate(left_diff2):
cell(row + 1 , 7).value = data
for row, data in enumerate(right_diff2):
cell(row + 1 , 8).value = data
graph("road_graph").plot(index, left, "左轨", index, right, "右轨")
graph("road_relative_graph").plot(index, left_diff, "左轨", index, right_diff, "右轨")
graph("road_horizon_graph").plot(index, h_diff, "轨道水平")
graph("road_concave_graph").plot(index[1:-1], left_diff2, "左轨", index[1:-1], right_diff2, "右轨")
calc_measure_data()
sheet_measure.fit_content()