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 # 读取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) def main(): # 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) 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_true_curve=cad.model.AddPolyLine( draw_tree_curve_point.reshape(1, draw_tree_curve_y.shape[0] * 3)[0] ) set_true_color(added_true_curve, 116, 230, 165) is_first_tower = False last_tower_info = tower_info doc.SaveAs(r"d:\工程\金上线\code\考虑耐张串重弧垂\T033A.dwg") main()