Zusätzliche Abfragen für Fehler durch überlappende Renaming Frames eingebaut

This commit is contained in:
2026-02-05 17:36:18 +01:00
parent 31084defdb
commit e600dfbae8
3 changed files with 436 additions and 30 deletions
+110 -3
View File
@@ -881,6 +881,98 @@ def check_symbols_in_boundaries(doc, msp, renamer_groups, error_collector):
print(f" Alle {len(symbols_with_at)} Symbole mit '@' im IO liegen in einem Renamer-Bereich.")
def rectangles_overlap(boundary1, boundary2):
"""
Prüft ob sich zwei Rechteck-Boundaries überlappen.
Args:
boundary1: Liste von (x, y) Punkten (mindestens 4 Eckpunkte)
boundary2: Liste von (x, y) Punkten (mindestens 4 Eckpunkte)
Returns:
True wenn sich die Rechtecke überlappen
"""
# Extrahiere Min/Max für beide Rechtecke
b1_xs = [p[0] for p in boundary1]
b1_ys = [p[1] for p in boundary1]
b1_left, b1_right = min(b1_xs), max(b1_xs)
b1_bottom, b1_top = min(b1_ys), max(b1_ys)
b2_xs = [p[0] for p in boundary2]
b2_ys = [p[1] for p in boundary2]
b2_left, b2_right = min(b2_xs), max(b2_xs)
b2_bottom, b2_top = min(b2_ys), max(b2_ys)
# Prüfe ob keine Überlappung
no_overlap = (b1_right <= b2_left or # B1 ist links von B2
b2_right <= b1_left or # B2 ist links von B1
b1_top <= b2_bottom or # B1 ist unter B2
b2_top <= b1_bottom) # B2 ist unter B1
return not no_overlap
def check_overlapping_renamer_blocks(renamer_groups, error_collector):
"""
Prüft ob sich Renamer-Rechtecke überlappen.
Polyline-Pfade (DIRECTION=POLYLINE_PATH) werden nicht geprüft.
Args:
renamer_groups: Dictionary mit gruppierten Renamer-Blöcken
error_collector: ErrorCollector für Fehlerbehandlung
"""
print("\n" + "="*60)
print("Prüfe auf überlappende Renamer-Bereiche")
print("="*60)
# Sammle alle Rechteck-Renamer (ohne POLYLINE_PATH)
rectangle_renamers = []
for config_key, group_blocks in renamer_groups.items():
for insert, boundary, attributes, is_rectangle in group_blocks:
direction = attributes.get("DIRECTION", "")
block_name = attributes.get('NAME', attributes.get('NAME1', 'UNKNOWN'))
# Überspringe POLYLINE_PATH
if direction == 'POLYLINE_PATH':
continue
# Nur Rechtecke prüfen
if is_rectangle:
rectangle_renamers.append({
'name': block_name,
'position': insert.dxf.insert,
'boundary': boundary,
'direction': direction,
'is_rectangle': is_rectangle
})
# Prüfe alle Paare auf Überlappung
overlaps_found = []
for i in range(len(rectangle_renamers)):
for j in range(i + 1, len(rectangle_renamers)):
r1 = rectangle_renamers[i]
r2 = rectangle_renamers[j]
if rectangles_overlap(r1['boundary'], r2['boundary']):
overlaps_found.append((r1, r2))
# Melde Fehler
if overlaps_found:
print(f"\nFEHLER: {len(overlaps_found)} Überlappung(en) zwischen Renamer-Bereichen gefunden:")
for r1, r2 in overlaps_found:
error_msg = (
f"Renamer-Bereich '{r1['name']}' an Position "
f"({r1['position'][0]:.1f}, {r1['position'][1]:.1f}) "
f"überlappt mit Renamer-Bereich '{r2['name']}' an Position "
f"({r2['position'][0]:.1f}, {r2['position'][1]:.1f}). "
f"Symbole könnten mehrfach nummeriert werden."
)
print(f" {error_msg}")
error_collector.add_errors({"overlapping_renamer_blocks": error_msg})
else:
print(f"\nOK: Keine Überlappungen zwischen {len(rectangle_renamers)} Renamer-Rechtecken gefunden")
def process_renamer_blocks(doc, msp, renamer_layers, error_collector):
"""
Verarbeitet alle Renamer-Blöcke auf den angegebenen Layern.
@@ -895,6 +987,9 @@ def process_renamer_blocks(doc, msp, renamer_layers, error_collector):
# Erster Pass: Sammle und gruppiere alle Renamer-Blöcke
renamer_groups = collect_and_group_renamer_blocks(doc, msp, renamer_layers, error_collector)
# Prüfe auf überlappende Renamer-Bereiche
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)
@@ -975,10 +1070,15 @@ if __name__ == '__main__':
parser.add_argument('-e', '--errorfile', action='store', required=False, help='JSON-Datei für Fehler und Warnungen', metavar='errors.json')
parser.add_argument('-i', '--info', action='store', help='Schreibe Ergebnisse der Nummerierung in eine JSON-Datei')
parser.add_argument('-d', '--dryrun', action='store_true', help='Symbole nicht in der DXF-Datei überschreiben, nur Ausgabe auf Konsole')
parser.add_argument('--overwrite', action='store_true', help='Überschreibt die Originaldatei anstatt eine neue Datei mit Suffix _numbered zu erstellen')
parser.add_argument('--show_symbol_frames', action='store_true', help='Zeichne Rahmen um jedes Symbol, um die Grenze des Symbols zu visualisieren')
args = parser.parse_args()
# Validierung: --overwrite und --dryrun können nicht zusammen verwendet werden
if args.overwrite and args.dryrun:
parser.error("--overwrite und --dryrun können nicht zusammen verwendet werden")
# Initialisiere ErrorCollector
error_collector = ErrorCollector()
@@ -1042,9 +1142,16 @@ if __name__ == '__main__':
# Speichere DXF-Datei wenn nicht dry-run
if not args.dryrun:
output_path = dxf_path.parent / f"{dxf_path.stem}_numbered{dxf_path.suffix}"
doc.saveas(output_path)
print(f"\nNummerierte DXF-Datei gespeichert: {output_path}")
if args.overwrite:
# Überschreibe die Originaldatei
output_path = dxf_path
doc.saveas(output_path)
print(f"\nOriginaldatei überschrieben: {output_path}")
else:
# Erstelle neue Datei mit _numbered Suffix
output_path = dxf_path.parent / f"{dxf_path.stem}_numbered{dxf_path.suffix}"
doc.saveas(output_path)
print(f"\nNummerierte DXF-Datei gespeichert: {output_path}")
else:
print("\nDry-run Modus: DXF-Datei wurde nicht überschrieben")