transsimision_line_section/main.py

370 lines
15 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from tkinter.messagebox import NO
import xlwings as xw
from PWFile import SFile, Fitting
from Apyautocad import Apyautocad, APoint
import os
import re
import numpy as np
from time import sleep
from attrs import define
# 读取Z文件找到Z断面第一个点的坐标
def plane_z_origin(z_file_path):
with open(z_file_path) as zfile:
content = zfile.read()
norm_content = re.sub("\s+", ",", content)
sep = norm_content.split(",")
return np.array([float(sep[0]), float(sep[1])])
def deduce_zfile_from_cad_path(cad_file_path):
dwg_file_name = os.path.split(cad_file_path)
dwg_prefix = dwg_file_name[1].split(".")[0]
return os.path.join(dwg_file_name[0], f"Z{dwg_prefix}")
def deduce_fit_db_from_cad_path(cad_file_path):
dwg_file_name = os.path.split(cad_file_path)
dwg_prefix = dwg_file_name[1].split(".")[0]
return os.path.join(dwg_file_name[0], "Fit.db")
def curve_fun(x, span, k, gaocha):
return x * gaocha / span - x * (span - x) * k
class StringImpactExcel:
def __init__(self) -> None:
# self._wb=None
pass
def read(self, wb):
# with xw.App(visible=True) as app:
pos代表档距 = "F13"
pos档距 = "L13"
pos高差 = "R13"
pos张力 = "AB18"
pos档距21 = "E25"
sheet = wb.sheets["3225-3226"]
print(sheet.range("V25:V46").value)
def set_true_color(object, r, g, b):
true_color = object.TrueColor
true_color.SetRGB(r, g, b)
object.TrueColor = true_color
@define
class ContinuousPlate:
_dwg_file_path: str
_s_file_path: str
_from_tower_name: str
_draw_tower_count: int
def draw(self, save_to: str):
s_file = SFile()
s_file_path = self._s_file_path
s_file.open(s_file_path)
# with xw.App(visible=False) as app:
# wb_string_impact = app.books.open("特高压耐张串影响弧垂计算送电室2018人员版1122-1218.xls")
# stringImpactExcel = StringImpactExcel()
# stringImpactExcel.read(wb_string_impact)
dwg_file_path = self._dwg_file_path
with Apyautocad(
create_if_not_exists=True, visible=False, auto_close=False
) as cad:
doc = cad.app.Documents.Open(dwg_file_path)
sleep(1)
z_file_path = deduce_zfile_from_cad_path(dwg_file_path)
z_point = plane_z_origin(z_file_path)
fitting_file_path = deduce_fit_db_from_cad_path(dwg_file_path)
fitting = Fitting(fitting_file_path)
fitting_length_dict = fitting.fitting_length_dic
first_tower_point = z_point
last_tower_info = None # 上一个塔位信息
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
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:
break
if not last_tower_info:
last_tower_info = tower_info
foundation_low = tower_info.foundation_low
accu_mileage = (
accu_mileage
+ tower_info.mileage_in_s
- last_tower_info.mileage_in_s
)
accu_altitude_off = accu_altitude_off + tower_info.altitude_off # 中心桩高程
tower_start = APoint(
*(
(
first_tower_point
+ np.array(
[
accu_mileage / 5,
(accu_altitude_off - foundation_low) * 2,
]
)
).tolist()
)
)
tower_height = tower_info.tower_height
tower_end = APoint(
*(
first_tower_point
+ np.array(
[
accu_mileage / 5,
(accu_altitude_off + tower_height - foundation_low) * 2,
]
)
).tolist()
)
# 画杆高
cad.model.AddLine(tower_start, tower_end)
draw_count+=1
# 画弧垂
if not is_first_tower: # 从第二基塔开始画
draw_k = tower_info.back_k
span = tower_info.mileage_in_s - last_tower_info.mileage_in_s
last_tower_fiting = last_tower_info.fitting
last_tower_fitting_length = fitting_length_dict[last_tower_fiting]
if last_tower_info.is_tension_tower:
last_tower_fitting_length = 0
tower_fitting = tower_info.fitting
tower_fitting_length = fitting_length_dict[tower_fitting]
if tower_info.is_tension_tower:
tower_fitting_length = 0
last_tower_height = last_tower_info.tower_height
last_foundation_low = last_tower_info.foundation_low
# 挂点高差
fiting_altitude_off = (
tower_info.altitude_off
+ (tower_height - foundation_low - tower_fitting_length)
- (
last_tower_height
- last_foundation_low
- last_tower_fitting_length
)
) # 前侧高为正
# 画导线弧垂
x = np.linspace(0, span, int(span), endpoint=True)
curve = curve_fun(x, span, draw_k, fiting_altitude_off)
draw_curve_x = (first_tower_point[0]) + (
x + accu_mileage - span
) / 5
draw_curve_y = (
first_tower_point[1]
+ (
+curve
+ accu_altitude_off
- tower_info.altitude_off
- last_tower_info.foundation_low
+ last_tower_info.tower_height
- last_tower_fitting_length
)
* 2
)
draw_curve_x = draw_curve_x.reshape(len(draw_curve_x), 1)
draw_curve_y = draw_curve_y.reshape(len(draw_curve_y), 1)
draw_ground_curve_y = draw_curve_y - 18 * 2 # 切地线
draw_tree_curve_y = draw_curve_y - 13.5 * 2 # 切树线
draw_point = np.hstack(
(draw_curve_x, draw_curve_y, np.zeros((len(draw_curve_x), 1)))
)
draw_ground_curve_point = np.hstack(
(
draw_curve_x,
draw_ground_curve_y,
np.zeros((len(draw_curve_x), 1)),
)
)
draw_tree_curve_point = np.hstack(
(
draw_curve_x,
draw_tree_curve_y,
np.zeros((len(draw_curve_x), 1)),
)
)
added_curve = cad.model.AddPolyLine(
draw_point.reshape(1, draw_curve_x.shape[0] * 3)[0]
)
set_true_color(added_curve, 122, 219, 245)
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)
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)
is_first_tower = False
last_tower_info = tower_info
doc.SaveAs(save_to)
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:
# wb_string_impact = app.books.open("特高压耐张串影响弧垂计算送电室2018人员版1122-1218.xls")
# stringImpactExcel = StringImpactExcel()
# stringImpactExcel.read(wb_string_impact)
with Apyautocad(create_if_not_exists=True, visible=False, auto_close=False) as cad:
doc = cad.app.Documents.Open(r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\033A.dwg")
sleep(1)
z_file_path = deduce_zfile_from_cad_path(
r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\033A.dwg"
)
z_point = plane_z_origin(z_file_path)
fitting_file_path = deduce_fit_db_from_cad_path(
r"d:\工程\金上线\排位\定位完排位\PW.0706\J33-J49\033A.dwg"
)
fitting = Fitting(fitting_file_path)
fitting_length_dict = fitting.fitting_length_dic
first_tower_point = z_point
last_tower_info = None # 上一个塔位信息
accu_mileage = 0 # 累计档距
accu_altitude_off = 0 # 累计高差
is_first_tower = True
for tower in s_file.tower_dic:
tower_info = s_file.tower_dic[tower]
if not last_tower_info:
last_tower_info = tower_info
foundation_low = tower_info.foundation_low
accu_mileage = (
accu_mileage + tower_info.mileage_in_s - last_tower_info.mileage_in_s
)
accu_altitude_off = accu_altitude_off + tower_info.altitude_off # 中心桩高程
tower_start = APoint(
*(
(
first_tower_point
+ np.array(
[accu_mileage / 5, (accu_altitude_off - foundation_low) * 2]
)
).tolist()
)
)
tower_height = tower_info.tower_height
tower_end = APoint(
*(
first_tower_point
+ np.array(
[
accu_mileage / 5,
(accu_altitude_off + tower_height - foundation_low) * 2,
]
)
).tolist()
)
# 画杆高
cad.model.AddLine(tower_start, tower_end)
# 画弧垂
if not is_first_tower: # 从第二基塔开始画
draw_k = tower_info.back_k
span = tower_info.mileage_in_s - last_tower_info.mileage_in_s
last_tower_fiting = last_tower_info.fitting
last_tower_fitting_length = fitting_length_dict[last_tower_fiting]
if last_tower_info.is_tension_tower:
last_tower_fitting_length = 0
tower_fitting = tower_info.fitting
tower_fitting_length = fitting_length_dict[tower_fitting]
if tower_info.is_tension_tower:
tower_fitting_length = 0
last_tower_height = last_tower_info.tower_height
last_foundation_low = last_tower_info.foundation_low
# 挂点高差
fiting_altitude_off = (
tower_info.altitude_off
+ (tower_height - foundation_low - tower_fitting_length)
- (
last_tower_height
- last_foundation_low
- last_tower_fitting_length
)
) # 前侧高为正
# 画导线弧垂
x = np.linspace(0, span, int(span), endpoint=True)
curve = curve_fun(x, span, draw_k, fiting_altitude_off)
draw_curve_x = (first_tower_point[0]) + (x + accu_mileage - span) / 5
draw_curve_y = (
first_tower_point[1]
+ (
+curve
+ accu_altitude_off
- tower_info.altitude_off
- last_tower_info.foundation_low
+ last_tower_info.tower_height
- last_tower_fitting_length
)
* 2
)
draw_curve_x = draw_curve_x.reshape(len(draw_curve_x), 1)
draw_curve_y = draw_curve_y.reshape(len(draw_curve_y), 1)
draw_ground_curve_y = draw_curve_y - 18 * 2 # 切地线
draw_tree_curve_y = draw_curve_y - 13.5 * 2 # 切树线
draw_point = np.hstack(
(draw_curve_x, draw_curve_y, np.zeros((len(draw_curve_x), 1)))
)
draw_ground_curve_point = np.hstack(
(
draw_curve_x,
draw_ground_curve_y,
np.zeros((len(draw_curve_x), 1)),
)
)
draw_tree_curve_point = np.hstack(
(draw_curve_x, draw_tree_curve_y, np.zeros((len(draw_curve_x), 1)))
)
added_curve = cad.model.AddPolyLine(
draw_point.reshape(1, draw_curve_x.shape[0] * 3)[0]
)
set_true_color(added_curve, 122, 219, 245)
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)
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)
is_first_tower = False
last_tower_info = tower_info
doc.SaveAs(r"d:\工程\金上线\code\考虑耐张串重弧垂\T033A.dwg")
def main():
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")
if __name__ == "__main__":
main()
print("Finished.")