diff --git a/lib/create_numbers.py b/lib/create_numbers.py index f835feb..2790c62 100644 --- a/lib/create_numbers.py +++ b/lib/create_numbers.py @@ -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. 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 block_name: Name des Renamer-Blocks (für Fehlermeldungen) error_collector: ErrorCollector für Fehlerbehandlung + polyline_max_distance: Maximale Distanz zur Polylinie (aus Config) Returns: 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: # 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 for symbol in symbols: @@ -875,11 +876,14 @@ def collect_symbols_from_group(doc, msp, renamer_layers, group_blocks, block_nam 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. Sammelt Symbole, sortiert sie und nummeriert sie. + Args: + polyline_max_distance: Maximale Distanz zur Polylinie (aus Config) + Returns: 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)") # 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") @@ -967,7 +971,7 @@ def find_symbols_with_at_in_io(doc, msp, error_collector): 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. @@ -976,6 +980,7 @@ def check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos): boundary: Polygon-Punkte des Renamer-Bereichs attributes: Attribute des Renamer-Blocks renamer_pos: Position des Renamer-Blocks + polyline_max_distance: Maximale Distanz zur Polylinie (aus Config) Returns: Tuple (in_boundary, wrong_layer_info): @@ -988,7 +993,7 @@ def check_symbol_in_boundary(symbol, boundary, attributes, renamer_pos): if is_polyline_path: # 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 else: # 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. + + Args: + polyline_max_distance: Maximale Distanz zur Polylinie (aus Config) """ print("\n" + "="*60) 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 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: # 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") -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. Gruppiert Blöcke mit identischer Konfiguration und nummeriert alle Symbole aus allen Blöcken einer Gruppe gemeinsam. + Args: + polyline_max_distance: Maximale Distanz zur Polylinie (aus Config) + Returns: Tuple (all_renamed, renamer_groups): - 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) # 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 - 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 -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. @@ -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_layers: Liste der Layer mit Renamer-Blöcken error_collector: ErrorCollector für Fehlerbehandlung + polyline_max_distance: Maximale Distanz zur Polylinie (aus Config) Returns: 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: # 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 for symbol in symbols: @@ -1325,6 +1337,11 @@ if __name__ == '__main__': print("Keine Layer in der Konfiguration gefunden") 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 if dxf_is_binary(dxf_path): 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("="*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(f"Verarbeitung abgeschlossen: {len(renamed_symbols)} Symbole nummeriert") @@ -1354,7 +1371,7 @@ if __name__ == '__main__': # Zeichne Symbol-Rahmen wenn gewünscht 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: draw_symbol_frames(doc, msp, all_symbols) else: