Commit Graph

727 Commits

Author SHA1 Message Date
y.wang e1e5fbf0c1 feat: Modus 3 mit optionalem AS/ES, ES-Frage vor dem Bau; Helfer rollenbasiert benannt
WARUM MODUS 3 BLEIBT
Modus 2 und 3 arbeiten beide auf einem gezeichneten Pfad (LINE/ARC), aber sie
loesen verschiedene Aufgaben:
  Modus 2 = Randwertproblem - Start UND Ziel (je X/Y/Z) sind bekannt, die
            Zwischenhoehen werden gerechnet, die Zielhoehe wird exakt
            getroffen.
  Modus 3 = Anfangswertproblem - die Kette wird mit vorgegebenen Winkeln
            vorwaerts durchgebaut, die Endhoehe ist das ERGEBNIS.
Modus 3 kann damit etwas, was Modus 2 grundsaetzlich nicht kann: ohne
vorgegebene Zielhoehe arbeiten ("folge dieser Linie mit 3 Grad und lass uns
sehen, wo wir landen") - und er hat keinen Solver, der scheitern kann.
Dazu kommt ein harter Bestandsgrund: Modus 3 schreibt ein eigenes Journal
(Marker "linienzug3") und ist per Doppelklick editierbar. Faellt der Code
weg, verlieren alle bereits damit gebauten Ketten ihren Editier-Pfad.
Der Stempel "Legacy / wird umgebaut" war ueberholt und ist raus.

MODUS 3 - DREI AENDERUNGEN (Nutzer-Vorgabe 2026-10-22)
1. "AS bauen?" und 2. "ES bauen?" sind jetzt abfragbar (vorher wurden beide
   immer gebaut), zusammen mit Winkel und Seite in je EINEM Dialog - dasselbe
   Muster, das Modus 2 schon nutzt (vflw-gruppe-as-impl), kein neuer Code.
   Ohne AS beginnt die Kette direkt am Startpunkt (flacher Rahmen statt
   Block); die Fussabdruck-Trimmung der ersten Geraden rechnet dann von
   selbst 0, weil Rahmen und Startpunkt zusammenfallen.
3. Die ES-Frage steht jetzt VOR dem Bau. Das behebt einen echten Fehler: die
   letzte Gerade wird um "Separator + ein-dx" gekuerzt, ein-dx wurde aber
   gelesen, BEVOR es gesetzt war - beim ersten Lauf griff der Schaetzwert
   *vfk-as-es-fallback-dx*, bei jedem weiteren stand dort der Wert der
   VORHERIGEN Kette (falscher Winkel, falsche Seite). Jetzt traegt die
   Trimmung den echten Fussabdruck der gewaehlten ES-Variante; ohne ES
   entfaellt sie ganz.

ABWAERTSKOMPATIBILITAET
Das Verschieben der ES-Frage aendert die Journal-Reihenfolge. Bestehende
"linienzug3"-Ketten bleiben per Doppelklick nachbaubar: alt-journal erkennt
sie am WERT des ersten Antwort-Eintrags ("30"/"90" = alt, "1"/"2" = neu, die
Mengen sind disjunkt) und spielt sie in der alten Reihenfolge ab. Dafuer der
neue Helfer vfl-replay-peek-wert neben vfl-replay-peek-art.

DIALOG vflw_as
Die Seitenauswahl wurde bei 30 Grad ausgegraut und NICHT in die Pending-Queue
gelegt - eine reine Modus-1-Regel (dort ersetzte die Zufuehrungsachse die
Seitenfrage). Modus 1 hat seit 2026-10-21 seinen eigenen Dialog; uebrig
blieben ES-Element sowie Modus 2/3, wo die Seite IMMER gebraucht wird - dort
ging bei 30 Grad ein zweites Fenster nur fuer die Seite auf. Entfernt.

NAMENSSCHEMA (faellt in denselben Commit, weil dieselbe Datei)
Die Helfer-Praefixe vfl2-/vfl3- stammten aus einer Planungsphase vor der
endgueltigen Menue-Zuordnung und waren dazu VERTAUSCHT: alle vfl3-* gehoeren
zu Modus 2, die vfl2-* zu Modus 3 - und drei davon zu BEIDEN. Eine
Modus-Nummer war fuer diese drei also gar nicht richtig vergebbar. Sie heissen
jetzt nach ihrer Rolle: vfl-zsolve-* (rechnet die Hoehen durch, nur Modus 2)
und vfl-pfad-* (arbeitet am gezeichneten Pfad, Modus 2 UND 3). 18 Funktionen,
jede Aufrufstelle maschinell gegen die Definitionen geprueft. Die falsche
Block-Ueberschrift "MODUS 3: Pfad + Ziel-Hoehe" (gemeint war Modus 2) ist
korrigiert, beide Gruppen haben jetzt einen erklaerenden Kopf.
vfl-zsolve-bruecke (frueher vfl3-solve-bruecke) wird von niemandem aufgerufen
- bewusst stehen gelassen und markiert, Loeschen gehoert in ein
Tote-Code-Review.

MENUE
Die Modi heissen jetzt nach ihrem Unterschied statt nach der Bedienung:
"aus 3D Linie mit Zielhoehe" / "aus 3D Linie ohne Zielhoehe" (vorher
"3D Objekte stueckweise (in Arbeit)").

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-22 12:01:16 +02:00
y.wang 1cc163dc11 feat: AS-Zufuehrungsachse fuer beide Winkel + GF-Option "Parallel zum Kreisel"
Die AS-Praeambel in Modus 1 fragt jetzt Winkel, Seite UND eine optionale
Zufuehrungsachse (2. Punkt) - im Assistenten alles in einem Fenster
(vflw_as_achse). Beide Angaben zusammen legen das AS vollstaendig fest: der
2. Punkt gibt die KS_EIN-Achse (Zufuehrung/Fahrtrichtung), links/rechts die
AS-Variante und damit die KS_AUS-Richtung der Kette. Bisher galt die Achse
nur beim 30-Grad-Element und ERSETZTE dort die Seitenfrage.

Darauf setzt die neue 5. Option der gf-laenge-modus-Frage auf, intern
"parallel" (vfl-gf-parallel-kreisel): AS -> GF-Stueck -> GF-Bogen aus EINEM
Abstandswert, gemessen senkrecht zur Zufuehrungsachse von AS-KS_EIN bis
Bogen-KS_AUS. Kein Separator dazwischen, damit der Abstand exakt getroffen
wird; die Kettenende-Frage stellt der Zweig selbst NACH dem Bau. Waehlbar
nur am Kettenanfang mit AS UND Achse.

Der Bogen ist nicht verdrahtet: gewaehlt wird der, der den gemessenen
Grundriss-Schwenk des AS-Blocks aufhebt (vf-element-plan-turn) - mit den
vorhandenen Bausteinen AS 30 -> 30-Grad-Bogen, AS 90 -> 90-Grad-Bogen,
immer zur Gegenseite. Querversatz von AS und Bogen wird gemessen statt
gerechnet; die Bogen-Probe laeuft dabei auf dem IDEALISIERTEN 3-Grad-Rahmen,
auf dem der echte Bogen spaeter sitzt (auf dem AS-Rahmen gemessen lag der
Abstand im BricsCAD-Test um 0.5 mm daneben).

Journal: [STR winkel][STR seite][PT p2 | NIL]. Welche Fragen gestellt wurden,
wird nicht journalisiert, sondern beim Replay an der Eintragsart erkannt -
alte Ketten bleiben ohne Sonderbehandlung editierbar. Die Journal-Werkzeuge
(vf_linienzug_grammatik.py, vf_spec_export.py, vf_journal_export.py,
vf_spec.lsp, test_hm_recformat.lsp) kennen das optionale Achsen-Token.

Tests: 11 neue Unit-Tests fuer die reinen Kerne vfl-par-bogen-waehlen und
vfl-par-gf-laenge (tu-tests-vfl-parallel), TEST_UNIT 701/701 gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-22 11:04:16 +02:00
y.wang cccd362bba feat: VF-Hoehe je Segment (Sivas 4433-4437) + AS-Zufuehrungsachse bei 30 Grad
Zwei Themen, die dieselben Dateien beruehren und daher zusammen gehen.

1) VF_HOEHE_m - Hoehe je VF-Segment, Sivas-Merkmale 4433-4437

   Sivas erwartet je Streckengruppe bis zu fuenf Variofoerderer-Hoehen.
   Neues Block-Attribut VF_HOEHE_m: kommagetrennte Liste in Metern mit 3
   Nachkommastellen, Eintrag fuer Eintrag parallel zu L_VF_m/VF_WINKEL.

   Je Eintrag der Mittelwert aus KS_EIN und KS_AUS DES GERADEN VF-Abschnitts.
   Zwischen Umlenk- und Motorstation koennen mehrere Abschnitte liegen
   (auf/ab/horizontal), jeder bekommt einen eigenen Wert.

   SONDERFALL Standard/Etage: dort gibt es nur einen Motor und nur einen
   geraden Abschnitt - gemessen wird die GANZE Kette (AS-KS_EIN bis
   ES-KS_AUS, vf-vfhoehe-kette). Das ersetzt den Segmentwert; der Linienzug
   laeuft nicht durch vf-dialog-berechnen-einfuegen und behaelt seine Liste.

   WICHTIG - vollstaendige Erfassung: die VF-Segmente entstehen NICHT alle in
   vfs-vf-koerper. Horizontale Zwischenstuecke, das "schon flach"-Segment und
   die Modus-2/3-Fuellstuecke bauen direkt mit insert-inclined-scaled-block,
   die Kette-Merge-Rekonstruktion liest sie aus bestehenden Bloecken. Ein
   erster Fix nur in vfs-vf-koerper lieferte darum zu wenige Werte (realer
   Befund: L_VF_m hatte drei Eintraege, VF_HOEHE_m einen). Jetzt sind alle 14
   Stellen erfasst, die vfl-acc-vf-seg aufrufen - dafuer das Paar
   vf-vfhoehe-merke/-schliesse, das ohne lokale Variable auskommt.

   REGEL (im Code dokumentiert): Jede Stelle, die vfl-acc-vf-seg aufruft,
   MUSS auch eine Hoehe erfassen - sonst verschiebt sich die Liste gegen
   L_VF_m und im Export landet eine Hoehe beim falschen Foerderer.

   Formatierung ueber vf-meter-3: (rtos x 2 3) allein kuerzt je nach DIMZIN
   nachfolgende Nullen ("2.5" statt "2.500", "-1" statt "-1.000") - im
   Testlauf real aufgetreten.

   Attribut-Schema *strecke-attr-gruppe* (ssg_core.lsp) ergaenzt, sonst
   verschluckt ssg-attrib-set-on den neuen Tag stillschweigend.
   export_sivas.py verteilt die Liste auf VF_HOEHE_MERKMALE (4433-4437);
   ueberzaehlige Abschnitte werden weggelassen statt zusammengefasst, fehlende
   lassen das Merkmal ganz weg.

