From 20a3cdf761ff09beb01922d6ac85428bc7469204 Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 21 Jul 2025 12:43:00 +0200 Subject: [PATCH 1/2] ein paar Routinen Kommentiert --- lib/plant.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/plant.py b/lib/plant.py index 19c19d7..14e868c 100644 --- a/lib/plant.py +++ b/lib/plant.py @@ -14,6 +14,10 @@ import shapely # Globale Variable, die in main aufgerufen wird und steuert ob Graphen in unittests gezeichnet werden draw = False class PointSorter: + ''' Klasse, die Punkte sortiert. + Die Punkte werden in der Liste self.points gespeichert. + Die Punkte werden sortiert nach x- und y-Koordinate. + ''' def __init__(self): self.points = [] @@ -34,6 +38,9 @@ def to_json(d, pretty: bool = True) -> str: return json.dumps(d, indent=2 if pretty else None, default=str) #ensure_ascii false für darstellung von "ue" class NodeIDs(): + ''' Klasse, die Punkte verwaltet und NodeIDs zu Punkten zuordnet. + Die NodeIDs sind ganze Zahlen, die die Position der Punkte in der Liste self.points repräsentieren. + ''' def __init__(self, points=[]): self._counter = 0 self._cord2id = dict() @@ -41,6 +48,8 @@ class NodeIDs(): self.add_points(points) def add_point(self, point:Point): + ''' Fügt den Punkt unter einer neuen NodeId hinzu. + ''' if self.point_exists(point): return True self._counter += 1 @@ -78,6 +87,9 @@ class NodeIDs(): return len(self._cord2id.keys()) def get_points(self, nids:list[int]) -> list[Point]: + ''' Gibt zu einer Liste von NodeIDs die zugehörigen Punkte zurück. + Die Punkte werden in der gleichen Reihenfolge wie die NodeIDs zurückgegeben. + ''' ret = list() for n in nids: c = self.get_point(n) @@ -87,6 +99,9 @@ class NodeIDs(): def show(self): return self._id2cord class RackIDs(): + ''' Klasse, die Racks verwaltet und Rack-Racks und Rack-Equipment miteinander verbindet. + Die Racks werden als Linien in den STR-Baum eingefügt. + ''' def __init__(self, tol_snap = 200.0): self._point2rack = dict() self._rack2begend = dict() @@ -96,12 +111,18 @@ class RackIDs(): self._rack_tree = None def add_rack(self, beg:Point, end:Point, name:str): + ''' Fügt einen Rack hinzu. + Fügt die Anfangs- und Endpunkte des Racks zu den Racks hinzu. + ''' self.add_point_to_rack(beg, name) self.add_point_to_rack(end, name) self._rack2begend[name] = (beg, end) # Anfangs und Endpunkte zu Rack Namen merken def add_racks(self, racks:dict): + ''' Fügt Racks hinzu. + Fügt die Anfangs- und Endpunkte der Racks zu den Racks hinzu. + ''' for name,v in racks.items(): if len(v) == 2: self.add_rack(v[0], v[1], name) @@ -151,6 +172,9 @@ class RackIDs(): return ret_sorted def _build_rack_strtree(self): + ''' Erzeugt einen STR-Baum aus den Racks. + Die Racks werden als Linien in den STR-Baum eingefügt. + ''' self._rack_lines = [] self._rack_map = {} for r_name, pts in self.get_racks_borders().items(): @@ -160,6 +184,9 @@ class RackIDs(): self._rack_tree = STRtree(self._rack_lines) def join_racks_str(self): + ''' Verbindet Racks miteinander. + Die Racks werden als Linien in den STR-Baum eingefügt. + ''' if self._rack_tree is None: self._build_rack_strtree() @@ -192,7 +219,10 @@ class RackIDs(): connrackname = f"c-{rnames[l2]}-{rnames[l1]}" self.add_rack(pt, snap_point, connrackname) - def rack_is_horizontal(self, name): + def rack_is_horizontal(self, name): + ''' Gibt True zurück, wenn der Rack horizontal ist. + False, wenn der Rack vertikal ist. + ''' [pa, pe] = self._rack2begend[name] if pa.y == pe.y: return True From 244898547ec433c59f346e4bf23d699fc1fe949a Mon Sep 17 00:00:00 2001 From: mistangl Date: Mon, 21 Jul 2025 12:44:34 +0200 Subject: [PATCH 2/2] Block mit B wird nur gecheckt, wenn nicht auch IO vorhanden ist, damit die alten Modelle funktionieren --- lib/getpositions.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/getpositions.py b/lib/getpositions.py index c4c2432..796d7ae 100644 --- a/lib/getpositions.py +++ b/lib/getpositions.py @@ -7,11 +7,8 @@ import sys from pathlib import Path import ezdxf -import ezdxf.filemanagement from ezdxf.addons import iterdxf from shapely.geometry import Point - -# Fix import for DXFStructureError from ezdxf.lldxf.const import DXFStructureError @@ -75,6 +72,7 @@ def get_attributes_of_insert(d_insert: dict, d_pos: dict) -> tuple[dict, str, st pos = d_pos["IO"] typ = get_type_of_name_cfg(d_insert["IO"]) + # neuer Block: Enthält alles was nötig is if "ARTINR" in d_insert and "SPS" in d_insert: id_ = d_insert["IO"]+"@"+d_insert["SPS"] ld["pos"] = (pos[0], pos[1]) @@ -108,7 +106,7 @@ def get_attributes_of_insert(d_insert: dict, d_pos: dict) -> tuple[dict, str, st pos = d_pos["NAME"] ld["pos"] = (pos[0], pos[1]) - if "B" in d_insert: + if "B" in d_insert and "IO" not in d_insert: attr_text = d_insert["B"] typ = get_type_of_name_cfg(attr_text) id_ = attr_text @@ -227,11 +225,14 @@ def extract_input_positions(insert_iterable) -> tuple[dict, dict, dict, dict]: ld, id_, typ = get_attributes_of_insert(insert, pos) if typ == "Sensor": - # wenn NAME enthalten ist, dann ist das ein eindeutiger Bezeichner + # wenn NAME enthalten ist, z.B. bei Erdungslayouts, dann ist das ein eindeutiger Bezeichner if "NAME" in ld: all_sensors[id_] = ld + # neuer Block der alle nötigen Infos enthält + elif "IO" in ld and "ARTINR" in ld : + all_sensors[id_] = ld + # alle anderen Sachen werden dann aus mehreren Rahmen zusammen gesammelt else: - # alle anderen Sachen werden dann aus mehreren Rahmen zusammen gesammelt wp.add_block(id_, ld) elif typ == "Kabel": @@ -661,6 +662,11 @@ def check_environment_var(env_str: str) -> Path: print(f"Umgebungsvariable {env_str} ist nicht gesetzt oder leer.") exit() +def get_input_positions_combined(source: str, use_iter: bool) -> tuple[dict, dict, dict, dict]: + if use_iter: + return get_input_positions_iter(source) + else: + return get_input_positions(source) if __name__ == '__main__': parser = argparse.ArgumentParser(description='fetches the x/y positions from a dxf file', prog='getpositions') @@ -727,10 +733,7 @@ if __name__ == '__main__': if args.sensors: # Sensoren auslesen - if use_iter: - res_sens, res_schaltschrank_elemente, res_double, missing_attribs = get_input_positions_iter(dxf_path) - else: - res_sens, res_schaltschrank_elemente, res_double, missing_attribs = get_input_positions(msp) + res_sens, res_schaltschrank_elemente, res_double, missing_attribs = get_input_positions_combined(dxf_path if use_iter else msp, use_iter) if args.errors and len(res_double) > 0: print("Duplicate blocks found. Writing errors-file.")