1.完成了基本的考虑耐张串重弧垂的功能。

This commit is contained in:
n3040 2022-07-25 02:05:08 +08:00
parent 5d2bb00e2c
commit 0555479ab4
2 changed files with 152 additions and 29 deletions

View File

@ -11,10 +11,12 @@ class SEntry:
mileage_in_s: int = 0
back_k: float = 0
forth_k: float = 0
altitude_off: float = 0
altitude_off: float = 0#中心桩高差
foundation_low: float = 0 # 基降
fitting: str = "" # 金具
is_tension_tower: bool = False
back_representive_span: float = 0 # 代表档距
forth_representive_span: float = 0 # 代表档距
class SFile:
@ -26,8 +28,9 @@ class SFile:
tower_dic = self.tower_dic
with open(s_file_path, encoding="gbk") as s_file_obj:
new_k = 0
new_reprtv_span = 0
last_k = -1
# next_is_tension_tower=False
last_reprtv_span = -1
last_tower_name = ""
for line in s_file_obj:
norm_line = line.strip()
@ -35,6 +38,9 @@ class SFile:
continue
if "首端转角号" in norm_line:
new_k = float(norm_line.split(":")[-1].replace("E", "e")) # 模板系数
new_reprtv_span = float(
re.findall("代表档距 : (\d+) 模板系数", norm_line)[0]
) # 代表档距
continue
if "塔号" in norm_line:
# next_is_tension_tower=True
@ -48,19 +54,20 @@ class SFile:
tower_dic[tower_name].forth_k = new_k # 更新耐张塔前侧k值。
continue
s_entry = SEntry()
# s_entry.is_tension_tower=next_is_tension_tower
# next_is_tension_tower=False
s_entry.tower_name = tower_name
last_tower_name = tower_name
s_entry.tower_type = sep_entry[6]
s_entry.tower_height = float(sep_entry[7])
s_entry.mileage_in_s = float(sep_entry[1])
s_entry.back_k = last_k
s_entry.back_representive_span = last_reprtv_span
s_entry.forth_k = new_k
s_entry.forth_representive_span = new_reprtv_span
s_entry.altitude_off = float(sep_entry[3])
s_entry.foundation_low = float(sep_entry[4])
s_entry.fitting = sep_entry[8]
last_k = s_entry.forth_k
last_reprtv_span = s_entry.forth_representive_span
tower_dic[tower_name] = s_entry
tower_dic[list(tower_dic.keys())[-1]].forth_k = -1
tower_dic[list(tower_dic.keys())[0]].is_tension_tower = True
@ -85,3 +92,8 @@ class Fitting:
fit_name = fit[0]
fit_parameter = next(ite)
self.fitting_length_dic[fit_name] = float(fit_parameter[2]) / 1000
@define
class ColorEnume:
wire_color_rgb=[122, 219, 245]
tree_color_rgb=[122, 219, 245]
ground_color_rgb=[116, 230, 165]

161
main.py
View File