2) AS-Element 30 Grad: Zufuehrungsachse statt Seitenwahl

   Der Startpunkt einer Kette mit AS-Element ist geometrisch keine Position,
   sondern eine ACHSE: das AS sitzt an einer durchlaufenden Strecke und
   schleust daraus aus, seine KS_EIN-Achse muss darauf liegen. Bisher richtete
   vfl-insert-as-element das KS_AUS entlang der Kettenrichtung aus, wodurch
   das KS_EIN um den Blockschwenk verdreht stand - beim 90-Grad-Element kaum
   sichtbar, beim 30-Grad-Element deutlich.

   Beim 30-Grad-Element wird die Seitenauswahl im AS-Gruppendialog jetzt
   ausgegraut; stattdessen gibt ein zweiter Punkt die Zufuehrungsrichtung
   (der Startpunkt bleibt der Sitz des Elements). Die Seite folgt aus der Lage
   des naechsten Kettenpunkts zur Achse (vfl-seite-aus-lage). 90 Grad bleibt
   unveraendert bei der Seitenfrage.

   Der Dialog legt bei 30 Grad bewusst KEINE Seite mehr in die Pending-Queue -
   sonst zog die nachfolgende Punktfrage sie als vermeintlichen Punkt heraus
   und erschien gar nicht (realer Fehler beim ersten Test).

   Abwaertskompatibilitaet: aeltere 30-Grad-Ketten wurden noch MIT Seitenfrage
   gebaut. vfl-replay-peek-art sieht beim Replay nach, was tatsaechlich
   ansteht ("PT" = Achse, "STR" = Seite) - die Modus-Wahl selbst wird nicht
   journalisiert, weil sie daraus eindeutig rekonstruierbar ist.

Unit-Suite 687/687 gruen. VF-Hoehe in BricsCAD bestaetigt. Die AS-Achsenfrage
ist dort noch NICHT gelaufen, seit die Seitenauswahl ausgegraut wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-21 12:55:02 +02:00
y.wang 4ce2a02205 feat: Sivas-Merkmale 4427-4432 (AS-/ES-Element) im Export befuellen
Die Streckenbloecke GF_N und VF_N tragen Winkel und Seite ihres AS-/ES-
Elements bereits als Attribute des gemeinsamen Schemas (WINKEL_AS/SEITE_AS/
WINKEL_ES/SEITE_ES, *strecke-attr-front* in ssg_core.lsp). Diese Information
landet jetzt auch im details-JSON des Sivas-Exports.

Zuordnung (Sivas-Hierarchie: 4431/4432 schalten Winkel und Seite frei):
  4431/4432  AS-/ES-Element vorhanden   Ja/Nein
  4427/4429  Winkel                     "30 °"/"90 °"
  4428/4430  Seite                      links/rechts

