From e2237fde104650138ed98c7f472a50142c75bb04 Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Tue, 27 Oct 2026 13:29:43 +0100 Subject: [PATCH] feat: Bereinigung (PURGE) vor Sivas-Export und zusammengefasste CSV je Dispogruppe EXPORTSIVAS bereinigt die Zeichnung vorab per -PURGE (abschaltbar ueber *csv-bereinigen-vor-export*). export_sivas.py schreibt zusaetzlich je Dispogruppe eine Datei _zusammengefasst_dispo.csv. Co-Authored-By: Claude Sonnet 5.5 --- Lisp/export.lsp | 19 +++++++++++++++++++ lang/de_DE.json | 1 + lang/en_GB.json | 1 + lib/export_sivas.py | 20 ++++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/Lisp/export.lsp b/Lisp/export.lsp index eb52a69..8687217 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -2941,8 +2941,27 @@ (princ (ssg-text "exp-hoehencheck-fehlt"))))) ) +;; Vor dem Sivas-Export die Zeichnung bereinigen (BricsCAD-Befehl BEREINIG / +;; PURGE): entfernt unbenutzte Bloecke, Layer, Linientypen usw. samt +;; verschachtelter Elemente. Sprachunabhaengig ueber -PURGE mit "_All". +;; Schalter *csv-bereinigen-vor-export* (Standard an; Tests schalten ab, da +;; die Zeichnung veraendert wird). +(if (null *csv-bereinigen-vor-export*) (setq *csv-bereinigen-vor-export* 'an)) + +(defun csv:bereinigen () + (if (and (eq *csv-bereinigen-vor-export* 'an) (ssg-gui-p)) + (progn + (princ (ssg-text "exp-bereinigen")) + ;; Zweimal, weil das Entfernen eines Blocks dessen Layer/Linientypen + ;; erst frei macht (zusaetzlich zur Nested-Option) + (repeat 2 + (vl-catch-all-apply + '(lambda () (command "_.-PURGE" "_All" "*" "_No")))) + (princ)))) + ;; --- EXPORTSIVAS: Sivas-spezifischer CSV-Export mit Summierungszeilen --- (defun c:EXPORTSIVAS () + (csv:bereinigen) (csv:hoehencheck-anbieten) (csv:run-export "EXPORTSIVAS" (export:filename "sivas_script") diff --git a/lang/de_DE.json b/lang/de_DE.json index 8749426..dbdb4e4 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -729,6 +729,7 @@ "exp-check-ids": "\n[%1] Pruefe und vergebe IDs...", "exp-hoehencheck-frage": "\nVor dem Export den Hoehen-Check (Montagehoehe/Buehnen) ausfuehren?", "exp-hoehencheck-fehlt": "\nHinweis: HOEHEN_CHECK nicht verfuegbar - Export laeuft ohne Hoehen-Check.", + "exp-bereinigen": "\nBereinige Zeichnung (PURGE: unbenutzte Bloecke, Layer, Linientypen) ...", "exp-hoehen-aktualisiert": "\nHoehen-Attribute von %1 verschobenen Bloecken aus der Z-Koordinate neu gesetzt.", "exp-sep-proxy-fehler": "\n[EXPORT] WARNUNG: Kopie von '%1' aus Block '%2' fehlgeschlagen (%3) - dieses Element fehlt im Export.", "exp-sep-zuordnung": "\n[%1] verpackte Separator-Kopie(n): ZUORDNUNG aus der ID des Wrapper-Blocks gesetzt.", diff --git a/lang/en_GB.json b/lang/en_GB.json index 0ae7659..e42686c 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -729,6 +729,7 @@ "exp-check-ids": "\n[%1] Checking and assigning IDs...", "exp-hoehencheck-frage": "\nRun the height check (mounting height/platforms) before the export?", "exp-hoehencheck-fehlt": "\nNote: HOEHEN_CHECK not available - export runs without height check.", + "exp-bereinigen": "\nPurging drawing (unused blocks, layers, linetypes) ...", "exp-hoehen-aktualisiert": "\nHeight attributes of %1 moved blocks reset from their Z coordinate.", "exp-sep-proxy-fehler": "\n[EXPORT] WARNING: copying '%1' out of block '%2' failed (%3) - this element is missing from the export.", "exp-sep-zuordnung": "\n[%1] packed separator copy/copies: ZUORDNUNG set from the wrapper block ID.", diff --git a/lib/export_sivas.py b/lib/export_sivas.py index dc7892e..83b6f14 100644 --- a/lib/export_sivas.py +++ b/lib/export_sivas.py @@ -58,6 +58,7 @@ items_zusammenfassen. output.csv selbst bleibt unveraendert. import json import sys import os +import re from export_blockpatterns import (load_patterns, load_export_cfg, cfg_path_from_env, matches_any, csv_quote, safe_float, safe_int) @@ -1184,6 +1185,13 @@ def zusammengefasster_dateiname(output_csv): return f"{stamm}_zusammengefasst{endung}" +def dispogruppen_dateiname(output_csv, dispo): + """z.B. "500651_sivas.csv", "10" -> "500651_sivas_zusammengefasst_dispo10.csv".""" + stamm, endung = os.path.splitext(output_csv) + sauber = re.sub(r"[^0-9A-Za-z_-]", "_", str(dispo)) or "leer" + return f"{stamm}_zusammengefasst_dispo{sauber}{endung}" + + def items_zusammenfassen(items): """Fasst Zeilen zusammen, die sich nur in Nr, Anzahl und IDs unterscheiden: Anzahl wird addiert, die IDs werden (ohne Dubletten, in @@ -1261,6 +1269,18 @@ def main(): print(f"[export_sivas] Zusammengefasste CSV geschrieben: {output_csv_zus} " f"({len(items_zus)} Zeilen)") + # Je Dispogruppe eine eigene zusammengefasste Datei, z.B. + # "_zusammengefasst_dispo10.csv" (Nr je Datei neu gezaehlt). + for dispo in sorted({str(i["dispgruppe"]) for i in items_zus}): + teil = [i for i in items_zus if str(i["dispgruppe"]) == dispo] + teil = [dict(i, nr=n) for n, i in enumerate(teil, 1)] + pfad = dispogruppen_dateiname(output_csv, dispo) + with open(pfad, "w", encoding="utf-8") as f: + f.write(header + "\n") + for item in teil: + f.write(format_csv_line(item) + "\n") + print(f"[export_sivas] Dispogruppe {dispo}: {pfad} ({len(teil)} Zeilen)") + # Zweite, lesbare Kopie fuer die manuelle Pruefung (Merkmalnummer + # Bezeichnung aus cfg/Merkmalsstamm_in_Sivas.xlsx) - wird von Sivas # selbst NICHT eingelesen, nur output_csv ist der eigentliche Import.