@ -1,12 +1,13 @@
from tkinter.messagebox import NO
import xlwings as xw
from PWFile import SFile, Fitting
from PWFile import SFile, Fitting,ColorEnume
from Apyautocad import Apyautocad, APoint
import os
import re
import numpy as np
from time import sleep
from attrs import define
from typing import List
# 读取Z文件找到Z断面第一个点的坐标
def plane_z_origin(z_file_path):
@ -33,20 +34,34 @@ def curve_fun(x, span, k, gaocha):
return x * gaocha / span - x * (span - x) * k
def np2d_to_array(np2d): # 把2维numpy数组转换成cad可以用的数组
t = np.hstack((np2d, np.zeros((np2d.shape[0], 1)))).reshape(1, np2d.shape[0] * 3)
return t[0]
class StringImpactExcel:
def __init__(self) -> None:
# self._wb=None
pass
def read(self, wb):
# with xw.App(visible=True) as app:
def read(self, wb, gaocha, span, tension):
pos代表档距 = "F13"
pos档距 = "L13"
pos高差 = "R13"
pos张力 = "AB18"
pos档距21 = "E25"
pos总串长 = "C8"
sheet = wb.sheets["3225-3226"]
print(sheet.range("V25:V46").value)
sheet.range(pos高差).value = gaocha
sheet.range(pos档距).value = span
sheet.range(pos张力).value = tension
string_length = sheet.range(pos总串长).value
# print(sheet.range("V25:V46").value)
x = np.linspace(string_length, span, int(span / 5), endpoint=True)
x[0] = sheet.range("E23").value
x[1]=sheet.range("E24").value
sheet.range(f"E25:E{25+len(x)-3}").value = x[2:].reshape(len(x[2:]), 1)
y = np.array(sheet.range(f"V23:V{23+len(x)-1}").value)/2#表格是乘以了2的为了和x保持一致没有乘比例。
return (x, y)
def set_true_color(object, r, g, b):
@ -55,6 +70,94 @@ def set_true_color(object, r, g, b):
object.TrueColor = true_color
@define
class StringImpactPlate:
_dwg_file_path: str
_s_file_path: str
_draw_tower_name: List[str]
# _tension_section:int#耐张段数量
_continouse_tension_excel: str
_string_impact_curve_excel: str
def _find_target_towe_index(self, tower_name_list: List[str]):
index = []
for foo in self._draw_tower_name:
index.append(tower_name_list.index(foo))
return index
def draw(self):
# 计算代表档距
s_file = SFile()
s_file.open(self._s_file_path)
tower_dict = s_file.tower_dic
tower_key_list = list(tower_dict.keys())
draw_tower_index = self._find_target_towe_index(tower_key_list)
fitting_file_path = deduce_fit_db_from_cad_path(self._dwg_file_path)
fitting = Fitting(fitting_file_path)
z_file_path = deduce_zfile_from_cad_path(self._dwg_file_path)
plate_origin = plane_z_origin(z_file_path)
with xw.App(visible=True) as excel_app, Apyautocad(
create_if_not_exists=True, visible=True, auto_close=False
) as cad:
continouse_wb = excel_app.books.open("张力计算(临界档距公式法V20090602)-送电室版).xls")
continouse_sheet = continouse_wb.sheets["2710导线-单回1250-70"]
wb_string_impact = excel_app.books.open(
"特高压耐张串影响弧垂计算送电室2018人员版1122-1218.xls"
)
stringImpactExcel = StringImpactExcel()
cad.app.Documents.Open(self._dwg_file_path)
sleep(1)
for draw_tower_foo in draw_tower_index:
draw_tower_key = tower_key_list[draw_tower_foo]
tower_info = tower_dict[draw_tower_key]
forth_reprtv_span = tower_info.forth_representive_span
continouse_sheet.range("B69").value = forth_reprtv_span
high_temperature_tension = continouse_sheet.range("L69").value
forth_tower_info = tower_dict[tower_key_list[draw_tower_foo + 1]]
gaocha = (
(
forth_tower_info.tower_height
- forth_tower_info.foundation_low
- fitting.fitting_length_dic[forth_tower_info.fitting]
)
- (
tower_info.tower_height
- tower_info.foundation_low
- fitting.fitting_length_dic[tower_info.fitting]
)
+ forth_tower_info.altitude_off
)
span = forth_tower_info.mileage_in_s - tower_info.mileage_in_s
(x, y) = stringImpactExcel.read(
wb_string_impact, gaocha, span, high_temperature_tension
)
# TODO: 计算累计里程和高差
plot_x = (plate_origin[0] + x / 5).reshape(len(x), 1)
plot_y = (plate_origin[1] + (tower_info.tower_height-tower_info.foundation_low+ y)*2 ).reshape(len(x), 1)
plot_vector = np2d_to_array(np.hstack((plot_x, plot_y)))
added_curve=cad.model.AddPolyLine(plot_vector)
set_true_color(added_curve,*ColorEnume.wire_color_rgb)
plot_ground_y=plot_y-18*2
plot_ground_vector=np2d_to_array(np.hstack((plot_x, plot_ground_y)))
added_ground_curve = cad.model.AddPolyLine(plot_ground_vector)
set_true_color(added_ground_curve, *ColorEnume.ground_color_rgb)
plot_tree_y = plot_y - 13.5 * 2
plot_tree_vector = np2d_to_array(np.hstack((plot_x, plot_tree_y)))
added_tree_curve = cad.model.AddPolyLine(plot_tree_vector)
set_true_color(added_tree_curve, *ColorEnume.tree_color_rgb)
pass
# can_start=False
# tower_dict_iterator=iter(list(tower_dict.keys()))
# for tower_info_key in tower_dict_iterator:
# tower_info=tower_dict[tower_info_key]
# if tower_info.tower_name==self._draw_tower_name:
# if tower_info.is_tension_tower==False:
# raise Exception('耐张段影响弧垂第1基塔不是耐张塔')
# can_start=True
# if can_start:
@define
class ContinuousPlate:
_dwg_file_path: str
@ -71,6 +174,11 @@ class ContinuousPlate:
# stringImpactExcel = StringImpactExcel()
# stringImpactExcel.read(wb_string_impact)
dwg_file_path = self._dwg_file_path
# with xw.App(visible=False) as app:
# wb = app.books.open('张力计算(临界档距公式法V20090602)-送电室版).xls')
# sheet = wb.sheets['2710导线-单回1250-70']
# sheet.range('B69').value=120
# print(sheet.range('L69').value)
with Apyautocad(
create_if_not_exists=True, visible=False, auto_close=False
) as cad:
@ -86,14 +194,14 @@ class ContinuousPlate:
accu_mileage = 0 # 累计档距
accu_altitude_off = 0 # 累计高差
is_first_tower = True
can_start_draw=-1
start_tower_name=self._from_tower_name
draw_count=0
can_start_draw = -1
start_tower_name = self._from_tower_name
draw_count = 0
for tower in s_file.tower_dic:
tower_info = s_file.tower_dic[tower]
if tower_info.tower_name==start_tower_name:
can_start_draw=0
if can_start_draw<0 or draw_count>self._draw_tower_count-1:
if tower_info.tower_name == start_tower_name:
can_start_draw = 0
if can_start_draw < 0 or draw_count > self._draw_tower_count - 1:
break
if not last_tower_info:
last_tower_info = tower_info
@ -131,7 +239,7 @@ class ContinuousPlate:
)
# 画杆高
cad.model.AddLine(tower_start, tower_end)
draw_count+=1
draw_count += 1
# 画弧垂
if not is_first_tower: # 从第二基塔开始画
draw_k = tower_info.back_k
@ -198,7 +306,7 @@ class ContinuousPlate:
added_curve = cad.model.AddPolyLine(
draw_point.reshape(1, draw_curve_x.shape[0] * 3)[0]
)
set_true_color(added_curve, 122, 219, 245)
set_true_color(added_curve, Color)
added_ground_curve = cad.model.AddPolyLine(
draw_ground_curve_point.reshape(
1, draw_ground_curve_y.shape[0] * 3
@ -217,11 +325,6 @@ class ContinuousPlate:
def main1():
# with xw.App(visible=False) as app:
# wb = app.books.open('张力计算(临界档距公式法V20090602)-送电室版).xls')
# sheet = wb.sheets['2710导线-单回1250-70']
# sheet.range('B69').value=120
# print(sheet.range('L69').value)
s_file = SFile()
s_file.open(r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\S033.DAT")
# with xw.App(visible=False) as app:
@ -338,30 +441,38 @@ def main1():
added_curve = cad.model.AddPolyLine(
draw_point.reshape(1, draw_curve_x.shape[0] * 3)[0]
)
set_true_color(added_curve, 122, 219, 245)
set_true_color(added_curve, *ColorEnume.wire_color_rgb)
added_ground_curve = cad.model.AddPolyLine(
draw_ground_curve_point.reshape(
1, draw_ground_curve_y.shape[0] * 3
)[0]
)
set_true_color(added_ground_curve, 122, 219, 245)
set_true_color(added_ground_curve, *ColorEnume.ground_color_rgb)
added_tree_curve = cad.model.AddPolyLine(
draw_tree_curve_point.reshape(1, draw_tree_curve_y.shape[0] * 3)[0]
)
set_true_color(added_tree_curve, 116, 230, 165)
set_true_color(added_tree_curve, *ColorEnume.tree_color_rgb)
is_first_tower = False
last_tower_info = tower_info
doc.SaveAs(r"d:\工程\金上线\code\考虑耐张串重弧垂\T033A.dwg")
def main():
continousePlate = ContinuousPlate(
# continousePlate = ContinuousPlate(
# r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\033A.dwg",
# r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\S033.DAT",
# "N3339",
# 7,
# )
# continousePlate.draw(r"d:\工程\金上线\code\考虑耐张串重弧垂\T033A.dwg")
string_impact_plate = StringImpactPlate(
r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\033A.dwg",
r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\S033.DAT",
"N3339",
7,
["N3339"],
"",
"",
)
continousePlate.draw(r"d:\工程\金上线\code\考虑耐张串重弧垂\T033A.dwg")
string_impact_plate.draw()
if __name__ == "__main__":