[CHANGE] eine zusätzliche csv für den Sivas export wird erstellt, die alle identischen Zeilen summiert und in einer Zeile mit neuer Anzahl schreibt; [ADD] Neue Gerüstkomponenten für die Baugruppenerstellung on the fly durch hinzugefügt; [CHANGE] Testskripte angepasst

This commit is contained in:
Simon Hensch
2026-09-29 17:08:14 +02:00
parent 4e39c64ec1
commit 7e98b85e5e
14 changed files with 101 additions and 11 deletions
+58
View File
@@ -48,6 +48,11 @@ Argumente:
Pruefung, wird von Sivas selbst nicht eingelesen.
Schalter im Dialog CSV_EXPORT_KONFIG
("Sivas Export mit Bezeichner"), Standard aus.
Zusaetzlich wird IMMER "<output>_zusammengefasst.csv" geschrieben: gleiches
Format, aber Zeilen, die sich nur in Nr/Anzahl/IDs unterscheiden, sind zu
einer Zeile zusammengefasst (Anzahl addiert, IDs vereinigt, Nr neu) - siehe
items_zusammenfassen. output.csv selbst bleibt unveraendert.
"""
import json
@@ -921,6 +926,48 @@ def lesbarer_dateiname(output_csv):
return f"{stamm}_mit_bezeichnung{endung}"
def zusammengefasster_dateiname(output_csv):
"""Leitet den Dateinamen der zusammengefassten Kopie aus output_csv ab,
z.B. "500651_sivas.csv" -> "500651_sivas_zusammengefasst.csv"."""
stamm, endung = os.path.splitext(output_csv)
return f"{stamm}_zusammengefasst{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
Reihenfolge des Auftretens) vereinigt, Nr wird neu durchgezaehlt.
Reihenfolge der Gruppen = erstes Auftreten.
Betrifft in der Praxis vor allem die Geruest-Zeilen (je Block und
Artikelnummer eine Zeile, siehe process_blocks) - die uebrigen Teilearten
sind dort bereits gruppiert, und ihre Zeilen unterscheiden sich meist in
Bezeichnung/details. Die Laenge gehoert zum Schluessel: Saeulen mit
unterschiedlicher Laenge bleiben getrennte Zeilen.
Die Eingabe bleibt unveraendert (die Hauptdatei wird aus denselben
items geschrieben)."""
gruppen = {}
for item in items:
key = (
item["teileart"], str(item["sivasnr"]), item["sivasnr_quoted"],
item["bezeichnung"], item["dispgruppe"], str(item["laenge_mm"]),
json.dumps(item["details"], ensure_ascii=False, sort_keys=True),
)
g = gruppen.get(key)
if g is None:
g = dict(item, anzahl=0, ids=[])
gruppen[key] = g
g["anzahl"] += safe_int(item["anzahl"], 0)
for i in item.get("ids", []):
if i and i not in g["ids"]:
g["ids"].append(i)
ergebnis = list(gruppen.values())
for nr, g in enumerate(ergebnis, 1):
g["nr"] = nr
return ergebnis
def main():
if len(sys.argv) < 4:
print("Aufruf: python export_sivas.py <export_raw.json> <data_dir> <output.csv> [--mit-bezeichnung]")
@@ -945,6 +992,17 @@ def main():
f.write(format_csv_line(item) + "\n")
print(f"[export_sivas] CSV geschrieben: {output_csv} ({len(items)} Zeilen)")
# Zusaetzliche Datei mit zusammengefassten identischen Zeilen (siehe
# items_zusammenfassen) - output_csv selbst bleibt unveraendert.
items_zus = items_zusammenfassen(items)
output_csv_zus = zusammengefasster_dateiname(output_csv)
with open(output_csv_zus, "w", encoding="utf-8") as f:
f.write(header + "\n")
for item in items_zus:
f.write(format_csv_line(item) + "\n")
print(f"[export_sivas] Zusammengefasste CSV geschrieben: {output_csv_zus} "
f"({len(items_zus)} 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.