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 <stamm>_zusammengefasst_dispo<N>.csv.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-27 13:29:43 +01:00
parent f2a5f6ca75
commit e2237fde10
4 changed files with 41 additions and 0 deletions
+19
View File
@@ -2941,8 +2941,27 @@
(princ (ssg-text "exp-hoehencheck-fehlt"))))) (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 --- ;; --- EXPORTSIVAS: Sivas-spezifischer CSV-Export mit Summierungszeilen ---
(defun c:EXPORTSIVAS () (defun c:EXPORTSIVAS ()
(csv:bereinigen)
(csv:hoehencheck-anbieten) (csv:hoehencheck-anbieten)
(csv:run-export "EXPORTSIVAS" (csv:run-export "EXPORTSIVAS"
(export:filename "sivas_script") (export:filename "sivas_script")
+1
View File
@@ -729,6 +729,7 @@
"exp-check-ids": "\n[%1] Pruefe und vergebe IDs...", "exp-check-ids": "\n[%1] Pruefe und vergebe IDs...",
"exp-hoehencheck-frage": "\nVor dem Export den Hoehen-Check (Montagehoehe/Buehnen) ausfuehren?", "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-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-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-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.", "exp-sep-zuordnung": "\n[%1] verpackte Separator-Kopie(n): ZUORDNUNG aus der ID des Wrapper-Blocks gesetzt.",
+1
View File
@@ -729,6 +729,7 @@
"exp-check-ids": "\n[%1] Checking and assigning IDs...", "exp-check-ids": "\n[%1] Checking and assigning IDs...",
"exp-hoehencheck-frage": "\nRun the height check (mounting height/platforms) before the export?", "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-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-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-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.", "exp-sep-zuordnung": "\n[%1] packed separator copy/copies: ZUORDNUNG set from the wrapper block ID.",
+20
View File
@@ -58,6 +58,7 @@ items_zusammenfassen. output.csv selbst bleibt unveraendert.
import json import json
import sys import sys
import os import os
import re
from export_blockpatterns import (load_patterns, load_export_cfg, cfg_path_from_env, from export_blockpatterns import (load_patterns, load_export_cfg, cfg_path_from_env,
matches_any, csv_quote, safe_float, safe_int) matches_any, csv_quote, safe_float, safe_int)
@@ -1184,6 +1185,13 @@ def zusammengefasster_dateiname(output_csv):
return f"{stamm}_zusammengefasst{endung}" 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): def items_zusammenfassen(items):
"""Fasst Zeilen zusammen, die sich nur in Nr, Anzahl und IDs """Fasst Zeilen zusammen, die sich nur in Nr, Anzahl und IDs
unterscheiden: Anzahl wird addiert, die IDs werden (ohne Dubletten, in 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} " print(f"[export_sivas] Zusammengefasste CSV geschrieben: {output_csv_zus} "
f"({len(items_zus)} Zeilen)") f"({len(items_zus)} Zeilen)")
# Je Dispogruppe eine eigene zusammengefasste Datei, z.B.
# "<stamm>_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 + # Zweite, lesbare Kopie fuer die manuelle Pruefung (Merkmalnummer +
# Bezeichnung aus cfg/Merkmalsstamm_in_Sivas.xlsx) - wird von Sivas # Bezeichnung aus cfg/Merkmalsstamm_in_Sivas.xlsx) - wird von Sivas
# selbst NICHT eingelesen, nur output_csv ist der eigentliche Import. # selbst NICHT eingelesen, nur output_csv ist der eigentliche Import.