refactor: Kettenfoerderer als Seitenansicht mit Beschriftung und Hoehenmass, Draufsicht als eigener Hilfsblock KF2D_n

- Hauptblock KF_n: flache, ungedrehte Seitenansicht mit Beschriftung und Hoehenmass; nur er wird exportiert
- Draufsicht KF_2D als getrennter Hilfsblock KF2D_n (projizierte Laenge, frei verschiebbar, per KF_EDIT regenerierbar), Verknuepfung ueber XDATA-Schluessel
- L_KF_mm = waagerechte Laenge, Sivas-Zeile ohne Laenge, Export nur KF_<Ziffern>
- ensure-block-loaded: Block ohne ILS-Datei (KF_2D) nicht mehr als fehlend melden
- Layer kettenfoerderer_beschriftung, Dispatcher-Zweig KF2D_*, Sprachdateien und Unit-Tests angepasst

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-30 15:42:58 +01:00
parent d9043ebca5
commit 503b02a005
10 changed files with 469 additions and 337 deletions
+12 -4
View File
@@ -313,8 +313,8 @@ def kettenfoerderer_signature(block):
Merkmale wuerden schon hier dieselbe Gruppe ergeben. Sonst wuerde dort
"anzahl" addiert, waehrend 353 unveraendert stehen bliebe.
Die Laenge des Zwischenstuecks (L_KF_mm) ist eine FOLGE der Einbauhoehe und
steht darum nicht eigens im Schluessel.
Die waagerechte Laenge (L_KF_mm) ist eine FOLGE der Einbauhoehe (und des
Winkels) und steht darum nicht eigens im Schluessel.
"""
attribs = block.get("attribs", {})
return (
@@ -702,7 +702,11 @@ def process_blocks(blocks, anzahl_weichen_ils=0):
# 359/360/391) gingen dabei verloren. Anders als das Geruest werden
# BAUGLEICHE Foerderer zu einer Zeile zusammengefasst, weil Merkmal
# 353 genau diese Stueckzahl verlangt.
if matches_any(bname, BLOCKPATTERNS.get("pattern_kettenfoerderer", [])):
# Nur echte Foerderer "KF_<n>": das Muster KF_* erfasst sonst auch
# lose Bausteine (KF_UM_26, KF_2D). Der Hilfsblock KF2D_<n> passt nicht
# aufs Muster und wird nie exportiert.
if (matches_any(bname, BLOCKPATTERNS.get("pattern_kettenfoerderer", []))
and re.fullmatch(r"KF_\d+", bname, re.IGNORECASE)):
sig = kettenfoerderer_signature(block)
if sig not in kettenfoerderer_groups:
kettenfoerderer_groups[sig] = {"block": block, "ids": [], "anzahl": 0}
@@ -996,7 +1000,11 @@ def process_blocks(blocks, anzahl_weichen_ils=0):
"bezeichnung": attribs.get("Bezeichnung", ""),
"dispgruppe": 20,
"anzahl": gruppe["anzahl"],
"laenge_mm": attribs.get("L_KF_mm", ""),
# Bewusst LEER: Sivas berechnet ZL, EL und die Kettenlaenge selbst, aus
# dem Kettenfoerderer wird nur die Hoehe (360) uebernommen. L_KF_mm
# (waagerechte Laenge des Foerderers) steht als Attribut am Block,
# geht aber nicht in die Sivas-Zeile.
"laenge_mm": "",
"ids": gruppe["ids"],
"details": build_kettenfoerderer_details(block, gruppe["anzahl"]),
})