From 4b1002ff7e4427c18ce3dd1cbe00f0e090b87855 Mon Sep 17 00:00:00 2001 From: lertlmaier Date: Wed, 4 Jun 2025 08:54:18 +0200 Subject: [PATCH] =?UTF-8?q?ANpassung=20der=20Ausgabe=20todraw.json,=20soda?= =?UTF-8?q?ss=20Fehler=20in=20Excel=20-Ausgabe=20besser=20ausgegeben=20wer?= =?UTF-8?q?den=20k=C3=B6nnen.=202=20neue=20Worksheets=20in=20Excel=20Ausga?= =?UTF-8?q?be=20angef=C3=BCgt(Auflistung=20von=20Fehlgeschlagener=20Anbind?= =?UTF-8?q?ung=20+=20Auflistung=20von=20Routingfelern=20mit=20Grund?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/drawdxf.py | 66 ++++++++++++++++++++++++++++++++++++++++++-------- lib/plant.py | 17 ++++++++++--- lib/routing.py | 2 +- 3 files changed, 70 insertions(+), 15 deletions(-) diff --git a/lib/drawdxf.py b/lib/drawdxf.py index c99b33a..f16a639 100644 --- a/lib/drawdxf.py +++ b/lib/drawdxf.py @@ -29,12 +29,24 @@ class Polyline: def to_tuple(self): ret = list() for p in self.coords: - ret.append( (p.x,p.y) ) + ret.append( (p.x, p.y) ) return ret - + +@dataclass +class Error_Connection: + name: str + coords: Point + +@dataclass +class Error_Routing: + unterverteiler: str + sensoren: List[str] @dataclass class Polylines: kabel: List[Polyline] + errors_routing: List[Error_Routing] + errors_sensors: List[Error_Connection] + errors_dists: List[Error_Connection] def add_polyline(msp, points:Polyline, dxf_attribs): @@ -73,9 +85,10 @@ def copy_layers_into_new(originaldxf, outpath, plines): quelle = ezdxf.readfile(originaldxf) ziel = ezdxf.new('R2018', setup=True) - + + create_cables(plines, ziel) copy_layers_into_dxf_by_filter(quelle, ziel) - create_cables(plines, quelle) + ziel.saveas(out_path) print("done") @@ -134,7 +147,40 @@ def write_excel_from_json(plines:Polylines, outpath:str): for rlength in sorted(length_summary): ws2.append([int(rlength), length_summary[rlength]]) + + # Worksheet 3 - Nicht an Racks gekoppeltes Equipment + ws3 = wb.create_sheet("Equipment nicht angebunden") + ws3.append(["Typ", "Name", "x", "y"]) + for error in plines.errors_sensors: + ws3.append(["Sensor / Aktor", error.name, error.coords.x, error.coords.y]) + + for error in plines.errors_dists: + ws3.append(["Unterverteiler", error.name, error.coords.x, error.coords.y]) + # Worksheet 4 - Fehlgeschlagenes Routing + ws4 = wb.create_sheet("Routingfehler") + ws4.append(["Unterverteiler", "Sensor- / Aktorname", "Grund"]) + + nicht_angebunden = set(e.name for e in plines.errors_sensors + plines.errors_dists) + + for routing_error in plines.errors_routing: + uv = routing_error.unterverteiler + uv_nicht_angebunden = uv in nicht_angebunden + for sensor in routing_error.sensoren: + sensor_nicht_angebunden = sensor in nicht_angebunden + + if sensor_nicht_angebunden and uv_nicht_angebunden: + grund = "Sensor und Unterverteiler nicht angebunden" + elif sensor_nicht_angebunden: + grund = "Sensor / Aktor nicht angebunden" + elif uv_nicht_angebunden: + grund = "Unterverteiler nicht angebunden" + else: + grund = "Fehlgeschlagenes Routing trotz Anbindung" + + ws4.append([uv, sensor, grund]) + + wb.save(outpath) @@ -291,8 +337,8 @@ def copy_layers_into_dxf_by_filter(dxf_source: ezdxf.document.Drawing, dxf_targe for ins in msp_source.query("INSERT"): new_ins = ins.copy() msp_target.add_entity(new_ins) - ''' + # 4. Filter-Layernamen bestimmen for layername in layernames: @@ -313,13 +359,13 @@ def copy_layers_into_dxf_by_filter(dxf_source: ezdxf.document.Drawing, dxf_targe for entity in entities: msp_target.add_entity(entity.copy()) - texts_source = collect_text_entities(msp_source) - texts_target = collect_text_entities(msp_target) + # texts_source = collect_text_entities(msp_source) + # texts_target = collect_text_entities(msp_target) - compare_texts(texts_source, texts_target) + # compare_texts(texts_source, texts_target) - used_block_names = set(insert.dxf.name for insert in dxf_source.modelspace().query("INSERT")) - compare_blocks(dxf_source, dxf_target, used_block_names) + # used_block_names = set(insert.dxf.name for insert in dxf_source.modelspace().query("INSERT")) + # compare_blocks(dxf_source, dxf_target, used_block_names) if __name__ == '__main__': diff --git a/lib/plant.py b/lib/plant.py index ce0d64c..14d5e58 100644 --- a/lib/plant.py +++ b/lib/plant.py @@ -483,13 +483,13 @@ class Anlage(): Eingabe: Dict des Equipments ({'Name': Point}), Dict der Aufpunkte von Sensoren o. Dists (zu Beginn leer) Rückgabe: Liste der nicht mit Racks verbundenen Geräte (z.B. Entfernung zu groß) ''' - errors = [] + errors = list() for name, pos in equipment.items(): try: onpoint, rackname = self.find_nearest_rack_from_point_STR_bbox(self._tol_connect, pos) onpoints[name] = (onpoint, rackname) except LookupError: - errors.append((name, (pos.x, pos.y))) # Name des fehlgeschlagenenen und Position als Koodinaten zurückgeben + errors.append({"name": name, "coords": {"x":pos.x, "y":pos.y}}) # Name des fehlgeschlagenenen und Position als Koodinaten zurückgeben continue self.add_point_to_rack(onpoint, rackname) @@ -586,12 +586,15 @@ class Anlage(): def create_cable_paths(self, G) -> dict: pfade = dict() pfade["kabel"] = list() - pfade["errors_routing"] = list() # Fehler Liste für fehlgeschlagene Kabelverbindungen + pfade["errors_routing"] = dict() + routing_errors = dict() # Fehler Liste für fehlgeschlagene Kabelverbindungen for sname, dname in self._sensor2dist.items(): try: pfad_nodes, pfad_length = self.create_cable_path(G, sname, dname) except: - pfade["errors_routing"].append((sname, dname)) + if dname not in routing_errors: + routing_errors[dname] = list() + routing_errors[dname].append(sname) continue pfad_coords = self._nodeids.get_points(pfad_nodes) @@ -609,6 +612,12 @@ class Anlage(): pfade["kabel"].append(ld) + + 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 def show_node_ids(self): diff --git a/lib/routing.py b/lib/routing.py index 81c8e29..10b349b 100644 --- a/lib/routing.py +++ b/lib/routing.py @@ -94,7 +94,7 @@ def create_plant(racks:dict, sensors:dict, distributors:dict, mapping:dict, tunn paths['errors_sensors'] = errors_sensors # Sensoren die nicht zu Racks verbunden werden konnten paths['errors_dists'] = errors_dists # Distributoren, die nicht zu Racks verbunden werden konnten paths['errors_tunnels'] = errors_tunnels # Tunnel, die nicht zu Racks verbunden werden konnten - # paths['errors_routing'] # Knoten des Graphen, die nicht verbunden werden konnten (Ausgabe wird in create_vable_paths() erstellt) + # paths['errors_routing'] # Knoten des Graphen, die nicht verbunden werden konnten (Ausgabe wird in create_cable_paths() erstellt) return paths