diff --git a/file_object.py b/file_object.py index 1f12623..c049cab 100644 --- a/file_object.py +++ b/file_object.py @@ -192,7 +192,7 @@ class TaFileObject: tower_number = s_entry[0] tower_height = s_entry[7] if tower_number in s_tower_height_dic: - continue# 只取第一次出现的。避免耐张段末端和首端不一致的问题。 + continue # 只取第一次出现的。避免耐张段末端和首端不一致的问题。 s_tower_height_dic[tower_number] = tower_height ta_content = self._read(self._file_path) new_ta_content = list(ta_content) @@ -267,7 +267,7 @@ class CordinationObject: continue sep = line.split(",") J_or_Z = sep[0][0] - pile = re.findall(r"[JZ]0*([0-9]+)", sep[0])[0] + pile = re.findall(r"[JZ]0*([0-9]+)", sep[0])[0] # 桩 JZ_pile = J_or_Z + pile # pile = sep[0][1:len(sep[0])] altitude = sep[1] @@ -287,3 +287,60 @@ class CordinationObject: def content(self): return self._content + + +class DFileObject: + def __init__(self, D_file_path): + _content = [] + with open(D_file_path) as D_file: + for _line in D_file: + line = re.sub(r"\s+", ",", _line) + _content.append(line.split(",")) + self._content = _content + + def content(self): + return self._content + + +class DFileAsSingle: + def __init__(self, d_files): + self._d_file_object = [] + for d in d_files: + self._d_file_object.append(DFileObject(d)) + + def content(self): + for d_object in self._d_file_object: + for c in d_object.content(): + yield c + + def float_content(self): + for c in self.content(): + yield [float(num) for num in c if num != ""] + + # 通过里程获取高程 + def get_altitude(self, mileage): + lower_mileage_altitude = None + upper_mileage_altitude = None + d_mileage = 0 + base_mileage = 0 + for d_content in self.float_content(): + if d_content[1] == 0: + base_mileage = d_mileage + d_mileage = base_mileage + d_content[1] + if d_mileage < mileage: + lower_mileage_altitude = (d_mileage, d_content[2]) + if d_mileage >= mileage: + upper_mileage_altitude = (d_mileage, d_content[2]) + break + if d_mileage == mileage: + return upper_mileage_altitude[1] + # 如果不是正好有高程,就线性插值。 + if d_mileage > mileage: + return ( + (mileage - lower_mileage_altitude[0]) + / (upper_mileage_altitude[0] - lower_mileage_altitude[0]) + * (upper_mileage_altitude[1] - lower_mileage_altitude[1]) + + lower_mileage_altitude[1] + ) + # 没有高程就返回None + return None diff --git a/generate_ta_from_csv.py b/generate_ta.py similarity index 56% rename from generate_ta_from_csv.py rename to generate_ta.py index d8ec234..9897913 100644 --- a/generate_ta_from_csv.py +++ b/generate_ta.py @@ -9,15 +9,72 @@ TA_XC_STRING_LENGTH = 9.5 TA_XC_TOWER_NAME = "WNSZ" TA_CONDUCTOR_TYPE = "LGJ-400/50" S_NC_STRING_NAME = "2*42-50" + + # 通过串型来判别是不是耐张塔 def is_tension_tower_by_string(string_name): if string_name == S_NC_STRING_NAME: return 2 return 1 - -# SFiles中的文件应该是按顺序排列的` -def generate_ta(TA_file, SFiles, cordination_file_path): +# SFiles中的文件必须是按顺序排列的` +def generate_ta_from_D(TA_file, SFiles, D_file_path): + visited_tower_number = {} # 记录访问过的塔号 + cord_file_object = CordinationObject(cordination_file_path) + with open(TA_file, "w") as file: + # 生成所有需要用到的数据 + last_S_mileage = 0 + for S in SFiles: + SObj = SFileObject(S) + S_content = SObj.content() + for S_entry in S_content: + if S_entry[0] == "首端转角号" or S_entry[0] == "塔号": + continue + tower_number = S_entry[0] + if tower_number not in visited_tower_number: + visited_tower_number[tower_number] = 0 + else: + continue + mileage = int(S_entry[1]) + last_S_mileage + tower_height = float(S_entry[7]) + angel = S_entry[5] + string_name = S_entry[8] + suspend_or_tension = is_tension_tower_by_string(string_name) + conductor_type = TA_CONDUCTOR_TYPE + # 1是悬垂 2是耐张 + if suspend_or_tension == 1: + string_length = TA_XC_STRING_LENGTH + conductor_suspension_poit = tower_height - string_length + pile_number = tower_number + ta_string_name = TA_XC_STRING_NAME + tower_name = TA_XC_TOWER_NAME + else: + string_length = TA_NC_STRING_LENGTH + conductor_suspension_poit = tower_height + pile_number = tower_number + ta_string_name = TA_NC_STRING_NAME + tower_name = TA_NC_TOWER_NAME + altitude = cord_file_object.get_altitude(pile_number) + file.write( + TA_ENTRY_TEMPLATE.format( + tower_number=tower_number, + suspend_or_tension=suspend_or_tension, + mileage=mileage, + conductor_suspension_poit=conductor_suspension_poit, + altitude=altitude, + pile_number=pile_number, + tower_name=tower_name, + tower_height=tower_height, + string_name=ta_string_name, + string_length=string_length, + angel=angel, + conductor_type=conductor_type, + ) + ) + last_S_mileage = float(S_content[-1][1]) + last_S_mileage + +# SFiles中的文件必须是按顺序排列的` +def generate_ta_from_csv(TA_file, SFiles, cordination_file_path): visited_tower_number = {} # 记录访问过的塔号 cord_file_object = CordinationObject(cordination_file_path) with open(TA_file, "w") as file: diff --git a/main.py b/main.py index e2f17f5..848e4d2 100644 --- a/main.py +++ b/main.py @@ -1,7 +1,8 @@ -import generate_ta_from_csv -from file_object import TaFileObject +import generate_ta +from file_object import TaFileObject, DFileAsSingle +from file_object import DFileObject -if __name__ == "__main__": +if __name__ == "__main__1": SFile = [ r"d:\工程\灵州-青山\排位\0-20\S000.DAT", r"d:\工程\灵州-青山\排位\20-72\S020.DAT", @@ -16,3 +17,12 @@ if __name__ == "__main__": # r"d:\工程\灵州-青山\排位\道亨\最终排位\最终排位.TA", SFile, r"d:\工程\灵州-青山\排位\道亨\最终排位\成果表-0120.csv" # ) print("Finished.") + +if __name__ == "__main__": + SFile = [r"d:\道亨排位\流程测试\S034.DAT"] + DFile = [r"d:\道亨排位\流程测试\D034.TXT", r"d:\道亨排位\流程测试\D038.TXT"] + ta_object = TaFileObject(r"d:\道亨排位\流程测试\ 流程测试\ 流程测试.TA", SFile) + d_file_object = DFileObject(r"d:\道亨排位\流程测试\D034.TXT") + d_as_single = DFileAsSingle(DFile) + print(d_as_single.get_altitude(1956+13)) + print("Finished.")