Die Zuordnung steht vollstaendig in cfg/sivas.cfg - mit denselben sechs
Zeilen in [gefaellestrecke] und [variofoerderer], jeweils direkt hinter 2950,
was auch die Reihenfolge im details-JSON bestimmt.

Ob ein Element vorhanden ist, entscheidet ausschliesslich WINKEL_AS/WINKEL_ES:
das Schema laesst den Winkel leer, wenn keines gewaehlt wurde, waehrend
SEITE_AS/SEITE_ES mit "rechts" immer einen Vorgabewert tragen. Ohne Element
bleiben Winkel UND Seite leer, damit in Sivas keine Seite unter einem
"Nein"-Knoten haengt.

Weitere Punkte:
- sivas_mapping: neuer Dekorator @braucht_attribs. Ein so markierter
  Transform wird als fn(wert, attribs) statt fn(wert) aufgerufen und sieht
  damit die uebrigen Attribute des Blocks - noetig, weil die Seite vom
  Winkel abhaengt. Ohne diese Klammer muessten bedingte Merkmale wieder als
  Python-Code aus der Config herauswandern.
- Die Winkel-Schreibweise der Sivas-Auswahlliste ("30 °" mit Leerzeichen vor
  dem Gradzeichen) steht als Tabelle [as_es_winkel_anzeige] in sivas.cfg,
  Bauart wie [geruest_typ_anzeige] - weicht Sivas davon ab, ist das die
  einzige Stelle zum Nachziehen.
- gefaellestrecke_signature beruecksichtigt AS/ES: zwei sonst baugleiche
  Gefaellestrecken mit AS links bzw. rechts bleiben getrennte Zeilen, sonst
  zeigte die gemeinsame Zeile nur die Seite des ersten Blocks.
- Altbestand ohne diese Attribute meldet "Nein" statt abzubrechen.
- Merkmalsstamm_in_Sivas.xlsx auf den aktuellen Sivas-Stand gebracht
  (enthaelt neben 4427-4432 auch 4002, 7010-7013 und Klartext-Korrekturen;
  4339/4383 heissen jetzt eindeutig "... Gefaellestrecke"/"... Variofoerderer").
- 12 neue Tests in tests/test_export_sivas_as_es.py, ohne BricsCAD lauffaehig.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-21 12:55:01 +02:00
s.hensch 4fdeaf831f Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-10-21 10:24:53 +02:00
s.hensch e528913fbf [ADD] Verbinder für Omniflo Fahrstrecke hinzugefügt 2026-10-21 10:24:49 +02:00
m.stangl 94238b26f0 testrunner gefixt 2026-10-19 15:46:07 +02:00
s.hensch 6b8f0f9ec3 [ADD] Kreiseldrehrichtungsanzeige hinzugefügt; [CHANGE] Insert des Kreisel mit Ausrichtung wird jetzt über die vom Benutzer gezeichnete Eingabelinie erreichnet; [FIX] Fehlende config Datei für die Positionierung der Stückliste hinzugefügt 2026-10-16 11:41:51 +02:00
s.ayadi b6aa3d604c [FIX] test_system.json: Separator vor Weiche Kreisel 7 -> 8, Separator-Hoehe
- Neuer Separator auf Kreisel_TestSystem_07 Bahn L vor der Weiche zu
  Kreisel_TestSystem_08 (aus results/export.csv, Separator 0022). Ohne ihn
  steuert niemand den Uebergang 7 -> 8, im TRO-Fluss von sps_skel war der
  Ausgang vom Eingang aus nicht erreichbar.
- Separator auf Kreisel_TestSystem_08 Bahn R lag auf z=0 statt 2000
  (Export: Hoehe 0).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:39:43 +02:00
s.hensch e5ba096a16 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-10-15 10:35:16 +02:00
s.hensch 643164bc53 [CHANGE] Stücklistenpositionierung in der Zeichnung mit Markierung und Tabelle 2026-10-15 10:33:19 +02:00
s.ayadi fea601450c [FIX] Export: ZUORDNUNG-Attribut vor BBox-Suche bei Separator/Scanner
Separatoren an einer Kreisel-Kreisel-Weiche ragen mit Toleranz in die Box
beider Kreisel; compute_kreisel_umlauf/compute_sensor_zuordnung nahmen den
ersten Treffer (test_system: Separator 0018 an Kreisel 0006 statt 0005,
0015 an 0003 statt 0002). Das ZUORDNUNG-Attribut aus count_sep_scan hat
jetzt Vorrang, sofern es einen vorhandenen Carrier nennt; die Haelfte L/R
wird weiter per BBox bestimmt, ohne Attribut bleibt die BBox-Suche.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:22:23 +02:00
s.ayadi fb72792bac [FIX] test_system.json: Kreisel beruehren sich exakt
- x-Werte der Kreisel 2-9 auf exakte Beruehrung korrigiert (Kreisel 1 fest,
  Abweichung in der Zeichnung bis 5.5 mm); alle 8 Weichenpaare beruehren sich
- Separatoren und BTMT-Beladung mit ihrem Kreisel verschoben
- Hinweis im Testkopf: erneuter Lauf von dxf_anlage_export.py macht die
  Korrektur rueckgaengig

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:16:51 +02:00
s.ayadi 166c94f715 [FIX] Kreisel-Weichen: Ende-an-Ende-Raeder und Zeichentoleranz
- Rad/Rad an beiden Flanken gilt nur bei gleich ausgerichteten Raedern als
  "Seite an Seite"; in Gegenrichtung (Kreisel seitlich versetzt Ende an Ende)
  ist es eine Weiche
- toleranz_beruehrung von 1 auf 10 mm (Zeichenungenauigkeiten, Spalt und
  Ueberlappung)
- Unit-Tests fuer Ende-an-Ende, Seite-an-Seite und den Fall aus test.dxf (E3/C7)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:08:50 +02:00
s.ayadi cd75bb0f31 set height of all Kreisels to 2m 2026-10-14 15:09:10 +02:00
s.ayadi cf31333238 Merge remote-tracking branch 'origin/master'
Konflikt in menu/SSG_LIB.cui (generiert): Stand von origin/master
uebernommen, nur der Menuepunkt "Testanlage test_system" (MM_00210)
ergaenzt. SSG_LIB.mnu ohne Konflikt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:54:55 +02:00
s.ayadi 1a34a12ab4 [ADD] Testanlage test_system als Nachbau-Vorlage fuer sps_skel
tests/testdata/test_system.json aus sps_skel/data/test_system.dxf
(dxf_anlage_export.py --projekt TestSystem): 9 Kreisel, 10 Separatoren,
BTMT Beladung, SC Entladung. Treiber tests/test_test_system.lsp
(TEST_TEST_SYSTEM, Menue Tests -> Testanlage test_system) nutzt
dematic_arvato:bau-datei, in alltests.json aktiv (save dxf).

