hole den maximal möglichen Abstand eines Symbols aus der Config

This commit is contained in:
2026-02-06 08:14:08 +01:00
parent b7d98cbf14
commit 8b18de6a31
+32 -15
View File
@@ -826,7 +826,7 @@ def create_no_symbols_found_error_message(block_name, direction, layer_names, gr
) )
def collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_name, error_collector): def collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_name, error_collector, polyline_max_distance=500.0):
""" """
Sammelt alle Symbole aus allen Boundaries einer Renamer-Gruppe. Sammelt alle Symbole aus allen Boundaries einer Renamer-Gruppe.
Prüft auf Duplikate (Symbole in mehreren Bereichen). Prüft auf Duplikate (Symbole in mehreren Bereichen).
@@ -838,6 +838,7 @@ def collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_nam
group_blocks: Liste von (insert, boundary, attributes, is_rectangle) Tupeln group_blocks: Liste von (insert, boundary, attributes, is_rectangle) Tupeln
block_name: Name des Renamer-Blocks (für Fehlermeldungen) block_name: Name des Renamer-Blocks (für Fehlermeldungen)
error_collector: ErrorCollector für Fehlerbehandlung error_collector: ErrorCollector für Fehlerbehandlung
polyline_max_distance: Maximale Distanz zur Polylinie (aus Config)
Returns: Returns:
Liste aller eindeutigen Symbole Liste aller eindeutigen Symbole
@@ -847,7 +848,7 @@ def collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_nam
for insert, boundary, attributes, is_rectangle in group_blocks: for insert, boundary, attributes, is_rectangle in group_blocks:
# Finde Symbole innerhalb dieses Bereichs # Finde Symbole innerhalb dieses Bereichs
symbols = find_symbols_in_boundary(doc, msp, boundary, renamer_layers, attributes, error_collector) symbols = find_symbols_in_boundary(doc, msp, boundary, renamer_layers, attributes, error_collector, polyline_max_distance)
# Füge Symbole hinzu, aber nur wenn das Entity noch nicht gesehen wurde # Füge Symbole hinzu, aber nur wenn das Entity noch nicht gesehen wurde
for symbol in symbols: for symbol in symbols:
@@ -875,11 +876,14 @@ def collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_nam
return all_symbols return all_symbols
def process_renamer_groups(doc, msp, renamer_layers, renamer_groups, error_collector): def process_renamer_groups(doc, msp, renamer_layers, renamer_groups, error_collector, polyline_max_distance=500.0):
""" """
Zweiter Pass: Verarbeitet jede Renamer-Block-Gruppe. Zweiter Pass: Verarbeitet jede Renamer-Block-Gruppe.
Sammelt Symbole, sortiert sie und nummeriert sie. Sammelt Symbole, sortiert sie und nummeriert sie.
Args:
polyline_max_distance: Maximale Distanz zur Polylinie (aus Config)
Returns: Returns:
Liste aller umbenannten Symbole Liste aller umbenannten Symbole
""" """
@@ -897,7 +901,7 @@ def process_renamer_groups(doc, msp, renamer_layers, renamer_groups, error_colle
print(f"\n Verarbeite Gruppe: {block_name} ({len(group_blocks)} Renamer-Blöcke)") print(f"\n Verarbeite Gruppe: {block_name} ({len(group_blocks)} Renamer-Blöcke)")
# Sammle Symbole aus ALLEN Boundaries dieser Gruppe # Sammle Symbole aus ALLEN Boundaries dieser Gruppe
all_symbols = collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_name, error_collector) all_symbols = collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_name, error_collector, polyline_max_distance)
print(f" Gesamt {len(all_symbols)} eindeutige Template-Symbole aus {len(group_blocks)} Blöcken") print(f" Gesamt {len(all_symbols)} eindeutige Template-Symbole aus {len(group_blocks)} Blöcken")
@@ -967,7 +971,7 @@ def find_symbols_with_at_in_io(doc, msp, error_collector):
return symbols_with_at return symbols_with_at
def check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos): def check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos, polyline_max_distance=500.0):
""" """
Prüft ob ein Symbol geometrisch und vom Layer her in einem Renamer-Bereich liegt. Prüft ob ein Symbol geometrisch und vom Layer her in einem Renamer-Bereich liegt.
@@ -976,6 +980,7 @@ def check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos):
boundary: Polygon-Punkte des Renamer-Bereichs boundary: Polygon-Punkte des Renamer-Bereichs
attributes: Attribute des Renamer-Blocks attributes: Attribute des Renamer-Blocks
renamer_pos: Position des Renamer-Blocks renamer_pos: Position des Renamer-Blocks
polyline_max_distance: Maximale Distanz zur Polylinie (aus Config)
Returns: Returns:
Tuple (in_boundary, wrong_layer_info): Tuple (in_boundary, wrong_layer_info):
@@ -988,7 +993,7 @@ def check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos):
if is_polyline_path: if is_polyline_path:
# Für POLYLINE_PATH: Prüfe Nähe zur Polylinie # Für POLYLINE_PATH: Prüfe Nähe zur Polylinie
if not point_near_polyline(symbol['position'], boundary, max_distance=500.0): if not point_near_polyline(symbol['position'], boundary, max_distance=polyline_max_distance):
return False, None return False, None
else: else:
# Für Rechtecke: Prüfe ob innerhalb des Polygons # Für Rechtecke: Prüfe ob innerhalb des Polygons
@@ -1042,9 +1047,12 @@ def create_wrong_layer_warning(symbol, wrong_layer_info):
) )
def check_symbols_in_boundaries(doc, msp, renamer_groups, error_collector): def check_symbols_in_boundaries(doc, msp, renamer_groups, error_collector, polyline_max_distance=500.0):
""" """
Dritter Pass: Prüft ob alle Symbole mit "@" im IO in einem Renamer-Bereich liegen. Dritter Pass: Prüft ob alle Symbole mit "@" im IO in einem Renamer-Bereich liegen.
Args:
polyline_max_distance: Maximale Distanz zur Polylinie (aus Config)
""" """
print("\n" + "="*60) print("\n" + "="*60)
print("Prüfe ob alle Symbole mit '@' im IO in einem Renamer-Bereich liegen") print("Prüfe ob alle Symbole mit '@' im IO in einem Renamer-Bereich liegen")
@@ -1066,7 +1074,7 @@ def check_symbols_in_boundaries(doc, msp, renamer_groups, error_collector):
wrong_layer_info = None wrong_layer_info = None
for boundary, attributes, renamer_pos in all_boundaries: for boundary, attributes, renamer_pos in all_boundaries:
is_in_boundary, layer_info = check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos) is_in_boundary, layer_info = check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos, polyline_max_distance)
if is_in_boundary: if is_in_boundary:
# Layer passt auch - alles OK # Layer passt auch - alles OK
@@ -1193,12 +1201,15 @@ def check_overlapping_renamer_blocks(renamer_groups, error_collector):
print(f"\nOK: Keine Überlappungen zwischen {len(rectangle_renamers)} Renamer-Rechtecken gefunden") print(f"\nOK: Keine Überlappungen zwischen {len(rectangle_renamers)} Renamer-Rechtecken gefunden")
def process_renamer_blocks(doc, msp, renamer_layers, error_collector): def process_renamer_blocks(doc, msp, renamer_layers, error_collector, polyline_max_distance=500.0):
""" """
Verarbeitet alle Renamer-Blöcke auf den angegebenen Layern. Verarbeitet alle Renamer-Blöcke auf den angegebenen Layern.
Gruppiert Blöcke mit identischer Konfiguration und nummeriert alle Symbole Gruppiert Blöcke mit identischer Konfiguration und nummeriert alle Symbole
aus allen Blöcken einer Gruppe gemeinsam. aus allen Blöcken einer Gruppe gemeinsam.
Args:
polyline_max_distance: Maximale Distanz zur Polylinie (aus Config)
Returns: Returns:
Tuple (all_renamed, renamer_groups): Tuple (all_renamed, renamer_groups):
- all_renamed: Liste der umbenannten Symbole - all_renamed: Liste der umbenannten Symbole
@@ -1211,15 +1222,15 @@ def process_renamer_blocks(doc, msp, renamer_layers, error_collector):
check_overlapping_renamer_blocks(renamer_groups, error_collector) check_overlapping_renamer_blocks(renamer_groups, error_collector)
# Zweiter Pass: Verarbeite jede Gruppe # Zweiter Pass: Verarbeite jede Gruppe
all_renamed = process_renamer_groups(doc, msp, renamer_layers, renamer_groups, error_collector) all_renamed = process_renamer_groups(doc, msp, renamer_layers, renamer_groups, error_collector, polyline_max_distance)
# Dritter Pass: Prüfe ob alle Symbole mit "@" im IO in einem Renamer-Bereich liegen # Dritter Pass: Prüfe ob alle Symbole mit "@" im IO in einem Renamer-Bereich liegen
check_symbols_in_boundaries(doc, msp, renamer_groups, error_collector) check_symbols_in_boundaries(doc, msp, renamer_groups, error_collector, polyline_max_distance)
return all_renamed, renamer_groups return all_renamed, renamer_groups
def collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, error_collector): def collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, error_collector, polyline_max_distance=500.0):
""" """
Sammelt alle Symbole aus allen Renamer-Gruppen für Visualisierungszwecke. Sammelt alle Symbole aus allen Renamer-Gruppen für Visualisierungszwecke.
@@ -1229,6 +1240,7 @@ def collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, er
renamer_groups: Dictionary mit gruppierten Renamer-Blöcken renamer_groups: Dictionary mit gruppierten Renamer-Blöcken
renamer_layers: Liste der Layer mit Renamer-Blöcken renamer_layers: Liste der Layer mit Renamer-Blöcken
error_collector: ErrorCollector für Fehlerbehandlung error_collector: ErrorCollector für Fehlerbehandlung
polyline_max_distance: Maximale Distanz zur Polylinie (aus Config)
Returns: Returns:
Liste aller gefundenen Symbole mit 'entity', 'position', 'attributes', 'layer' Liste aller gefundenen Symbole mit 'entity', 'position', 'attributes', 'layer'
@@ -1244,7 +1256,7 @@ def collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, er
for insert, boundary, attributes, is_rectangle in group_blocks: for insert, boundary, attributes, is_rectangle in group_blocks:
# Finde Symbole innerhalb dieses Bereichs # Finde Symbole innerhalb dieses Bereichs
symbols = find_symbols_in_boundary(doc, msp, boundary, renamer_layers, attributes, error_collector) symbols = find_symbols_in_boundary(doc, msp, boundary, renamer_layers, attributes, error_collector, polyline_max_distance)
# Füge Symbole hinzu, aber nur wenn das Entity noch nicht gesehen wurde # Füge Symbole hinzu, aber nur wenn das Entity noch nicht gesehen wurde
for symbol in symbols: for symbol in symbols:
@@ -1325,6 +1337,11 @@ if __name__ == '__main__':
print("Keine Layer in der Konfiguration gefunden") print("Keine Layer in der Konfiguration gefunden")
exit(1) exit(1)
# Lese Parameter aus Config
config_parameters = read_config_parameters(config_path)
polyline_max_distance = config_parameters.get('polyline_max_distance', 500.0)
print(f"Parameter: polyline_max_distance = {polyline_max_distance}")
# Lese DXF-Datei # Lese DXF-Datei
if dxf_is_binary(dxf_path): if dxf_is_binary(dxf_path):
print("DXF-Datei ist binär. Lese komplette Datei. Achten Sie auf RAM-Nutzung.") print("DXF-Datei ist binär. Lese komplette Datei. Achten Sie auf RAM-Nutzung.")
@@ -1340,7 +1357,7 @@ if __name__ == '__main__':
print("Starte Verarbeitung der Renamer-Blöcke") print("Starte Verarbeitung der Renamer-Blöcke")
print("="*60 + "\n") print("="*60 + "\n")
renamed_symbols, renamer_groups = process_renamer_blocks(doc, msp, renamer_layers, error_collector) renamed_symbols, renamer_groups = process_renamer_blocks(doc, msp, renamer_layers, error_collector, polyline_max_distance)
print("\n" + "="*60) print("\n" + "="*60)
print(f"Verarbeitung abgeschlossen: {len(renamed_symbols)} Symbole nummeriert") print(f"Verarbeitung abgeschlossen: {len(renamed_symbols)} Symbole nummeriert")
@@ -1354,7 +1371,7 @@ if __name__ == '__main__':
# Zeichne Symbol-Rahmen wenn gewünscht # Zeichne Symbol-Rahmen wenn gewünscht
if args.show_symbol_frames: if args.show_symbol_frames:
all_symbols = collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, error_collector) all_symbols = collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, error_collector, polyline_max_distance)
if all_symbols: if all_symbols:
draw_symbol_frames(doc, msp, all_symbols) draw_symbol_frames(doc, msp, all_symbols)
else: else: