1.加入读取D文件功能。

This commit is contained in:
facat 2020-05-08 14:56:31 +08:00
parent 65ef2f5685
commit a29fee1644
3 changed files with 132 additions and 8 deletions

View File

@ -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

View File

@ -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:

16
main.py
View File

@ -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.")