[FIX] dxf_anlage_export.py: doppelte Kreisel-IDs (Kreisel einzeln gebaut,
NUMMER beginnt mehrmals bei 1) bekommen die naechste freie Nummer, mit
Hinweis + Test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:51:52 +02:00
y.wang 821b81135d fix: VF-Linienzug - ES-Fussabdruck laengs korrekt reservieren + Endpunkt per Ziellinie
Drei zusammenhaengende Korrekturen am GF-Zweig mit ES-Element (Modus 1).

1) ES-Fussabdruck wurde massiv unterschaetzt (333.65 mm zu lang)

   Reserviert wurde (abs ein-dx) - die Block-X-Komponente aus
   vf-element-masse. Ein Element wird aber so gedreht eingebaut, dass sein
   KS_EIN auf der Fahrtrichtung liegt; beim drehenden ES_Element_30
   (ein-ang=120 Grad) landet dadurch ein Teil der Block-Y-Komponente auf der
   Fahrtachse. Real verbraucht es laengs 576.2 mm statt der reservierten
   242.6 mm - die Kette ragte um die Differenz ueber den gepickten Endpunkt
   hinaus (Nutzer-Befund 2026-10-09).

   Warum das lange unentdeckt blieb: beim ES_Element_90 ist ein-ang=0, dort
   ist (abs ein-dx) ZUFAELLIG richtig. Der frueher bestaetigende 90-Grad-Test
   konnte den Fehler strukturell nicht finden (Nutzer-Hinweis).

   Neu in vf_core.lsp: vf-element-laengs / vf-element-quer (hz-unabhaengige
   Projektion auf bzw. quer zur Fahrtrichtung), vf-set-es-masse setzt
   zusaetzlich ein-laengs / ein-quer. In vf_linienzug.lsp liest vfl-es-laengs
   den Wert mit Rueckfallkette; ein bewusst genulltes ein-dx gewinnt dabei,
   damit die rund zwei Dutzend Null-/Restore-Stellen keinen Doppelabzug
   bekommen.

   In BricsCAD bestaetigt: Separator+ES verbrauchen 875.83 mm gegen 875.79 mm
   Soll (0.04 mm), Hoehe 151.23 gegen 151.20 mm.

2) Endpunkt per Ziellinie statt per Klick

   Steht die Fahrtrichtung durch den Vorgaenger fest, ist die Laenge nicht
   mehr frei: die (um den ES-Querversatz seitlich versetzte) Bahn des
   ES-KS_AUS trifft eine Ziellinie in genau einem Punkt. Ein Klick kann den
   nur annaehern. Neue Frage mit zwei gleichwertigen Optionen (Radio-Buttons
   im Wizard-Modus): Ziellinie durch ZWEI PUNKTE zeichnen - Schnittpunkt wird
   gerechnet - oder wie bisher einen Punkt waehlen.

   REIN PLANAR: die Hoehe kommt weiterhin aus dem Gefaellewinkel, die
   Ziellinie bestimmt nur X/Y (Nutzer-Praezisierung).

   Beide Wege schreiben denselben einzelnen "DL"-Journaleintrag - Replay,
   Doppelklick-Edit und 2D/3D-Konvertierung muessen von Ziellinien nichts
   wissen. Die Bindung an die Linie besteht nur beim Bauen: wird die Linie
   spaeter verschoben, folgt die Kette NICHT.

   Abwaertskompatibilitaet: die neue Frage erzeugt einen zusaetzlichen
   Journaleintrag, den aeltere Ketten nicht haben. vfl-replay-peek-art sieht
   beim Replay nach, was tatsaechlich ansteht; steht dort ein "DL", ist es
   ein Altbestand und die Frage entfaellt - sonst haette sie den Laengenwert
   als Antwort verschluckt (Queue-Desync).

3) Bedienung: Achsenzwang und ruhige Ansicht

   vfl-getpoint-achse zwingt den Cursor beim Picken auf die Anschlussachse
   (SNAPANG + ORTHOMODE, kein BKS-Wechsel - getpoint liefert daher
   unveraenderte Koordinaten). Nur die horizontale Richtung wird erzwungen,
   die Hoehe bleibt frei.

   vfl-view-refresh zoomte vor JEDER Laengeneingabe hart auf _Extents - die
   Ansicht sprang bei grossen Anlagen nach jedem Klick weg. Jetzt wird nur
   noch eingegriffen, wenn der Baupunkt aus dem sichtbaren Ausschnitt laeuft,
   und dann per _ZOOM _Center unter Beibehaltung der Zoomstufe.

13 neue Unit-Tests (etage-laengs/-quer,
vfl-es-laengs, vfl-kreuz2, vfl-laenge-bis-ziellinie inkl. Realfall aus dem
BricsCAD-Log), Suite 533/533 gruen. lang-Paritaet geprueft.

Offen und bewusst nicht angefasst: vfl-winkel-machbar-p nutzt aus-dx/ein-dx
ebenfalls als Laengsmass und hat damit denselben Fehler (AS_30: 276 mm,
ES_30: 334 mm). Der saubere Fix fuellt ein-dx/aus-dx an der Quelle mit dem
Laengswert - das beruehrt rund 87 Fundstellen samt ihrer Null-/Restore-
Konvention und gehoert separat getestet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-14 09:09:40 +02:00
s.hensch 8039251bb8 [FIX] Export: Schnittpunkte zwischen Kreiseln werden erkannt und Weichen entsprechend gezählt und als Teil mit Merkmalen im Export befüllt - nur Kreisel mit gleicher Höhe können einen Schnittpunkt für Weiche bilden - Funktion der Weichenzählung manuell aufrufbar; [FIX] Eckrad nun korrekt angelegt und exportiert 2026-10-14 07:42:08 +02:00
s.hensch 6044c35957 feat: Eckrad-Dialog, Kreiselname, Hoehen-Neuberechnung beim Export
- Eckrad: eigener DCL-Dialog (eckrad_edit.dcl) beim Einfuegen und per
  Doppelklick (EckradEdit); Sivas-Merkmale am Kreisel ausgerichtet
  (2950, 3381, 3992 Ja/Nein); bei Sep./Scanner-Zaehlung ausgenommen
- Kreisel: eigener Name bleibt in Bezeichnung + Beschriftung erhalten
- Sivas: Kreisel/Eckrad unterschiedlicher Hoehe nicht mehr zusammengefasst
- Export: Hoehen-Attribute in Z verschobener Kreisel/Eckrad/VF/GF neu
  berechnet
- GF-Edit: Einfuegehoehe aus aktueller Z-Koordinate
2026-10-13 14:24:01 +02:00
s.hensch ea0e46a441 feat: Omniflo-Fahrstrecke (OMNI_FAHRSTRECKE) + Geruest-Dialoge ueberarbeitet
Fahrstrecke:
- Neuer Befehl OMNI_FAHRSTRECKE (+ _BESCHRIFTEN) im Omniflo-Menue,
  Daten aus data/json/omniflo_fahrstrecke.json, Vorlage dcl/fahrstrecke.dcl
