2022-07-24 16:47:21 +08:00
|
|
|
|
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
|
2022-07-24 17:18:57 +08:00
|
|
|
|
from attrs import define
|
2022-07-24 16:47:21 +08:00
|
|
|
|
|
|
|
|
|
|
# 读取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)
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-24 17:18:57 +08:00
|
|
|
|
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():
|
2022-07-24 16:47:21 +08:00
|
|
|
|
# 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)
|
2022-07-24 17:18:57 +08:00
|
|
|
|
with Apyautocad(create_if_not_exists=True, visible=False, auto_close=False) as cad:
|
2022-07-24 16:47:21 +08:00
|
|
|
|
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)))
|
|
|
|
|
|
)
|
2022-07-24 17:18:57 +08:00
|
|
|
|
added_curve = cad.model.AddPolyLine(
|
2022-07-24 16:47:21 +08:00
|
|
|
|
draw_point.reshape(1, draw_curve_x.shape[0] * 3)[0]
|
|
|
|
|
|
)
|
2022-07-24 17:18:57 +08:00
|
|
|
|
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]
|
2022-07-24 16:47:21 +08:00
|
|
|
|
)
|
2022-07-24 17:18:57 +08:00
|
|
|
|
set_true_color(added_ground_curve, 122, 219, 245)
|
|
|
|
|
|
added_tree_curve = cad.model.AddPolyLine(
|
2022-07-24 16:47:21 +08:00
|
|
|
|
draw_tree_curve_point.reshape(1, draw_tree_curve_y.shape[0] * 3)[0]
|
|
|
|
|
|
)
|
2022-07-24 17:18:57 +08:00
|
|
|
|
set_true_color(added_tree_curve, 116, 230, 165)
|
2022-07-24 16:47:21 +08:00
|
|
|
|
is_first_tower = False
|
|
|
|
|
|
last_tower_info = tower_info
|
|
|
|
|
|
doc.SaveAs(r"d:\工程\金上线\code\考虑耐张串重弧垂\T033A.dwg")
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-07-24 17:18:57 +08:00
|
|
|
|
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.")
|