feat: Linienzug-Batch-Konvertierung headless, alter Block bleibt bis zum Erfolg
- vfl-konvertiere-ent laeuft unter *vfl-headless* (Wizard/GUI aus): reicht ein Journal nicht, Abbruch mit Fundstelle statt Live-Rueckfrage im Batch - alter VF_n-Block wird erst nach erfolgreichem Neubau geloescht; bei Fehlschlag raeumt vfl-konvert-aufraeumen die Teil-Geometrie weg - SSG_DIM_ALL_2D/_3D listet fehlgeschlagene Bloecke am Ende auf und konvertiert jetzt auch Modus-3-Bloecke (linienzug3 wurde uebersprungen) - statischer Headless-Test: vfl-menu-strwert/vflw-radio-wahl-impl erlaubt - TODO: Stufe 2 und Spec-Uebersetzer Modus 2/3 in eigene Dateien ausgelagert Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
# TODO: VF-Linienzug ohne GUI/Konsole - Stufe 2 (Funktionstrennung)
|
||||
|
||||
**Stand:** 2026-10-26 · **Prioritaet:** niedrig - bringt Architektur, keine
|
||||
neue Funktion.
|
||||
|
||||
Herausgeloester Arbeitsauftrag aus dem Gesamtplan
|
||||
[plan-vf-interactive.md](plan-vf-interactive.md) (Teil 5 "Stufe 2: echte
|
||||
Funktionstrennung"). Dort stehen die ausfuehrliche Begruendung, die
|
||||
Knotenform und die Risikoliste; diese Datei ist die Abarbeitungsliste.
|
||||
|
||||
## Ausgangslage (Stufe 1, fertig)
|
||||
|
||||
Linienzug-Ketten lassen sich bereits ohne Dialog bauen (`VF_SPEC_BAU`,
|
||||
[vf_spec.lsp](../../Lisp/vf_spec.lsp)) - allerdings ueber einen Umweg:
|
||||
|
||||
1. Die **Spec** (Kette in Domaenenwerten) wird von `vsp-journal` in ein
|
||||
Eingabe-Journal uebersetzt - also in die Antworten, die ein Anwender
|
||||
gegeben haette.
|
||||
2. `vsp-bau-journal` startet per `vfl-journal-replay-start` den ganz normalen
|
||||
interaktiven Bau `vf-linienzug-modus` ([vf_linienzug.lsp](../../Lisp/vf_linienzug.lsp)).
|
||||
3. Jede Frage wird aus der Replay-Queue beantwortet.
|
||||
|
||||
Das funktioniert und ist per `TEST_HUNDM05` im CAD verifiziert - der Bau
|
||||
selbst "weiss" aber nichts von Daten, er fragt weiter, nur antwortet die Queue.
|
||||
|
||||
## Ziel (Stufe 2)
|
||||
|
||||
Die Funktionen in `vf_linienzug.lsp` mischen **Fragen** und **Geometrie
|
||||
bauen**. Stufe 2 trennt das:
|
||||
|
||||
- **reiner Bauteil** (Suffix `-bauen` bzw. `-setzen`): nimmt Parameter,
|
||||
baut Geometrie, fragt nichts;
|
||||
- die **Frage-Schale** behaelt den bisherigen Namen und ruft den Bauteil auf
|
||||
- dadurch aendert sich keine Aufrufstelle in Modus 1/2/3.
|
||||
|
||||
Am Ende ruft `vfl-spec-ausfuehren` die Bauteile direkt mit den Spec-Werten
|
||||
auf, ohne Journal-Replay.
|
||||
|
||||
## Stand der Schritte
|
||||
|
||||
Zeilennummern Stand 2026-10-26 (die `:NNNN`-Angaben im Gesamtplan sind
|
||||
veraltet).
|
||||
|
||||
| Schritt | Inhalt | Stand |
|
||||
|---|---|---|
|
||||
| 0 | `vfl-ziel-report` (vf_linienzug.lsp:7864) aus zwei identischen Bloecken gezogen | erledigt |
|
||||
| 1 | Winkelwahl `vfl-winkel-gueltige` (:3071) / `vfl-winkel-nach-index` + Kanal `*vfl-winkel-idx-vorgabe*` | erledigt |
|
||||
| 2 | `vfl-es-masse-setzen` (:7557) | erledigt |
|
||||
| 3 | `vfl-hor-koerper-bauen` (:5989), Schale `vfl-baue-horizontal-koerper` (:6152) | erledigt |
|
||||
| 4 | `vfl-body-abschluss-bauen` (:6502) | erledigt |
|
||||
| 5a/5b | VF-Einheit Eingang/Ausgang: `vfl-vf-eingang-bauen` (:6728), `vfl-vf-ausgang-bauen` (:6742) | erledigt |
|
||||
| **5c** | Schleifenrumpf von `vfl-vf-einheit` (:6772) - die Sub-Stuecke der VF-Einheit als Bauteil | **offen** |
|
||||
| **6** | Daten-Executor fuer die VF-Einheit (baut sie direkt aus Daten) | **offen** |
|
||||
| 7 | Spec + Serializer + Assertion: `vsp-journal-diff` (vf_spec.lsp:900) prueft Spec-Journal gegen das beim Bau aufgezeichnete Token fuer Token | Assertion erledigt |
|
||||
| **8** | Einheit-Abschluss: `vfl-vf-einheit-abschluss` (:7889) | **offen** |
|
||||
| **9** | Kettenebene, ein Glied-Zweig pro Commit: GF-Bogen -> ES -> Horizontal-VF -> Linie-GF -> Linie-VF -> Linie | **offen** |
|
||||
| **10** | `vfl-spec-ausfuehren` - der direkte Daten-Pfad (existiert noch nicht) | **offen** |
|
||||
| 11 | Dasselbe fuer Modus 2 | zurueckgestellt, bis 2-3 echte Modus-2-Journale als Referenz vorliegen |
|
||||
|
||||
## Warum es heikel ist
|
||||
|
||||
Bei den offenen Schritten ist die **Reihenfolge selbst Geometrie**
|
||||
(Gesamtplan, Abschnitt "Wo Geometrie still kippen kann"), u.a.:
|
||||
|
||||
- die dL-Subtraktionskette ist je Schritt mit
|
||||
`(max *vfk-restlaenge-min-clamp* ...)` geklammert, also
|
||||
reihenfolgeabhaengig;
|
||||
- die `vfl-acc-*`-Aufrufe muessen an derselben Stelle in derselben
|
||||
Reihenfolge bleiben, sonst vertauschen sich `L_VF_m`/`L_GF_m`/`GF_WINKEL`
|
||||
- in der Zeichnung unsichtbar, im Sivas-Export falsch;
|
||||
- `*vfl-as-winkel*`/`*vfl-es-winkel*` werden lazy von den Blocknamen-Bauern
|
||||
gelesen - spaeter gesetzt heisst falscher Block;
|
||||
- `ziel-gf2` vs. `L_GF2-bau` im Ausgang - geht es verloren, entsteht still
|
||||
die falsche GF2 hinter dem Motor.
|
||||
|
||||
Ausdruecklich nicht anfassen: siehe Gesamtplan, Abschnitt "Ausdruecklich
|
||||
nicht anfassen" (u.a. alle Journal-Konsumenten, `vfl-in-*`-Wrapper,
|
||||
Wizard-Schicht, Abbruch-Pfad).
|
||||
|
||||
## Ablauf je Schritt
|
||||
|
||||
1. Umbauen (Frage-Schale behaelt Namen, Bauteil wortwoertlich umziehen,
|
||||
keine Umsortierung).
|
||||
2. CAD-Lauf: `TEST_HUNDM05` (save dxf), `TEST_VF_SPEC`, `TEST_LINIENZUG`.
|
||||
3. `pytest tests/test_vf_geometrie.py` gegen
|
||||
`tests/reference/hundm05_attribute.json` - nennt bei Abweichung Kette
|
||||
und Feld. Referenz nur nach geprueftem Lauf auffrischen
|
||||
(`lib/dxf_vf_abbild.py --schreibe-referenz`).
|
||||
4. Nach Geometrie-Schritten (5c, 9) zusaetzlich DXF-Diff und
|
||||
Sivas-Export-Vergleich.
|
||||
5. Ein Schritt pro Commit - sonst ist ein Fehler keinem Schritt mehr
|
||||
zuzuordnen.
|
||||
|
||||
## Wann angehen
|
||||
|
||||
Erst bei konkretem Bedarf: einzelne Bauteile ohne Journal aufrufen, oder der
|
||||
Replay-Umweg wird zu langsam bzw. zu fehleranfaellig. Bis dahin genuegt
|
||||
Stufe 1.
|
||||
@@ -7,9 +7,12 @@ Schritte 0-4 + 7-Assertion fertig, 5/6/8/9/10 offen, 11 zurueckgestellt.
|
||||
**Herkunft:** Planungslauf (Plan-Modus) vom 2026-09-02, hier eingecheckt zur Nachverfolgung.
|
||||
**Pruefung 2026-10-26:** Stand unveraendert - Stufe 2 Schritte 5c/6/8/9/10
|
||||
(u.a. `vfl-spec-ausfuehren`) und die Spec-Uebersetzer fuer Modus 2/3 sind
|
||||
weiterhin nicht gebaut. Hinweis: Modus 2/3 journalisieren inzwischen
|
||||
Segment-Essenz (`SEGS`) statt Objekt-Handles (`OBJS`), Abschnitt 4.4 ist
|
||||
darauf noch nicht angepasst.
|
||||
weiterhin nicht gebaut. Die Spec-Uebersetzer fuer Modus 2/3 (auf
|
||||
`SEGS`-Basis, Abschnitt 4.4 ersetzt) sind ausgelagert nach
|
||||
[spec-modus2-3.md](spec-modus2-3.md).
|
||||
**Abarbeitungsliste Stufe 2:** herausgeloest nach
|
||||
[linienzug-ohne-gui.md](linienzug-ohne-gui.md) (aktuelle Zeilennummern,
|
||||
Ablauf je Schritt); Teil 5 hier bleibt die ausfuehrliche Referenz.
|
||||
|
||||
## Fortschritt
|
||||
|
||||
@@ -93,9 +96,9 @@ Doppelklick-Edit, `SSG_DIM_SWITCH`) ist unveraendert. Das `"disabled": true`
|
||||
der hundm05-Zeile in `tests/alltests.json` ist weg, der Test laeuft aktiv
|
||||
mit.
|
||||
|
||||
**Bewusst nicht umgestellt**: `vfl-konvertiere-ent` (Batch-2D/3D) laeuft
|
||||
weiter ohne `*vfl-headless*` - eine Live-Rueckfrage ist dort bisher gewolltes
|
||||
Verhalten. Kandidat fuer Stufe 1, wenn der Ergebnis-Record steht.
|
||||
**Nachtrag 2026-10-26**: `vfl-konvertiere-ent` (Batch-2D/3D) laeuft jetzt
|
||||
ebenfalls unter `*vfl-headless*`; der alte Block wird erst nach erfolgreichem
|
||||
Neubau geloescht (Details `doc/variofoerderer.md`, Abschnitt Headless).
|
||||
|
||||
## Kontext
|
||||
|
||||
@@ -347,6 +350,11 @@ gesammelten Meldungen aus P1.
|
||||
|
||||
### 4.4 Modus 2 und Modus 3
|
||||
|
||||
> **Ueberholt (2026-10-26):** Modus 2/3 journalisieren seit 2026-09-18
|
||||
> `SEGS` statt `OBJS`, Modus 3 hat Journal + Doppelklick-Edit. Aktueller
|
||||
> Entwurf und Schritte: [spec-modus2-3.md](spec-modus2-3.md). Der folgende
|
||||
> Text bleibt nur als Historie.
|
||||
|
||||
Modus 2: Spec traegt `("pfad-handles" ...)` (Entity-Handles der LINE/ARC-Trasse)
|
||||
plus `("segmente" ...)` in Pfadreihenfolge. Vor dem Bau wird die Segmentzahl
|
||||
gegen die aufgeloesten Handles geprueft und bei Fehlbestand abgebrochen - die
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# TODO: Spec-Uebersetzer fuer VF-Linienzug Modus 2 und 3
|
||||
|
||||
**Stand:** 2026-10-26 · **Prioritaet:** mittel - einzige fehlende
|
||||
FUNKTION im Daten-Pfad (Modus-2/3-Ketten sind nur interaktiv baubar).
|
||||
|
||||
Herausgeloester Rest von Stufe 1 aus [plan-vf-interactive.md](plan-vf-interactive.md)
|
||||
(dort Abschnitt 4.4, der hiermit ersetzt ist). Schwester-Auftrag:
|
||||
[linienzug-ohne-gui.md](linienzug-ohne-gui.md) (Stufe 2).
|
||||
|
||||
## Ausgangslage
|
||||
|
||||
Der Daten-Pfad `VF_SPEC_BAU` ([vf_spec.lsp](../../Lisp/vf_spec.lsp)) kann nur
|
||||
Modus 1:
|
||||
|
||||
- `vsp-journal` (vf_spec.lsp:568) kennt nur den Fragenfluss/die Menue-Codes
|
||||
von `vf-linienzug-modus` (z.B. `*vsp-tab-gf-laenge-modus*`, :56).
|
||||
- `vsp-bau-journal` (:939) ruft fest `vf-linienzug-modus` auf (:978).
|
||||
|
||||
Modus 2 (`vf-linienzug-modus2`, Pfad + Zielhoehe, Marker `"linienzug2"`) und
|
||||
Modus 3 (`vf-linienzug-modus3`, Vorwaerts-Nachbau, Marker `"linienzug3"`)
|
||||
fragen grundlegend anders: erst Pfad-Auswahl (`vfl-in-segmente`), dann je
|
||||
Segment ein Klassifizierungs-Dialog (`vflw_seg_linie_m2`/`_m3`,
|
||||
`vflw_seg_bogen`). Dafuer gibt es weder Uebersetzer noch Bau-Aufruf.
|
||||
|
||||
Doppelklick-Edit/Neuaufbau funktioniert fuer beide Modi bereits
|
||||
(`vfl-edit-ent-voll`) - es fehlt nur der Bau aus einer Spec-Datei.
|
||||
|
||||
## Korrektur des alten Entwurfs (Plan 4.4, Stand 2026-09-02)
|
||||
|
||||
| alter Entwurf | heute (seit 2026-09-18) |
|
||||
|---|---|
|
||||
| Modus-2-Spec traegt `pfad-handles` (Entity-Handles, Journal-Art `OBJS`), vor dem Bau gegen die reale Zeichnung geprueft | Modus 2 UND 3 journalisieren die **Segment-Essenz** als Journal-Art `SEGS`: je Segment 9 Felder `typ hz laenge bwinkel bseite spx spy epx epy` (`vfl-segs->string`/`vfl-string->segs`, vf_linienzug.lsp). Die Kette ist selbst-enthalten, die Original-LINE/ARC werden nicht mehr gebraucht |
|
||||
| Modus 3 ohne Journal-XDATA, kein Doppelklick-Edit, keine 2D/3D-Konvertierung; Nachruestung zurueckgestellt | Modus 3 schreibt Marker `"linienzug3"` und ist per Doppelklick editierbar |
|
||||
| "Eine Gerade direkt nach einer Vario-Kurve wird nicht gefragt - der Uebersetzer leitet das ab" | gilt vermutlich weiter, am echten Journal pruefen |
|
||||
|
||||
Folge fuer den Entwurf: Die Spec fuer Modus 2/3 traegt eine **Segmentliste**
|
||||
statt Objekt-Handles plus die Klassifizierung je Segment (Typ, GF-Neigung
|
||||
bzw. Wert, Bogen-Variante) und die Praeambel (Startpunkt, Starthoehe,
|
||||
AS/ES). Sie ist damit wie Modus 1 **ohne Zeichnung** pruefbar.
|
||||
|
||||
## Schritte
|
||||
|
||||
| Schritt | Inhalt | Stand |
|
||||
|---|---|---|
|
||||
| 1 | Referenz-Journale erzeugen: in BricsCAD 2-3 typische Ketten je Modus (2 und 3) bauen, Zeichnung unter `tests/testdata/` ablegen. Abdecken: GF- und VF-Segmente, Bogen, AS/ES ja/nein, bei Modus 3 altes und neues AS/ES-Format | **offen** |
|
||||
| 2 | Python-Lesepfad: `lib/vf_journal_export.py` (+ `vf_linienzug_grammatik.py`) lernen `linienzug2`/`linienzug3` mit `SEGS` (heute: "unbekannter Code") | **offen** |
|
||||
| 3 | Spec-Form fuer Modus 2/3 festlegen (flaches JSON, lesbar von `ssg-load-json`, Segmente als Einzeiler) | **offen** |
|
||||
| 4 | Python-Rundlauf `spec_aus_journal`/`journal_aus_spec` fuer Modus 2/3 in `lib/vf_spec_export.py`, Test in `tests/test_vf_spec.py`: Journal -> Spec -> Journal tokengleich | **offen** |
|
||||
| 5 | LISP: `vsp-journal` je Modus (Dispatch ueber Spec-Feld `modus`), `vsp-pruefen` um Modus-2/3-Regeln erweitern | **offen** |
|
||||
| 6 | `vsp-bau-journal`: Bau-Funktion nach Modus waehlen (`vf-linienzug-modus2`/`-modus3`), Ergebnis-Record wie Modus 1 (`prompts` = 0, `journal_diff` leer) | **offen** |
|
||||
| 7 | CAD-Test analog `TEST_HUNDM05` + Eintrag in `tests/alltests.json`; file-freie Teile als `tu-*` in `tests/test_unit.lsp` | **offen** |
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Korrektheitskriterium Modus 3 ist "gleiches rein, gleiches raus", NICHT
|
||||
"trifft den Zielpunkt" - der Ist/Soll-Ende-Report weicht schon im
|
||||
interaktiven Bau ab.
|
||||
- Alte `"linienzug2"`-Bloecke mit `OBJS`-Journal (vor 2026-09-18) sind
|
||||
nicht mehr editierbar und taugen NICHT als Referenz.
|
||||
- Neue `vfl-in-*`-Wrapper mit `ssget`/`get*` im statischen Waechter
|
||||
`tests/test_vf_headless_statisch.py` eintragen.
|
||||
- Werte selbstbeschreibend in der Spec (Winkel 30/60/90, nicht Index) -
|
||||
siehe CLAUDE.md, Konventionen.
|
||||
Reference in New Issue
Block a user