- Nutzt die Linien-Logik des Geruest-Traegers (geruest-linien-starten,
  Dialog/Einfuegen/Beschriftung je Baugruppe parametriert)
- Muffen-Dummy wie beim Traeger, farbig nur wo in der JSON gesetzt
- Stueckliste: eigene Klasse "Omniflo Fahrstrecke" (GR_Fahrstrecke_*)

Geruest-Dialoge:
- DCL als statische Vorlagen mit //@NAME@-Platzhaltern
  (ssg-dcl-vorlage-fuellen in ssg_core), dcl/geruest.dcl neu
- Ein Dialog je Bereich (keine Bereichsumschaltung mehr)
- Varianten als Radiobuttons mit Artikelnummern im Label,
  "disabled": true graut Varianten aus
- Eine Befestigungsspalte (Gesamtanzahl) + Zeile "Sonstiges",
  Art.-Nr. unter jedem Anbauteil
- Winkel Platte (0/90): Anbauteile gedreht eingefuegt
- Kennzeichnung geaenderter Konfiguration, Ueberspeichern per Enter
- Traeger: Querstreben nur bei "mit_querstrebe": true

Konfigurationen im alten Format (oben/unten) werden beim Laden
uebernommen. Unit-Tests ergaenzt (599 gruen).
2026-10-13 11:02:23 +02:00
y.wang 3116e639eb fix: Etage-Solver bilanziert Ein-/Auslauf auf der Hauptachse statt im Blocksystem
Die gebaute Etage-Kette endete 987.63 mm zu weit (X) und 3.46 mm zu hoch (Z).
Der Fehlbetrag lag vollstaendig im Ein-/Auslauf: der Solver reservierte dort
1177.87 mm, real verbraucht die Kette 2165.09 mm.

Zwei Ursachen:

(a) vf-element-masse liefert KS_EIN->KS_AUS im BLOCK-Koordinatensystem. AS
    und ES werden aber um (hz - ein-ang) gedreht eingebaut - beim
    AS_Element_30 ist ein-ang = 90 Grad, dadurch landet die Block-Y-
    Komponente auf der Hauptachse. Bilanziert wurde die Block-X-Komponente:
    AS 209.7 statt real 486.10, ES -242.6 statt real 525.29.

(b) Die Auslauf-Staustrecke wurde fix mit 400 mm budgetiert, ist seit dem
    Umbau "Auslauf RUECKWAERTS vom ES gerechnet" aber variabel (im Testfall
    334 mm). Daraus die 3.46 mm Resthoehe.

Fix: neue Funktion etage-rand-budget (seite) rechnet Einlauf (Schritte 1-4)
und Auslauf (12-15) exakt so, wie etage-foerderanlage-einfuegen sie baut,
inklusive analytisch vorab bestimmtem L-exit. Kern sind die reinen,
hz-unabhaengigen Projektionen etage-laengs/etage-quer. Die alte Naeherung
bleibt als Fallback, falls ein Block fehlt.

Damit faellt auch die bisherige Annahme, Laengentreue und seitliche
Fluchtung des ES-KS_AUS seien nicht gleichzeitig loesbar: die Bauschritte
5-11 laufen auf der Hauptachse und tragen nichts zur Quer-Bilanz bei,
L-exit ist deshalb von L_GF/L_VF unabhaengig und vor dem Solve bestimmbar.

Weiter: Konstante *vfk-etage-stau-ein* (400 mm) ersetzt die nackte Zahl an
beiden Stellen; zwei neue lang-Keys (de+en, Paritaet 1095/1095); neuer
Regressionsblock tu-tests-etage in tests/test_unit.lsp mit dem AS/ES-Fall
(Suite 520/520 gruen).

In BricsCAD verifiziert: Soll-Endpunkt (11804.31, 3039.64, 4256.5) exakt
getroffen, Abweichung 0.00 mm in allen drei Achsen.

Offen: bei korrekter Bilanz bleiben im Testfall bei 33 Grad nur 16.13 mm
fuer beide GF-Strecken. Eine Mindest-GF-Laenge als Gueltigkeitskriterium
der Winkelwahl ist noch nicht eingebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-09 18:02:25 +02:00
m.stangl b7b1df25b9 zwei weitere Fragen dazu 2026-10-09 17:33:40 +02:00
m.stangl 8e518a558d [FIX] Stueckliste: fehlende lang-Keys wiederhergestellt + Spaltenlinien ergaenzt
Die sl-*-Keys (Tabellenkoepfe, Prompts, Elementklassen) fehlten komplett in
lang/de_DE.json und lang/en_GB.json: sie standen beim vorangegangenen
Merge-Konflikt-Fix noch unstaged im Working Tree (nicht committed) und wurden
dabei versehentlich durch die reparierte, aber auf dem alten HEAD basierende
Version ueberschrieben. ssg-text lieferte dadurch den rohen Key statt des
uebersetzten Textes zurueck ("sl-stkl-kopf-menge" statt "MENGE" usw.).

Zusaetzlich: ssg-sl-tabelle-zeichnen zeichnete nur den Aussenrahmen und
horizontale Zeilentrenner, keine vertikalen Spaltenlinien - ergaenzt an den
vier Spaltengrenzen (400/1000/1900/3000 relativ zum linken Rahmen), von der
Kopfzeilen-Oberkante bis zur letzten Zeilenlinie.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 16:53:23 +02:00
m.stangl 0915cc2936 [FIX] Stueckliste: Texte ueberschrieben sich bei abweichendem Textstil
ssg-sl-tabelle-zeichnen/ssg-sl-faehnchen riefen TEXT ueber command auf. Bei
einem aktiven Textstil mit fester/variabler Ausrichtung (Mitte/Fit/Aligned
statt Links) fragt TEXT dann einen zweiten Punkt zusaetzlich ab - jeder
nachfolgende command-Aufruf landete am falschen Prompt, wodurch Kopf- und
Datenzeilen der Stuecklistentabelle sich alle an derselben Stelle stapelten
statt an ihrer vorgesehenen Position (Header nicht mehr lesbar).

