Zusätzliche Abfragen für Fehler durch überlappende Renaming Frames eingebaut
This commit is contained in:
+110
-3
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user