From 08633e15b732336d99396767fd1d928aaab7e487 Mon Sep 17 00:00:00 2001 From: mistangl Date: Wed, 10 Dec 2025 18:15:28 +0100 Subject: [PATCH] Warnungen werden jetzt immer als ganze Sektion auch in die .json von getpositions mit rausgeschrieben --- doc/Anwenderdoku_kurz.md | 20 ++++++++++++-------- lib/getpositions.py | 37 +++++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/doc/Anwenderdoku_kurz.md b/doc/Anwenderdoku_kurz.md index a9e4734..f4b3ea6 100644 --- a/doc/Anwenderdoku_kurz.md +++ b/doc/Anwenderdoku_kurz.md @@ -198,14 +198,15 @@ Die folgende Tabelle zeigt alle möglichen Fehler- und Warnungstypen, die von `g | Fehlertyp | Kategorie | Beschreibung | Ursache | Behebung | |-----------|-----------|--------------|---------|----------| -| `double_ids` | Fehler | Mehrere Blöcke haben dieselbe ID (z.B. MA0062@1) | Doppelte Bauteile mit identischer Kennzeichnung und SPS-Präfix im Layout | IDs eindeutig vergeben oder doppelte Blöcke entfernen | -| `missing_attributes` | Warnung | Block hat fehlende oder unvollständige Attribute | Block enthält z.B. nur A, B, C, ARTINR aber keine SPS-, IO- oder KENNZEICHNUNG-Attribute | Fehlende Attribute im DXF-Block ergänzen (z.B. SPS, KENNZEICHNUNG) | -| `missing_distributors` | Fehler | Unterverteiler in KENNZEICHNUNG erwähnt aber nicht im Layout | Sensor verweist auf UV (z.B. UH01) in KENNZEICHNUNG, aber UV-Symbol fehlt im Layout | Unterverteiler-Block im Layout positionieren oder KENNZEICHNUNG korrigieren | -| `missing_sensors` | Fehler | Sensor/Aktor nicht gefunden | Sensor wird in Mappings referenziert, aber Block fehlt oder hat ungültige Attribute | Sensor-Block im Layout ergänzen oder fehlerhafte Attribute korrigieren | -| `missing_tunnel` | Fehler | Tunnel hat weniger als 2 Positionen | Tunnel-Eingang oder -Ausgang fehlt (TUNNEL-Block oder MTEXT mit Muster `TUNNEL-`) | Zweiten Tunnel-Eingang/Ausgang im Layout ergänzen | -| `overdefined_tunnel` | Fehler | Tunnel hat mehr als 2 Positionen | Mehr als zwei TUNNEL-Blöcke mit demselben Namen (z.B. TUNNEL2 dreimal) | Überzählige Tunnel-Positionen entfernen | -| `mapping_warnings` → `keine KENNZEICHNUNG vorhanden` | Warnung | KENNZEICHNUNG-Attribut fehlt komplett | Block hat kein KENNZEICHNUNG-Attribut | KENNZEICHNUNG-Attribut im Format `=+-` ergänzen | -| `mapping_warnings` → `Ungültiger Pfad in Kennzeichnung` | Warnung | KENNZEICHNUNG hat falsches Format | Trennzeichen `+`, `-` oder `=` fehlen oder falsch positioniert | KENNZEICHNUNG-Format korrigieren (z.B. `=A01+UH01-KF1DQ04`) | +| `double_ids` | Fehler | Mehrere Blöcke haben dieselbe ID (z.B. MA0062@1) | Doppelte Bauteile mit identischer Kennzeichnung und SPS-Präfix im Layout | IDs eindeutig vergeben oder doppelte Blöcke entfernen | +| `missing_attributes` | Warnung | Block hat fehlende oder unvollständige Attribute | Block enthält z.B. nur A, B, C, ARTINR aber keine SPS-, IO- oder KENNZEICHNUNG-Attribute | Fehlende Attribute im DXF-Block ergänzen (z.B. SPS, KENNZEICHNUNG) | +| `missing_distributors` | Fehler | Unterverteiler in KENNZEICHNUNG erwähnt aber nicht im Layout | Sensor verweist auf UV (z.B. UH01) in KENNZEICHNUNG, aber UV-Symbol fehlt im Layout | Unterverteiler-Block im Layout positionieren oder KENNZEICHNUNG korrigieren | +| `missing_sensors` | Fehler | Sensor/Aktor nicht gefunden | Sensor wird in Mappings referenziert, aber Block fehlt oder hat ungültige Attribute | Sensor-Block im Layout ergänzen oder fehlerhafte Attribute korrigieren | +| `missing_tunnel` | Fehler | Tunnel hat weniger als 2 Positionen | Tunnel-Eingang oder -Ausgang fehlt (TUNNEL-Block oder MTEXT mit Muster `TUNNEL-`) | Zweiten Tunnel-Eingang/Ausgang im Layout ergänzen | +| `overdefined_tunnel` | Fehler | Tunnel hat mehr als 2 Positionen | Mehr als zwei TUNNEL-Blöcke mit demselben Namen (z.B. TUNNEL2 dreimal) | Überzählige Tunnel-Positionen entfernen | +| `tunnel_missing_length` | Warnung | Tunnel-Block hat kein LAENGE-Attribut | LAENGE-Attribut fehlt in Tunnel-Block, Default-Länge (5m) wird verwendet | LAENGE-Attribut im Tunnel-Block ergänzen | +| `mapping_warnings` → `keine KENNZEICHNUNG vorhanden` | Warnung | KENNZEICHNUNG-Attribut fehlt komplett | Block hat kein KENNZEICHNUNG-Attribut | KENNZEICHNUNG-Attribut im Format `=+-` ergänzen | +| `mapping_warnings` → `Ungültiger Pfad in Kennzeichnung` | Warnung | KENNZEICHNUNG hat falsches Format | Trennzeichen `+`, `-` oder `=` fehlen oder falsch positioniert | KENNZEICHNUNG-Format korrigieren (z.B. `=A01+UH01-KF1DQ04`) | | `missing_sps_prefix` | Fehler | SPS-Präfix fehlt für Block-ID | Beim Zusammenführen von Blöcken fehlt der SPS-Präfix | SPS-Attribut in Block ergänzen | ## Struktur der Error-JSON-Datei @@ -225,6 +226,9 @@ Die `*_errors.json`-Datei ist wie folgt strukturiert: }, "mapping_warnings": { "MA0099": "keine KENNZEICHNUNG vorhanden" + }, + "tunnel_missing_length": { + "TUNNEL1": "Tunnel 'TUNNEL1' hat keine LAENGE-Angabe. Verwende Default-Länge: 5m" } } } diff --git a/lib/getpositions.py b/lib/getpositions.py index d07c26f..8f7109e 100644 --- a/lib/getpositions.py +++ b/lib/getpositions.py @@ -583,49 +583,57 @@ def get_subdistributor_positions_from_symbols(all_inserts:list, all_positions:li return ret -def get_tunnel_positions_from_symbols(all_inserts: list, all_positions: list) -> dict: +def get_tunnel_positions_from_symbols(all_inserts: list, all_positions: list, error_collector: ErrorCollector = None) -> dict: """Ermittelt Tunnel-Positionen aus allen Symbolen - + Args: all_inserts: Liste von Dictionaries mit Attribut-Tags und deren Textwerten all_positions: Liste von Dictionaries mit Attribut-Tags und deren (x, y, z)-Positionen - + error_collector: ErrorCollector instance to collect errors and warnings + Returns: Dictionary mit Tunnelnamen als Keys und Listen von Positionen als Values Format: {'Tunnel1': [(x1, y1), (x2, y2)], ..., 'length': {'Tunnel1': 'laenge_wert', ...}} """ ret = {} tunnel_length = {} + tunnel_missing_length = {} default_length = "5" # Default-Länge in Metern - + for insert, pos in zip(all_inserts, all_positions): if "NAME" not in insert: # Tunnel haben immer einen eindeutigen Namen continue - + ld, id_ = get_tunnel_position_of_symbol(insert, pos) if not ld or not id_: continue - + # Check if id_ matches Tunnel-Pattern from BMK.cfg if not matches_tunnel_pattern(id_): continue - + # Sammle alle Positionen für den gleichen Tunnelnamen if id_ not in ret: ret[id_] = [] ret[id_].append(ld["pos"]) - + # Sammle Längeninformation falls vorhanden, sonst Default verwenden if "laenge" in ld and ld["laenge"]: tunnel_length[id_] = ld["laenge"] else: - print(f"WARNUNG: Tunnel '{id_}' hat keine LAENGE-Angabe. Verwende Default-Länge: {default_length}m") + warning_msg = f"Tunnel '{id_}' hat keine LAENGE-Angabe. Verwende Default-Länge: {default_length}m" + print(f"WARNUNG: {warning_msg}") + tunnel_missing_length[id_] = warning_msg tunnel_length[id_] = default_length - + + # Warnings zum ErrorCollector hinzufügen + if error_collector and tunnel_missing_length: + error_collector.add_warnings({"tunnel_missing_length": tunnel_missing_length}) + # Füge Längeninformation hinzu, falls Tunnel gefunden wurden if len(tunnel_length) > 0: ret['length'] = tunnel_length - + return ret @@ -995,7 +1003,7 @@ if __name__ == '__main__': # die Infos aus den Texten (alter Stil) res_tunnel = get_tunnel_positions_from_entities(t_entities) # die Infos aus den Blöcken (neuer Stil) - symbol_tunnels = get_tunnel_positions_from_symbols(all_inserts, all_positions) + symbol_tunnels = get_tunnel_positions_from_symbols(all_inserts, all_positions, error_collector) res_tunnel = merge_two_dicts(res_tunnel, symbol_tunnels) output_results['tunnels'] = res_tunnel if args.console: @@ -1021,6 +1029,9 @@ if __name__ == '__main__': # Alle weiteren Fehler zum ErrorCollector hinzufügen error_collector.add_errors(res_not_found) + # Warnings immer in output_results schreiben (auch wenn leer) + output_results["warnings"] = error_collector.warnings if error_collector.warnings else {} + # ErrorCollector schreibt Datei nur wenn Fehler/Warnungen vorhanden if args.errors: error_collector.write_errorfile(work_dir, args.errors) @@ -1031,8 +1042,6 @@ if __name__ == '__main__': output_results["not_found"] = all_issues["errors"].get("not_found", {}) if "double_ids" in all_issues["errors"]: output_results["double_ids"] = all_issues["errors"]["double_ids"] - if "missing_attributes" in all_issues.get("warnings", {}): - output_results["not_found"]["missing_attributes"] = all_issues["warnings"]["missing_attributes"] write_results(to_json(output_results), work_dir, f"{basename}.json")