Neue Hilfsfunktion ssg-sl-text-machen erzeugt TEXT-Entities per entmake statt
ueber den interaktiven command-Pfad - unabhaengig von Textstil/Ausrichtung
und der command-Promptkette. Gleiche Fehlerklasse wie der _.-INSERT-Fix bei
DIN_FORMATE (vorheriger Commit).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 16:48:39 +02:00
m.stangl 549798cd0b Test für Elementerkennung hinzugefügt 2026-10-09 16:31:12 +02:00
m.stangl 2584a0df1f Menü für Stückliste dazu. 2026-10-09 16:30:07 +02:00
m.stangl 009d3488b5 Für Omniflo Elemente eigene Funktion zur AUflösung des Pfades 2D3D oder 3D2D gebaut 2026-10-09 16:29:13 +02:00
m.stangl 9bb593ab6f Menü für Stücklistenerzeugung ergänzt 2026-10-09 16:27:44 +02:00
m.stangl 7c0c5ccfa6 Fallbackpfad für OMniflo Elemente von 2D/3D, da aktuell nur 2D definiert 2026-10-09 16:26:45 +02:00
m.stangl 7e64e8a501 config für AP60 elemente modifiziert 2026-10-09 16:24:31 +02:00
m.stangl f340c39779 AP60 elemente noch in die Exporterkennung mit aufgenommen 2026-10-09 16:23:53 +02:00
m.stangl bf2601a932 fix beim csv Export des Eckrades. Bild der gf für Doku war noch veraltet. Erste Fassung einer Lisp Funktion zur Erzeugung der Stückliste in der Szene 2026-10-09 16:22:57 +02:00
m.stangl 9b920b0825 Merge remote-tracking branch 'origin/master' 2026-10-09 16:18:54 +02:00
m.stangl 3d8831aad8 [ADD] DIN_FORMATE: Zeichnungsrahmen + Schriftkopf einfuegen
Ersatz fuer das alte ACADSST-Makro DINFORM.LSP/.DCL (SSG2 "DIN-FORMATE..."):
neues Werkzeuge-Menue "Din Formate" fuegt einen DIN-Rahmen (A0-A3, A4 quer/
hoch) und optional einen Schriftkopf (Kopf11, DE/EN/FR/IT) per Dialog ein.

Block-DWGs liegen flach in cfg/rahmen/ (kopiert aus
\infor-ln\SSG_Tools\ACADSST\KOEPFE - nur die von DINFORM.LSP tatsaechlich
referenzierten Dateien). Das Laden der Blockdefinitionen laeuft ueber
vla-InsertBlock+vla-Delete (COM-Weg wie ssg-ils-block-laden-dim), da ein
command-basiertes "_.-INSERT ... _X" in der interaktiven Befehlskette haengen
bleibt und nachfolgende getpoint-Aufrufe blockiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 16:17:42 +02:00
s.hensch ff456242e3 [MERGE] Gerüständerungen mergen 2026-10-09 14:42:15 +02:00
s.hensch d3ddcb9d59 [ADD] weitere Gerüstkomponenten hinzugefügt 2026-10-09 14:38:11 +02:00
m.stangl c353c34f2c [FIX] Eckrad-Export: Sivas-Merkmalnummern 3992/3993 statt Klartext-Keys
Eckrad fuehrte "Geruest fuer Einzelmodul"/"Geruestoption fuer
Einzelmodul" als beschreibende Klartext-Keys statt echter
Merkmalnummern - details_mit_bezeichnung() loest aber nur numerische
Keys gegen den Merkmalstamm auf, die Texte blieben im JSON unaufgeloest.
Merkmalsstamm_in_Sivas.xlsx enthaelt beide Nummern bereits (dieselben
wie bei Kreisel), jetzt in cfg/sivas.cfg uebernommen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 14:14:35 +02:00
m.stangl 1ace0a9a6d [FIX] GEFAELLESTRECKE_LINIENZUG: ES-Element hatte Rest-Hoehenversatz (~65mm) nach dem vorigen Fix
Der vorige Fix (80e5e62) nutzte insert-block-mixed-to-ks mit z-ref="KS_AUS" (sep-endpunkt als Ziel-Z) - das zwingt aber den BLOCKAUSGANG des ES-Elements auf diese Hoehe, nicht den Blockeingang, an dem die Kette tatsaechlich anschliesst. Der ganze Block wurde dadurch zusaetzlich um seine eigene KS_EIN<->KS_AUS-Innenhoehe nach oben verschoben.

Modus 1/2 (gefaellestrecke-einfuegen) macht das bereits richtig: dort haengt das EIN-Element ueber reines insert-block-ks-to-ks (keine erzwungene Ziel-Z) an den Ketten-Pfad, die Endhoehe ergibt sich danach von selbst aus KS_AUS. GEFAELLESTRECKE_LINIENZUG (Modus 3) auf dasselbe Muster umgestellt - sowohl im normalen Bau (gf-linienzug-modus) als auch im Doppelklick-Rebuild (gf-linienzug-rebuild).

Manuell in BricsCAD verifiziert: Hoehenversatz jetzt korrekt, kein Rest-Sprung mehr.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 13:34:49 +02:00
m.stangl 80e5e62160 [FIX] GEFAELLESTRECKE_LINIENZUG: ES-Element erhielt keinen Hoehenversatz bei flachem Endpunkt-Klick
Das ES-Element wurde ueber insert-block-mixed-to-ks so platziert, dass sein KS_EIN exakt auf (caddr endpunkt-ref) landet - die Z-Koordinate des zweiten Mausklicks (Kettenende waehlen). Geraden und Boegen davor waren korrekt geneigt (grade wird separat berechnet/bestaetigt und fliesst in gf-linienzug-einfuegen ein), aber die anschliessende ES-Platzierung zog die Hoehe wieder auf den Klick-Wert zurueck - bei einem Klick in einer 2D-Draufsicht ohne 3D-Objektfang liegt der meist auf derselben Z wie der Startpunkt, das ES-Element landete dann faelschlich wieder auf Starthoehe trotz korrekt gefallener Kette.

Fix: Ziel-Z fuer das ES-Element ist jetzt (caddr sep-endpunkt) - die tatsaechlich durch die Kette (Geraden/Boegen mit grade) aufgebaute Hoehe am Ende, nicht der Klick-Wert. endpunkt-ref dient weiterhin nur zur groben deltaH-Schaetzung fuer den Winkel-Vorschlag im Dialog (den der Nutzer ohnehin bestaetigt/ueberschreibt). Das Attribut HOEHE_BIS_mm wird aus demselben Grund jetzt ebenfalls aus der real gebauten Endhoehe (es-aus-frame) statt aus endpunkt-ref gelesen, damit es nicht von der sichtbaren Geometrie abweicht. Identischer Fix im neuen Rebuild-Pfad (gf-linienzug-rebuild) angewendet, der denselben Mechanismus nutzt.

Manuell in BricsCAD verifiziert: ES-Element hat jetzt korrekten Hoehenversatz.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 13:29:40 +02:00
m.stangl 01fb2d29f2 [CHANGE] GEFAELLESTRECKE_LINIENZUG-Streckengruppen per Doppelklick editierbar machen
Bisher brach GEFAELLESTRECKE_EDIT bei jeder Streckengruppe (TYP "Streckengruppe", d.h. mit mindestens einem Bogen) mit "Nur einfache Gefaellestrecken..." ab - Grund war nicht fehlende Technik, sondern dass gf-linienzug-modus schlicht keine Edit-XDATA schrieb (anders als Modus 1/2 ueber SSG_GF_EDIT).

