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.
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: