From 7c2e171f7daea7453e34f9bbbbb5abc3d46e2ef0 Mon Sep 17 00:00:00 2001 From: lertlmaier Date: Tue, 1 Jul 2025 11:20:01 +0200 Subject: [PATCH] =?UTF-8?q?Rack=20l=C3=A4ngen=20werden=20in=20ihrer=20gesp?= =?UTF-8?q?litteten=20Form=20(Rack=202-0,=20Rack=202-1)=20aus=20routing.py?= =?UTF-8?q?=20an=20drawdxf.py=20=C3=BCbergeben=20und=20in=20Excel=20Ausgab?= =?UTF-8?q?e=20aufgenommen.=20c-,=20v-,=20t-,=20und=20d-Racks=20werden=20i?= =?UTF-8?q?gnoriert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/drawdxf.py | 22 +++++++++++++++++++--- lib/plant.py | 18 +++++++++++++++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/lib/drawdxf.py b/lib/drawdxf.py index 1ccbf76..838508a 100644 --- a/lib/drawdxf.py +++ b/lib/drawdxf.py @@ -2,7 +2,7 @@ import argparse import ezdxf import json import os.path -from dataclasses import dataclass, asdict, fields +from dataclasses import dataclass, asdict, field from dacite import from_dict from typing import List, Dict from datetime import datetime @@ -52,6 +52,7 @@ class Polylines: errors_dists_not_in_layout: List[str] errors_sensors_not_in_layout: List[str] errors_missing_attributes: Dict[str, str] + rack_lengths: Dict[str, float] = field(default_factory = dict) def add_polyline(msp, points:Polyline, dxf_attribs): @@ -283,7 +284,7 @@ def mark_missings(all_artnrs): def write_excel_from_json(plines: Polylines, sens2cable: dict, outpath: str, with_bom=True): """ - Orchestriert die Erstellung der Excel-Reports (Kabelübersicht und Stückliste). + Steuert die Erstellung der Excel-Reports (Kabelübersicht und Stückliste). """ # 1. Daten aggregieren und für die Reports vorbereiten processed_data = _process_cable_data(plines, sens2cable) @@ -293,8 +294,9 @@ def write_excel_from_json(plines: Polylines, sens2cable: dict, outpath: str, wit _create_cable_list_sheet(wb_main.active, plines, sens2cable, bezeichner_cfg) _create_cable_summary_sheet(wb_main.create_sheet(), processed_data) + _create_rack_lengths_sheet(wb_main.create_sheet(), plines) _create_error_sheets(wb_main, plines) - + wb_main.save(outpath) print("Cable-Summary exported to Excel file") @@ -402,6 +404,20 @@ def _create_cable_summary_sheet(ws, processed_data): length_summary.get(artnr, "") ]) +def _create_rack_lengths_sheet(ws, plines): + """Erstellt das Arbeitsblatt 'Rack-Lengths'.""" + ws.title = "Rack-Lengths" + ws.append(["Rack-ID", "Length (m)"]) + ws.column_dimensions['A'].width = 18 + ws.column_dimensions['B'].width = 15 + + for rackname, length in plines.rack_lengths.items(): + classifier = rackname[0] + if classifier in ("t", "v", "c", "d"): + continue + else: + ws.append([rackname, length]) + def _create_error_sheets(wb, plines): """Erstellt die Arbeitsblätter für alle aufgetretenen Fehler.""" # Sheet: ERR-Equipment-Connection diff --git a/lib/plant.py b/lib/plant.py index 2b1baf8..ea0818a 100644 --- a/lib/plant.py +++ b/lib/plant.py @@ -284,6 +284,7 @@ class Anlage(): def __init__(self, tol_snap=200.0, tol_connect=5000.0): # Container für alle Racks self._racks = RackIDs(tol_snap=tol_snap) + self._rack_lengths = defaultdict(float) # zuordnung zwischen KnotenID und Punkt self._nodeids = NodeIDs() # Container für alle Sensoren @@ -465,6 +466,9 @@ class Anlage(): def join_racks(self): self._racks.join_racks_str() + def get_rack_lengths(self) -> dict[str, float]: + return self._rack_lengths + def find_nearest_rack_from_point_STR_bbox(self, max_dist, pt:Point) -> tuple[Point, str]: if self._racks._rack_tree is None: self._racks._build_rack_strtree() @@ -562,7 +566,6 @@ class Anlage(): dz = 0.0 weight = math.sqrt(dx**2 + dy**2 + dz**2) - #weight=start.distance(end) if re.match("v-.*", rname): color = "red" @@ -578,6 +581,9 @@ class Anlage(): color = "black" G.add_edge(nid_start, nid_end, color=color, weight=weight) + + self._rack_lengths[rname] += round(weight/1000, 1) + return self._node_positions def map_distributor_to_sensors(self, dname:str, snamen:list[str]): @@ -606,7 +612,7 @@ class Anlage(): def create_cable_paths(self, G) -> dict: pfade = dict() pfade["kabel"] = list() - pfade["errors_routing"] = dict() + routing_errors = dict() # Fehler Liste für fehlgeschlagene Kabelverbindungen for sname, dname in self._sensor2dist.items(): try: @@ -634,10 +640,16 @@ class Anlage(): pfade["kabel"].append(ld) - + pfade["rack_lengths"] = { + rname: round(length, 1) + for rname, length in self._rack_lengths.items() + } + + pfade["errors_routing"] = dict() lOfDistErrors = list() # sammeln wo keine Verbindung zwischen Dist und Senor möglich war for dname,lofSensornamen in routing_errors.items(): lOfDistErrors.append({"unterverteiler":dname, "sensoren":lofSensornamen}) + pfade["errors_routing"] = lOfDistErrors return pfade