From 363a14e98baba298b4bd3da7756d1ac0371c5fd7 Mon Sep 17 00:00:00 2001 From: n3040 Date: Mon, 29 Jan 2024 00:21:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=86=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E5=AF=BC=E5=87=BAnwed=E6=96=87=E4=BB=B6=E7=9A=84=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dem.py | 35 ++++++- nwed.py | 319 ++++++++++++++++++++++++++++++-------------------------- pw.py | 3 +- 3 files changed, 208 insertions(+), 149 deletions(-) diff --git a/dem.py b/dem.py index ef6df55..898ea6d 100644 --- a/dem.py +++ b/dem.py @@ -8,6 +8,7 @@ import numpy as np import pandas as pd from pw import DFile, ControlFile import dem_utils +from nwed import Nwed class Dem: @@ -45,7 +46,7 @@ class Dem: return dem_row, dem_col, dem_band, dem_gt, dem_proj - def write_dxf(self): + def write(self): # TODO:不应该设置缩放因数 zoom_factor = 1 excel_pfs = self._read_path_file() @@ -82,7 +83,7 @@ class Dem: # ) dm_msp = dm_doc.modelspace() x_axis = [0] - cord_0 = line_coordination[0, 2:4] # 取中线的 + cord_0 = line_coordination[0, 2:4] # 取中线的x轴作为横坐标 for cord in line_coordination[1:, 2:4]: x_axis.append(dem_utils.distance(cord, cord_0)) # 左边线 @@ -234,6 +235,36 @@ class Dem: segments, tower_start_num, control_file_template_path, out_dxf_file_dir ) c_file.save() + ################## + ################## + # 写nwed + section_name = f"{100+int(start_point_name[1:])}" + licheng = f"{mileage[-1]}" + remarks_start = f"{int(start_point_name[1:])}" + pole_name_start = f"{start_num}" + remarks_end = f"{int(end_point_name[1:])}" + pole_name_end = f"{end_num}" + toml_dict = self._toml_dict + side_width = toml_dict["parameter"]["side_width"] # 边线宽度 + verticalExtent2 = f"{side_width}" + mid_vec_list = list(map(lambda x: [f"{x[0]*5}", f"{x[1]/2}"], mid_line)) + right_vec_list = list(map(lambda x: [f"{x[0]*5}", f"{x[1]/2}"], right_line)) + left_vec_list = list(map(lambda x: [f"{x[0]*5}", f"{x[1]/2}"], left_line)) + nwed = Nwed( + section_name, + licheng, + remarks_start, + pole_name_start, + remarks_end, + pole_name_end, + verticalExtent2, + mid_vec_list, + right_vec_list, + left_vec_list, + ) + nwed.write( + f"{out_dxf_file_dir}/{100+int(start_point_name[1:])}.nwed", + ) # 写整个断面文件 export_dwg( dm_whole_doc, diff --git a/nwed.py b/nwed.py index d79e76c..a8ae20f 100644 --- a/nwed.py +++ b/nwed.py @@ -1,155 +1,182 @@ from xml.etree.ElementTree import Element from xml.etree.ElementTree import ElementTree from xml.etree.ElementTree import SubElement +import attrs +from typing import List, Tuple -def indent(elem, level=0): - i = "\n" + level * "\t" - if len(elem): - if not elem.text or not elem.text.strip(): - elem.text = i + "\t" - if not elem.tail or not elem.tail.strip(): - elem.tail = i - for elem in elem: - indent(elem, level + 1) - if not elem.tail or not elem.tail.strip(): - elem.tail = i - else: - if level and (not elem.tail or not elem.tail.strip()): - elem.tail = i +@attrs.define +class Nwed: + # section_name = "002" + # licheng = "100" + # remarks_start = "002" + # pole_name_start = "4001" + # remarks_end = "003" + # pole_name_end = "4002" + # verticalExtent2 = "20" # 边线宽度 + section_name: str + licheng: str + remarks_start: str + pole_name_start: str + remarks_end: str + pole_name_end: str + verticalExtent2: str # 边线宽度 + mid_vec_list: List[List[str]] + right_vec_list: List[List[str]] + left_vec_list: List[List[str]] + def indent(self, elem, level=0): + i = "\n" + level * "\t" + if len(elem): + if not elem.text or not elem.text.strip(): + elem.text = i + "\t" + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + self.indent(elem, level + 1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i -def AddEleElevationCurve(elevationCurves, id, vec_list, curve_side=None): - if curve_side: - elevationCurve_attribs = {"ID": id, "CurveSide": curve_side} - else: - elevationCurve_attribs = {"ID": id} - elevationCurve = SubElement( - elevationCurves, "EleElevationCurve", attrib=elevationCurve_attribs - ) # 中线 - SubElement(elevationCurve, "GrowthHeight").text = "0" - SubElement(elevationCurve, "LinkedSectionObjectID_Group") - SubElement(elevationCurve, "wallheight").text = "0" - segmentList = SubElement(elevationCurve, "SegmentList") - eleElevationCurveSegment = SubElement( - segmentList, - "EleElevationCurveSegment", - # TODO 这个ID其实依据中、边导线会变化。 - attrib={"ID": "4", "StartPointClass": "NotSet", "EndPointClass": "NotSet"}, - ) - SubElement(eleElevationCurveSegment, "GrowthHeight").text = "0" - SubElement(eleElevationCurveSegment, "LinkedSectionObjectID_Group") - vec_list_element = SubElement(eleElevationCurveSegment, "VecList") - for vec in vec_list: - SubElement(vec_list_element, "Vector3", attrib={"xyz": ",".join(vec)}) - vec_list_rendering_element = SubElement( - eleElevationCurveSegment, "VecListRendering" - ) - for vec in vec_list: - SubElement(vec_list_rendering_element, "Vector3", attrib={"xyz": ",".join(vec)}) - return elevationCurve + def AddEleElevationCurve( + self, elevationCurves, id, vec_list, curve_id, curve_side=None + ): + if curve_side: + elevationCurve_attribs = {"ID": id, "CurveSide": curve_side} + else: + elevationCurve_attribs = {"ID": id} + elevationCurve = SubElement( + elevationCurves, "EleElevationCurve", attrib=elevationCurve_attribs + ) # 中线 + SubElement(elevationCurve, "GrowthHeight").text = "0" + SubElement(elevationCurve, "LinkedSectionObjectID_Group") + SubElement(elevationCurve, "wallheight").text = "0" + segmentList = SubElement(elevationCurve, "SegmentList") + eleElevationCurveSegment = SubElement( + segmentList, + "EleElevationCurveSegment", + # TODO 这个ID其实依据中、边导线会变化。 + attrib={ + "ID": curve_id, + "StartPointClass": "NotSet", + "EndPointClass": "NotSet", + }, + ) + SubElement(eleElevationCurveSegment, "GrowthHeight").text = "0" + SubElement(eleElevationCurveSegment, "LinkedSectionObjectID_Group") + vec_list_element = SubElement(eleElevationCurveSegment, "VecList") + for vec in vec_list: + SubElement(vec_list_element, "Vector3", attrib={"xyz": ",".join(vec)}) + vec_list_rendering_element = SubElement( + eleElevationCurveSegment, "VecListRendering" + ) + for vec in vec_list: + SubElement( + vec_list_rendering_element, "Vector3", attrib={"xyz": ",".join(vec)} + ) + return elevationCurve + def AddAnnotationElements(self, sectionData, pole_attrib, xyz): + pdmGraphicsObject = SubElement( + sectionData, "PdmGraphicsObject", attrib=pole_attrib + ) + SubElement(pdmGraphicsObject, "GrowthHeight").text = "0" + SubElement(pdmGraphicsObject, "LinkedSectionObjectID_Group") + SubElement(pdmGraphicsObject, "Position", attrib={"xyz": xyz}) -def AddAnnotationElements(sectionData, pole_attrib, xyz): - pdmGraphicsObject = SubElement(sectionData, "PdmGraphicsObject", attrib=pole_attrib) - SubElement(pdmGraphicsObject, "GrowthHeight").text = "0" - SubElement(pdmGraphicsObject, "LinkedSectionObjectID_Group") - SubElement(pdmGraphicsObject, "Position", attrib={"xyz": xyz}) - - -section_name = "002" -licheng = "100" -remarks_start = "002" -pole_name_start = "4001" -remarks_end = "003" -pole_name_end = "4002" -verticalExtent2 = "20" # 边线宽度 -root = Element( - "OverheadTransmissionLineDrawing", - attrib={ - "Name": section_name, - "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", - "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", - "Description": "", - "Version": "1.0", - "StartAngle": "0", - "EndAngle": "0", - "NextID": "9", - }, -) -SubElement(root, "lstCrossingCable") -drawingFrames = SubElement(root, "DrawingFrames", attrib={"PaperSizeId": "0"}) -SubElement(drawingFrames, "GrowthHeight").text = "0" -SubElement(drawingFrames, "LinkedSectionObjectID_Group") -frames = SubElement(drawingFrames, "Frames") -frame = SubElement( - frames, - "Frame", - attrib={ - "Name": "完整图纸", - "SplitterPosition": "0", - "PaperOrientation": "Landscape", - "UserVerticalOffset": "0", - }, -) -SubElement(frame, "GrowthHeight").text = "0" -SubElement(frame, "LinkedSectionObjectID_Group") -elevAdjSections = SubElement(frame, "ElevAdjSections") -SubElement(elevAdjSections, "GrowthHeight").text = "0" -SubElement(elevAdjSections, "LinkedSectionObjectID_Group") -sections = SubElement(elevAdjSections, "Sections") -SubElement( - sections, "ElevationAdjSection", attrib={"Position": "0", "ElevationAjusting": "0"} -) -SubElement(root, "GPSPointGroups") -SubElement(root, "Orthoimages") -SubElement(root, "GPSXianGao") -SubElement(root, "HouseSwing") -sectionData = SubElement(root, "SectionData") -SubElement(sectionData, "licheng").text = licheng -SubElement(sectionData, "lstlicheng") -SubElement(sectionData, "lstSctnRcd") -SubElement(sectionData, "ForestElevationCurves") -elevationCurves = SubElement(sectionData, "ElevationCurves") -AddEleElevationCurve(elevationCurves, "1", [["0", "0"], ["100", "200"]]) -AddEleElevationCurve(elevationCurves, "2", [["0", "0"], ["100", "202"]], "Left") -AddEleElevationCurve(elevationCurves, "3", [["0", "0"], ["100", "205"]], "Right") -annotationElements = SubElement(sectionData, "AnnotationElements") -AddAnnotationElements( - annotationElements, - { - "xsi:type": "ElePowerLinePole", - "ID": "7", - "CurveSide": "All", - "Remarks": remarks_start, - "PoleType": "AnglePole", - "LeftElevation": "0", - "RightElevation": "0", - "CableAngle": "0", - "PoleName": pole_name_start, - }, - xyz="0,0", -) -AddAnnotationElements( - annotationElements, - { - "xsi:type": "ElePowerLinePole", - "ID": "8", - "CurveSide": "All", - "Remarks": remarks_end, - "PoleType": "AnglePole", - "LeftElevation": "0", - "RightElevation": "0", - "CableAngle": "0", - "PoleName": pole_name_end, - }, - xyz="100,200", -) -mapData = SubElement(root, "MapData") -SubElement(mapData, "GrowthHeight").text = "0" -SubElement(mapData, "LinkedSectionObjectID_Group") -SubElement(mapData, "verticalExtent2").text = verticalExtent2 -SubElement(mapData, "MapElements") -tree = ElementTree(root) -indent(root) -tree.write("result.nwed", encoding="utf-8", xml_declaration=True) + def write(self, xml_path): + root = Element( + "OverheadTransmissionLineDrawing", + attrib={ + "Name": self.section_name, + "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance", + "xmlns:xsd": "http://www.w3.org/2001/XMLSchema", + "Description": "", + "Version": "1.0", + "StartAngle": "0", + "EndAngle": "0", + "NextID": "9", + }, + ) + SubElement(root, "lstCrossingCable") + drawingFrames = SubElement(root, "DrawingFrames", attrib={"PaperSizeId": "0"}) + SubElement(drawingFrames, "GrowthHeight").text = "0" + SubElement(drawingFrames, "LinkedSectionObjectID_Group") + frames = SubElement(drawingFrames, "Frames") + frame = SubElement( + frames, + "Frame", + attrib={ + "Name": "完整图纸", + "SplitterPosition": "0", + "PaperOrientation": "Landscape", + "UserVerticalOffset": "0", + }, + ) + SubElement(frame, "GrowthHeight").text = "0" + SubElement(frame, "LinkedSectionObjectID_Group") + elevAdjSections = SubElement(frame, "ElevAdjSections") + SubElement(elevAdjSections, "GrowthHeight").text = "0" + SubElement(elevAdjSections, "LinkedSectionObjectID_Group") + sections = SubElement(elevAdjSections, "Sections") + SubElement( + sections, + "ElevationAdjSection", + attrib={"Position": "0", "ElevationAjusting": "0"}, + ) + SubElement(root, "GPSPointGroups") + SubElement(root, "Orthoimages") + SubElement(root, "GPSXianGao") + SubElement(root, "HouseSwing") + sectionData = SubElement(root, "SectionData") + SubElement(sectionData, "licheng").text = self.licheng + SubElement(sectionData, "lstlicheng") + SubElement(sectionData, "lstSctnRcd") + SubElement(sectionData, "ForestElevationCurves") + elevationCurves = SubElement(sectionData, "ElevationCurves") + self.AddEleElevationCurve(elevationCurves, "1", self.mid_vec_list, "4") + self.AddEleElevationCurve(elevationCurves, "2", self.left_vec_list, "5", "Left") + self.AddEleElevationCurve( + elevationCurves, "3", self.right_vec_list, "6", "Right" + ) + annotationElements = SubElement(sectionData, "AnnotationElements") + self.AddAnnotationElements( + annotationElements, + { + "xsi:type": "ElePowerLinePole", + "ID": "7", + "CurveSide": "All", + "Remarks": self.remarks_start, + "PoleType": "AnglePole", + "LeftElevation": "0", + "RightElevation": "0", + "CableAngle": "0", + "PoleName": self.pole_name_start, + }, + xyz=",".join(self.mid_vec_list[0]), + ) + self.AddAnnotationElements( + annotationElements, + { + "xsi:type": "ElePowerLinePole", + "ID": "8", + "CurveSide": "All", + "Remarks": self.remarks_end, + "PoleType": "AnglePole", + "LeftElevation": "0", + "RightElevation": "0", + "CableAngle": "0", + "PoleName": self.pole_name_end, + }, + xyz=",".join(self.mid_vec_list[-1]), + ) + mapData = SubElement(root, "MapData") + SubElement(mapData, "GrowthHeight").text = "0" + SubElement(mapData, "LinkedSectionObjectID_Group") + SubElement(mapData, "verticalExtent2").text = self.verticalExtent2 + SubElement(mapData, "MapElements") + tree = ElementTree(root) + self.indent(root) + tree.write(xml_path, encoding="utf-8", xml_declaration=True) diff --git a/pw.py b/pw.py index 8399416..ec7eddb 100644 --- a/pw.py +++ b/pw.py @@ -97,5 +97,6 @@ class ControlFile: c_template = c_template.replace( "{CONTROL_FILE}", f"S{segments[0]-4000+100}" ) - with open(f"{out_dir}/PW{segments[0]-4000+100}.dat", "w") as c_file: + # with open(f"{out_dir}/PW{segments[0]-4000+1}.dat", "w") as c_file: + with open(f"{out_dir}/PW01.dat", "w") as c_file: c_file.write(c_template)