#导入测量的轨道数据 import re from PyQt6.QtWidgets import QFileDialog import color def get_filename(filename = None): if not filename: if hasattr(get_filename, "filename"): path_hint = os.path.dirname(get_filename.filename) else: path_hint = "" filename, _ = QFileDialog.getOpenFileName(window, "从DAT文件导入数据", path_hint, "DAT数据文件(*.dat *.DAT)") if not filename: return if len(filename) < 4 or filename[-4:].lower() != ".dat": filename += ".dat" filename = filename.replace("\\", "\\\\") filename = filename.replace("\"", "\\\"") return filename def load_measure_data(file_name): with open(file_name, "r") as fobj: raw = fobj.readlines() flag = False r1 = [] for line in raw: line = line.strip() match = re.match(r"For\s+M5\|Adr\s+", line) if match is None: raise RuntimeError("Unrecognized data: {line}") m = match.group(0) pos = len(m) line = line[pos:] match = re.match(r"\d+\|([0-9A-Z]+)\s+", line) if match is None: raise RuntimeError("Unrecognized data: {line}") m = match.group(0) pos = len(m) line = line[pos:] match = re.match(r"[0-9a-zA-Z\.\-]+", line) if match is None: raise RuntimeError("Unrecognized data: {line}") label = match.group(0) pos = len(label) line = line[pos:] match = re.match(r"KZ\d*", label) if not match is None: label = match.group(0) pos = len(label) line = line[pos:] #print("控制点", label, line) continue if label == "Intermediate": flag = True continue if label == "End": flag = False continue if not flag: continue match = re.match(r"[A-Z]*\d+[\.\-]\d+", label) if match is None: continue data = line.split("|") data = data[3] match = re.match(r"[0-9a-zA-Z]+\s+(\d+\.\d+)", data) if match is None: raise RuntimeError(f"找不到所需数据: {data}") data = match.group(1) #print("轨道点", label, data) r1.append([label, data]) r2 = [] for label, data in r1: match = re.match(r"([A-Z]*)(\d+)[\.\-](\d+)", label) l = match.group(1) d1 = int(match.group(2)) d2 = int(match.group(3)) d3 = float(data) r2.append([l, d1, d2, d3]) r2.sort(key = lambda x: (x[1], x[2])) # for line in r2: # print(f"{line[0]}{line[1]}.{line[2]} {line[3]}") return r2 filename = get_filename() if filename: #轨道数据表 sheet_measure = sheet("measure_data") data = load_measure_data(filename) sheet_measure.clear_content() with sheet_measure: for line in data: label = "%s%d.%d" % tuple(line[:3]) row = line[1] - 1 flag = line[2] > 1 if line[2] > 2: print(f"{color.yellow}警告{color.nc}:编号{label}第2个数字大于2,当作右轨处理") data = line[3] if flag: cell(row, 2).value = label cell(row, 3).value = data else: cell(row, 0).value = label cell(row, 1).value = data sheet_measure.fit_content()