Neue XDATA-App SSG_GF_LZ (gf-lz-xdata-schreiben/-lesen in Lisp/Gefaellestrecke.lsp) sichert die Segmentliste (Typ/hz/Laenge/Winkel/Seite je Segment, bereits laengenfertig) + den Baustartpunkt - Serialisierung per gf-segmente->string/gf-string->segmente, Chunking ueber die bestehenden ssg-sepliste-chunk-string/-split-feld/-explode-chars-Helfer aus ssg_ks_insert.lsp (wiederverwendet statt dupliziert).

Neue Funktion gf-linienzug-rebuild: baut die Kette am selben Startpunkt neu, AS-/EIN-Element und Gefaellewinkel bleiben ueber dieselben zwei Dialoge wie beim Bauen editierbar (gf-dialog-linienzug-aus-ein/-winkel, jetzt mit prefill-Parameter fuer den Edit-Fall statt Defaults) - die Segmentlaengen/-form selbst nicht (dafuer bleibt GEFAELLESTRECKE_LINIENZUG als Neubau). c:GEFAELLESTRECKE_EDIT dispatcht vor der bisherigen TYP-Sperre: Streckengruppe MIT SSG_GF_LZ-XDATA -> neuer Rebuild-Pfad, Streckengruppe OHNE (Altbestand/VF-Kombi) -> bleibt wie bisher abgewiesen. Alter Block wird erst NACH erfolgreichem Neuaufbau geloescht.

doc/variofoerderer.md um den Edit-Ablauf ergaenzt.

Manuell in BricsCAD getestet (Doppelklick auf Linienzug-Streckengruppe, beide Dialoge vorbelegt, Neuaufbau, erneuter Doppelklick auf das Ergebnis) - laeuft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 13:16:55 +02:00
m.stangl a9cdc127d9 [CHANGE] GEFAELLESTRECKE_LINIENZUG: AS/ES-Auswahl und Gefaellewinkel per Dialog statt Konsole (Teil B der GUI-Umstellung)
Zwei neue Dialoge (dcl/gefaellestrecke.dcl, Lisp/Gefaellestrecke.lsp):
- gf-dialog-linienzug-aus-ein: AUS-/EIN-Element Winkel+Seite in EINEM Dialog, ersetzt die vier fruehen Konsolenfragen. Muss vor der Segmentlaengen-/Winkelberechnung laufen (haengt von AS-/ES-Masse ab), darum eigener, fruehzeitiger Dialog.
- gf-dialog-linienzug-winkel: zeigt den automatisch aus der Segmentkette berechneten Gefaellewinkel-Vorschlag ueberschreibbar, mit kurzer Segment-Zusammenfassung und dem bereits gewaehlten AS/ES-Paar nur noch zur Kontrolle (disabled). Ersetzt zugleich die SPAETERE finale Einfuegen-Bestaetigung - nach der rein automatischen AS/ES-Korrekturschleife waere eine zweite Rueckfrage redundant.

Objektauswahl (ssget LINE/ARC) und Start-/Endpunktwahl bleiben bewusst Zeichnung/Konsole. Rueckfall auf die alten Konsolenfragen bleibt erhalten, wenn ein Dialog nicht gezeigt werden kann/darf (GUI aus); ein bewusster Dialog-Abbruch bricht dagegen den ganzen Befehl ab statt auf Konsole zurueckzufallen - neu im Vergleich zum alten Verhalten, aber konsistent mit vfc_eingabemodus/vfs_nachruesten_hz aus Teil A/C.

doc/variofoerderer.md (Abschnitt 4) aktualisiert und um einen bebilderten Beispiel-Walkthrough ergaenzt (gf-linienzug1-3.png: Ausgangslinie, Dialog mit Vorschlagswinkel, fertige Strecke neben der Original-Linie).

Manuell in BricsCAD getestet (vollstaendiger Lauf inkl. Abbruch in beiden Dialogen) - laeuft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 12:22:53 +02:00
m.stangl 57bb1e9057 [CHANGE] VARIOFOERDERER_NACHRUESTEN: Baurichtung per Dialog statt Konsole (Teil C der GUI-Umstellung)
Neuer Dialog vfs_nachruesten_hz (dcl/variofoerderer.dcl) + vfs-dialog-nachruesten-hz (Lisp/vf_standard.lsp) ersetzt den fruehren getreal-Prompt. Zeigt pro unmarkiertem VF_n-Fund Blockname/erkannten Typ und ein hz-Feld, vorbelegt mit dem zuletzt eingegebenen Wert (identisches Default-Fortpflanzungs-Verhalten wie vorher).

"Abbrechen" im Dialog uebernimmt bewusst nur den Vorgabewert fuer DIESEN Fund (Rueckgabe 'ABBRUCH), statt die ganze Nachruesten-Schleife abzubrechen oder auf die Konsole zurueckzufallen - echter Konsolen-Rueckfall bleibt ausschliesslich fuer den Fall, dass der Dialog gar nicht gezeigt werden kann (GUI abgeschaltet). Die Objektauswahl (ssget) selbst bleibt unveraendert Zeichnung/Konsole.

doc/variofoerderer.md um den Befehl ergaenzt (war dort bisher gar nicht erwaehnt).

Manuell in BricsCAD getestet (unmarkierter VF_4-Block, Dialog erscheint, hz=0 markiert) - laeuft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 11:59:18 +02:00
m.stangl 9a7907ab00 [CHANGE] VF Standard/Etage 3D-Linie-Eingabemodus per Dialog statt Konsole (Teil A der GUI-Umstellung)
Neuer Dialog vfc_eingabemodus (dcl/variofoerderer.dcl) + vfc-dialog-eingabemodus-waehlen (Lisp/vf_core.lsp), analog zum bestehenden vfc_typ-Muster: Radio-Buttons "3D-Linie auswaehlen" / "Werte manuell eingeben" ersetzen die fruehere getstring-Konsolenabfrage in vf-dialog-ablauf. Betrifft StandardVarioFoerderer3D und EtageVarioFoerderer3D (beide rufen denselben Ablauf).

Die 3D-Linie-Objektauswahl selbst (vfc-3dlinie-erfassen) bleibt bewusst Zeichnung/Konsole - eine Linie laesst sich nicht durch ein Formularfeld ersetzen. Alle daraus abgeleiteten Werte (deltaL/deltaH/hz/Einfuegehoehe) gehen als Prefill in den bereits bestehenden Basis-Dialog (variofoerderer_basis), der sie ueberschreibbar anzeigt - identisch zum "Werte manuell"-Pfad.

Rueckfall auf die alte Konsolenabfrage bleibt erhalten (GUI abgeschaltet, DXFM_LANG=en_GB), wie bei vfc_typ. doc/variofoerderer.md (Abschnitt 2, 8, Entscheidungsbaum) und CLAUDE.md entsprechend aktualisiert.

Manuell in BricsCAD getestet (StandardVarioFoerderer3D + EtageVarioFoerderer3D, beide Dialogzweige inkl. Abbruch) - laeuft.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 11:38:15 +02:00
m.stangl 2ef8f319ab [FIX] vf_linienzug_modus1_anleitung.md: Fragen-Tabelle und Stufe-2-Zahlen an aktuelle Testdatei angepasst
tests/testdata/linienzug_tests_stufe2.json hat sich seit Erstellung des Dokuments geaendert (62 statt 57 Eingabe-Eintraege, zusaetzliche Separator-Vor/Nach-Fragen, Kettenende-Frage vor statt nach der Gefaelle-Berechnung). Fragen-Tabelle in Abschnitt 3 komplett neu durchnummeriert und mit den tatsaechlichen JSON-Kommentaren abgeglichen.

Stufe-2-Ergebnis war veraltet: GF2=86mm/VF=286mm ersetzt durch die tatsaechlichen GF2=319mm/L_VF=48mm aus der Datei; Hoehenrest-Beispielrechnung in Abschnitt 5.a entsprechend angepasst.

Fehlerhafter Fakt in Abschnitt 5.c korrigiert: linienzug_tests.json hat ebenfalls erwartung_dx_mm=638 (nicht dY=637 wie behauptet) - beide Testfaelle zeigen denselben dX-Versatz.

Code-Fakten verifiziert und unveraendert korrekt: Winkeltabelle 3/6/9/12/15/18/21/27/33/39/45/51 Grad (data/json/component_defaults.json), *vfk-feste-horizontal-kettenende*=800mm, *vfl-gf-min-laenge*=400mm, vfl-winkel-stufe-entscheidung/berechne-alle-winkel/berechne-horizontale-mitte/vfl-loesche-seit/vfl-modus-abbruch-sichern existieren alle weiterhin, TEST_LINIENZUG_STUFE2 liest weiterhin linienzug_tests_stufe2.json.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 11:02:35 +02:00
m.stangl 5aed90dd56 [CHANGE] doc/plan und doc/todo angelegt, interne Analyse-/TODO-Dokumente dorthin verschoben
doc/todo/: TODO-plan-vf-interactive.md -> plan-vf-interactive.md, TODO-modus2-achsenweise-bilanz.md -> modus2-achsenweise-bilanz.md (offene Fahrplaene/TODOs).
doc/plan/: KS-Frame-Architektur.md, vf-parameter-struct-analyse.md, translate.md, Entwicklungsplan.md (Architektur-Analysen und Planungsdokumente, kein Anwender-Material).

Alle internen Verweise (CLAUDE.md, Lisp/README.md, README.md, doc/variofoerderer.md, Lisp/vf_spec.lsp, lib/dxf_vf_abbild.py, lib/vf_spec_export.py, tests/test_hm_recformat.lsp, tests/test_vf_geometrie.py, tests/test_vf_headless_statisch.py) auf die neuen Pfade angepasst. Reine Pfad-Updates in Kommentaren/Docstrings, keine funktionale Aenderung - Python-Syntax nach dem Umbau geprueft.

Anwender-/Entwickler-Referenzdoku (faq.md, kommandos.md, tools.md, dbg2lsp.md, csv-export.md, json-input-lisp.md, lisp_methods.md, LispTests.md, variofoerderer.md, vf_linienzug_modus1_anleitung.md) bleibt direkt in doc/.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 10:56:54 +02:00
m.stangl fe4637d7df [FIX] doc/tools.md: veraltete Item-Zahlen korrigiert, Aufruf vereinheitlicht; set_coords.bat Copy-Paste-Kommentar behoben
Datenbasis (data/json/omniflo_*.json) hat sich seit der letzten Doku-Pflege verschoben: Boegen 27->29, Delta 1->7, Sternweiche 1->2, Dreifachweiche 6->0 (Typ aktuell nicht mehr in den Daten vorhanden), Gesamt 107->110. Schalter/Filterkriterien selbst (SWITCH_FILTERS in lib/omniflo_utils.py) sind unveraendert und weiterhin korrekt dokumentiert.

set_koords-Aufruf im Dokument auf bin\set_coords.bat vereinheitlicht (war inkonsistent zu set_einfuegepunkt.bat, das korrekt den bin\-Wrapper nennt).

bin/set_coords.bat trug noch den Kopfkommentar von set_einfuegepunkt.bat (Copy-Paste-Fehler) - korrigiert auf den tatsaechlichen Zweck (K1-K4 setzen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 10:51:12 +02:00
m.stangl b0322a4f3c [CHANGE] Batch-Wrapper fuer dxf_anlage_export.py, dxf_scan_components.py, dxf_vf_abbild.py
Drei neue bin/*.bat nach dem bestehenden Pass-Through-Muster (setenv.bat + python ... %*, siehe set_einfuegepunkt.bat/dbg2lsp.bat), damit diese lib/-Skripte wie die uebrigen Python-Kommandozeilen bequem ueber bin/ aufrufbar sind. doc/kommandos.md Abschnitt 3 ergaenzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 10:47:23 +02:00
m.stangl aaf47ab3c1 [CHANGE] JSON-Testdaten-Feldnamen aus dxf_anlage_export.py in lib/testdata_schema.py zentralisiert
dxf_anlage_export.py und dxf_scan_components.py fuehrten dieselben Feldnamen (abstand, deltaL_mm, as_seite, ...) aus doc/json-input-lisp.md unabhaengig als lose String-Literale - ein Tippfehler oder eine Schema-Aenderung in nur einer Datei waere nicht aufgefallen. Neues Modul lib/testdata_schema.py buendelt die Feldnamen/festen Werte der dokumentierten Schemas (Kreisel, Einzelblock, VF Standard/Etage, Gefaellestrecke Modus 1) als benannte Konstanten; dxf_anlage_export.py nutzt sie jetzt durchgaengig.

dxf_scan_components.py bewusst NICHT mitumgebaut: deutlich grösser/komplexer, mit zusaetzlichen Sonderfaellen (z.B. "startpunkt"/"gerade"-Form), ein vollstaendiger Umbau haette den Rahmen dieser Aenderung gesprengt und mehr Risiko als Nutzen gehabt.

Verhaltensgleich: alle 9 Tests in tests/test_dxf_anlage_export.py laufen weiterhin gruen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 10:43:09 +02:00
m.stangl 1e7e2c6349 [DOC] kommandos.md, faq.md, json-input-lisp.md: fehlende Eintraege ergaenzt
kommandos.md: lib/dxf_anlage_export.py fehlte in der Python-Kommandozeilen-Liste.
faq.md: FAQ-Eintrag fuer QcLinieMitGf/QcLinieMitGfUForm ergaenzt (bisher nur stichwortartig in der Gefaellestrecke-Liste erwaehnt, nirgends erklaert).
json-input-lisp.md: tests/testdata/showroom_ils.json fehlte in der Testdaten-Uebersicht (Abschnitt 9), obwohl TEST_SHOWROOM_ILS dokumentiert ist.

Alle anderen Befehle/Dateien/Testdaten in den drei Dokumenten gegen den aktuellen Code-Stand geprueft und bestaetigt aktuell.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-09 10:34:20 +02:00