Files
dxfmakros/doc/vf_linienzug_modus1_anleitung.md
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

15 KiB

VF-Linienzug Modus 1 - Anleitung anhand eines realen Beispiels

Diese Anleitung erklaert Modus 1 des VF-Linienzugs ("Manuelle Eingabe", vf-linienzug-modus in Lisp/vf_linienzug.lsp) nicht abstrakt, sondern Schritt fuer Schritt anhand eines echten, in BricsCAD gebauten und verifizierten Beispiels. Dasselbe Beispiel ist als automatisierter Regressionstest hinterlegt: tests/testdata/linienzug_tests_stufe2.json, aufrufbar in BricsCAD ueber TEST_LINIENZUG_STUFE2 (siehe tests/test_linienzug.lsp). Wer die Zahlen selbst nachvollziehen will, kann diesen Testlauf jederzeit wiederholen.

Fuer die Architektur-Details (Frame-Kette, Journal/XDATA, Wizard-Dialoge) siehe doc/variofoerderer.md. Diese Anleitung konzentriert sich auf die Bedienung und die typischen Stolperfallen.

1. Was ist Modus 1?

Modus 1 baut eine VF-Linienzug-Kette interaktiv, Element fuer Element: Sie klicken/geben nacheinander Punkte, Laengen, Winkel und Ja/Nein- Entscheidungen ein, und jede Antwort erzeugt sofort ein Stueck Geometrie (Umlenkstation, Gefaellestrecke, VF-Einheit, Vario-Kurve, ...). Das unterscheidet Modus 1 von:

  • Modus 2 (Ziel-Hoehe-Modus): Sie zeichnen vorher einen Pfad (LINE/ARC- Kette) und eine Zielhoehe, das Programm loest die Kette automatisch.
  • Modus 3 (Vorwaerts-Nachbau): rekonstruiert eine Kette aus einer bestehenden Zeichnung (Legacy, wird umgebaut).

Aufruf: Befehl FOERDERANLAGE (bzw. VarioFoerderer) -> Anlagen-Typ "Linienzug" waehlen -> Modus "1" (Manuelle Eingabe).

Jede Eingabe wird in einem Journal mitgeschrieben und als XDATA auf den fertigen VF_n-Block geschrieben. Ein Abbruch (ESC) loescht dadurch nichts - die bis dahin gebaute Teilkette bleibt als Block stehen und ist per Doppelklick weiter bearbeitbar.

2. Das Beispiel im Ueberblick

Die Kette aus linienzug_tests_stufe2.json sieht so aus (Grundriss, von oben betrachtet):

Start (Z=2154) --AS 90 links--> Horizontal-VF --Vario 90 rechts innen-->
  --Horizontal-VF--> --Vario 90 rechts innen--> Linie-GF (3 Grad, Separator
  vor+nach) --> Horizontal-VF --Vario 30 rechts innen--> Auf 27 Grad
  --Vario 30 links aussen--> Kettenende (Motorstation + ES 90 links)

Kurz gesagt: die Kette startet auf Z=2154, macht zwei 90-Grad-Schwenks im Grundriss, faellt ueber ein eigenstaendiges GF-Stueck (3 Grad) etwas ab, steigt dann in einer zweiten VF-Einheit um 27 Grad wieder an, und muss am Ende exakt auf die Starthoehe (2154mm) zurueckkommen. Genau dieser letzte Schritt - der Rest-Hoehenausgleich passt zu keinem der Standard-Winkel mehr - ist der interessante Teil (siehe Abschnitt 4, Stufe 1/Stufe 2).

3. Die Fragen der Reihe nach

Diese Tabelle zitiert die tatsaechlichen Konsolen-Fragen aus dem Testfall (Kommentar-Spalte = kommentar-Feld im JSON) und erklaert, was jede Frage bedeutet. Die Datei hat aktuell 62 Eingabe-Eintraege (ohne das Kopf-Objekt); mehrere Eintraege pro Zeile sind zu einem Schritt zusammengefasst, wo eine Antwort mehrere JSON-Eintraege verbraucht (z.B. eine Vario-Kurve = Winkel + Seite + Variante = 3 Eintraege).

# (JSON-Eintraege) Frage (sinngemaess) Antwort im Beispiel Bedeutung
1 Startpunkt der Kette Klick (X/Y) Beliebiger Punkt in der Zeichnung
2 Hoehe (Z) Startpunkt 2154 Absolute Einbauhoehe des Kettenanfangs
3 AS-Element setzen? Ja Umlenkstation am Anfang - "AS" = Ausgangs-/Anfangs-Element
4 AS-Element Winkel 90 Grad Baugroesse des Umlenkstations-Blocks (90 oder 30 Grad Kurvenradius)
5 AS-Seite links Auf welcher Seite die Umlenkstation seitlich ausschwenkt
6 Naechstes Element Neue VF mit horizontalem Anfang Kettenanfang-Menue hat 6 Optionen (GF-Bogen, Vario-Kurve, Linie-GF, Linie-VF, Horizontal-VF, Linienende)
7 Endpunkt der Linie Klick Laenge/Richtung der ersten VF-Einheit
8 Ziel-Hoehe fuer den horizontalen VF-Anfang 1980 Hoehe, auf die der Eingangs-GF-Anteil der VF-Einheit einregelt
9-10 Zusaetzlichen Separator VOR/NACH dem horizontalen Stueck? Nein / Nein Optionale Separatoren direkt am VF-Einlauf
11 Ist der Endpunkt der Foerderer? Nein Innerhalb der VF-Einheit: "geht die Kette hier zu Ende?"
12-15 Naechstes im VarioFoerderer -> Vario-Kurve 90 rechts innen - Grundriss-Schwenk INNERHALB der laufenden VF-Einheit
16 Ist der Endpunkt der Foerderer? Nein s.o.
17-18 Horizontaler Foerderer, Endpunkt Klick Weiteres gerades VF-Sub-Segment
19-20 Zusaetzlichen Separator VOR/NACH? Nein / Nein s.o.
21 Ist der Endpunkt der Foerderer? Nein s.o.
22-25 Vario-Kurve 90 rechts innen - Zweiter Grundriss-Schwenk
26 Ist der Endpunkt der Foerderer? Ja, nur Motorstation Schliesst die 1. VF-Einheit ab (Motorstation, kein ES)
27 Ist das Kettenende (ES-Element)? Nein, weiterbauen Nach der Motorstation: geht die Kette weiter?
28 Zusaetzlichen Separator hier? Nein Optionaler Separator direkt an der Motorstation
29 Naechstes Element Neue Linie: GF Jetzt folgt ein reines Gefaellestrecke-Element (kein VF)
30 Laenge bestimmen ueber Endpunkt waehlen Alternativ: Zielhoehe zuerst festlegen (siehe vfl-gf-laenge-modus)
31 Ist das Kettenende? Nein, weiterbauen 3-Optionen-Menue: Ja+ES / Ja ohne ES / Nein - kommt VOR der Gefaelle-/Laengenberechnung
32 Endpunkt Gefaellestrecke Klick Bestimmt deltaL der GF-Geraden
33-34 Separator VOR / NACH? Ja / Ja GF-Stuecke werden ueber Separatoren mechanisch begrenzt
35-36 Gefaelle festlegen -> Neigungswinkel 3 Grad Direkter Winkel (Alternative: Zielhoehe -> Winkel wird berechnet)
37 Naechstes Element Neue VF mit horizontalem Anfang (2. Einheit) Neue VF-Einheit beginnt direkt am GF-Ausgang (Separator als Eingang)
38-55 (wie oben: Separatoren, Vario-Kurven, Auf/Ab-Foerderer 27 Grad) - s.o.; Auf/Ab-Foerderer nutzt Index 8 der gueltigen Winkeltabelle-Kandidaten = 27 Grad
56 Ist der Endpunkt der Foerderer? Ja, Motorstation + Kettenende Startet den automatischen Kettenende-Abschluss
57-59 ES-Element setzen? / Winkel / Seite Ja / 90 / links Ausgangs-Element, spiegelbildlich zum AS-Element
60 Endpunkt Kettenende Klick Letzter gewuenschter Punkt der Kette
61 Ziel-Hoehe Kettenende 2154 Muss wieder exakt die Starthoehe sein
62 GF2=319mm unter Mindestlaenge (400mm) - trotzdem bauen? Ja Sicherheitsfrage, siehe Abschnitt 4 - Stufe-1/Stufe-2-Loeser rechnet dazwischen automatisch

Wichtig zu "Ist der Endpunkt der Foerderer?" (Eintraege 11/16/21/26 usw.): Diese Frage kommt IMMER, wenn Sie innerhalb einer laufenden VF-Einheit einen Punkt gepickt haben. "Nein" heisst: der gepickte Punkt ist nur eine Zwischen-Etappe, es geht in derselben VF-Einheit weiter (Vario-Kurve, weiteres gerades Stueck, Auf/Ab). "Ja" beendet die VF-Einheit mit einer Motorstation - optional zusaetzlich mit ES-Element (echtes Kettenende).

3a. Neu seit 2026-10-21: Zufuehrungsachse und "Parallel zum Kreisel"

Die Tabelle oben zitiert eine aeltere Aufzeichnung. Zwei Dinge sind seitdem dazugekommen (aeltere Ketten bleiben unveraendert editierbar - das Journal erkennt am Eintragstyp, welche Fragen damals gestellt wurden):

Zufuehrungsachse (2. Punkt) - jetzt bei BEIDEN AS-Winkeln. Nach Winkel und Seite (Eintrag 4/5) fragt der AS-Dialog zusaetzlich einen zweiten Punkt ab; im Assistenten stehen alle drei Angaben in EINEM Fenster (vflw_as_achse). Die beiden Angaben beschreiben verschiedene Dinge und legen das AS erst zusammen vollstaendig fest:

Angabe legt fest
2. Punkt Richtung der KS_EIN-Achse = die Zufuehrung, z.B. die Kreisel-Laufrichtung. Der Startpunkt bleibt der Sitz des AS-Elements, der zweite Punkt gibt nur die Richtung.
links/rechts AS-Variante und damit die KS_AUS-Richtung, also wohin die Kette nach dem Ausschleusen laeuft.

Der Dialog zeigt den Startpunkt mit an (er ist der Sitz des AS-Elements UND der Ausgangspunkt der Achse); waehrend der Punktwahl haengt das Gummiband an ihm. Mit dem gesetzten Punkt ist der Dialog fertig und schliesst direkt - die ermittelte Achsrichtung meldet die Konsole. Nur ein mit ESC abgebrochener Pick zeigt den Dialog noch einmal (mit den vorher gewaehlten Werten), damit nach einem Fehlklick nichts verloren geht.

Die Achse ist optional: ohne Punkt laeuft alles wie frueher ueber die Richtung des naechsten Klicks. Frueher ersetzte die Achse beim 30-Grad- Element die Seitenfrage (die Seite wurde aus der Lage des naechsten Punkts erraten); das gilt nur noch beim Nachbau alter Ketten.

"Parallel zum Kreisel weiterbauen" - 5. Option der Frage "Wie soll die Laenge dieser Gefaellestrecke bestimmt werden?" (Eintrag 30). Sie erscheint nur am Kettenanfang mit AS-Element UND festgelegter Zufuehrungsachse, weil sie beides als Bezug braucht. Gebaut wird AS -> kurzes GF-Stueck -> GF-Bogen, sodass die Kette danach parallel zur Zufuehrungsachse weiterlaeuft. Einzige Eingabe ist der Abstand, gemessen senkrecht zur Zufuehrungsachse von KS_EIN des AS bis KS_AUS des Bogens; die Laenge des GF-Stuecks dazwischen wird daraus berechnet. Ein Separator zwischen GF-Stueck und Bogen wird bewusst NICHT gesetzt, damit der Abstand exakt getroffen wird. Der Bogen wird nicht geraten, sondern so gewaehlt, dass er den gemessenen Grundriss-Schwenk des AS-Blocks genau aufhebt - immer zur Gegenseite der AS-Seite:

AS Bogen
30 Grad links 30 Grad rechts
30 Grad rechts 30 Grad links
90 Grad links 90 Grad rechts
90 Grad rechts 90 Grad links

Diese Tabelle ist das ERGEBNIS der Messung, keine gepflegte Zuordnung im Code - sie bleibt auch dann richtig, wenn ein Element anders vermessen ist als hier erwartet.

Direkt nach dem Bogen kommt die gewohnte Frage "Ist das das Kettenende?" (Ja mit ES / Ja ohne ES / Nein, weiterbauen) - hier ausnahmsweise NACH dem Bau, weil es keine gepickte Laenge gibt, von der ein ES-Fussabdruck abzuziehen waere.

4. Stufe 1 / Stufe 2 - wie die letzte Strecke berechnet wird

Am Kettenende (Eintrag 61/62) ist die Aufgabe: von der aktuellen Position/ Hoehe zur gewuenschten Ziel-Hoehe kommen, UND dabei die feste Baugruppe Motorstation + Separator (+ ES-Element, falls gewaehlt) unterbringen. Das Programm versucht das in zwei Stufen (vfl-winkel-stufe-entscheidung, Lisp/vf_linienzug.lsp):

  • Stufe 1 - Winkeltabelle: Es probiert der Reihe nach die festen Vario-Kurven-Winkel 3/6/9/12/15/18/21/27/33/39/45/51 Grad durch (berechne-alle-winkel) und prueft, ob einer davon eine PASSENDE, positive VF-Laenge ergibt. Das ist der Normalfall (siehe die Zeile "38-55" in der Tabelle: der Auf/Ab-Foerderer in der 2. VF-Einheit findet so einen passenden Winkel, Auswahl-Index 8 = 27 Grad).
  • Stufe 2 - Horizontale Mitte + GF-Ausgleich: Wenn KEIN Tabellenwinkel passt (wie im Beispiel am Kettenende: alle 12 Kandidaten ergeben eine negative VF-Laenge, die Reststrecke ist einfach zu kurz fuer einen echten Vertikalbogen), rechnet berechne-horizontale-mitte eine andere Loesung: ein HORIZONTALES VF-Stueck (winkel=0) plus eine kurze Gefaellestrecke (GF2), die exakt den fehlenden Hoehenunterschied ausgleicht. Im Beispiel: GF2=319mm, L_VF=48mm.

Die Formel dahinter ist simpel und lohnt sich zu verinnerlichen: bei einem FESTEN Neigungswinkel von 3 Grad braucht ein Hoehenausgleich von H Millimetern eine GF-Laenge von H / tan(3 Grad) ~= H * 19. Ein Hoehenrest von z.B. 17mm braucht demnach bereits ~320mm GF-Laenge - siehe Abschnitt 5.a. GF2 im Beispiel (319mm) liegt knapp unter der uebliche Mindestlaenge (400mm, *vfl-gf-min-laenge*) - deshalb die Rueckfrage im letzten Eintrag ("trotzdem mit 319mm bauen?"). "Ja" baut trotzdem exakt mit dem berechneten Wert; "Nein" wuerde den bis dahin gebauten Teil verwerfen (siehe vfl-loesche-seit/vfl-modus-abbruch-sichern).

Merksatz: Stufe 1 sucht einen "sauberen" Standard-Winkel; Stufe 2 ist der Rettungsanker, wenn dafuer schlicht nicht genug Platz ist - er tauscht einen Vertikalbogen gegen "flach + minimaler GF-Ausgleich".

5. Typische Stolperfallen

a) Gefaellestrecke (GF) ist "laengenhungrig" bei 3 Grad

3 Grad ist ein SEHR flacher Winkel. tan(3 Grad) ~= 0.0524, also braucht jeder Millimeter Hoehenunterschied ungefaehr 19mm Laenge:

Laenge = Hoehendifferenz / tan(3 Grad) ~= Hoehendifferenz * 19

Wer nur wenige mm bis cm Hoehenunterschied ausgleichen will, bekommt damit schnell GF-Laengen im halben bis ganzen Meterbereich. Das ist die haeufigste Ursache fuer "die Reststrecke ist zu kurz"-Meldungen und fuer den Stufe-2-Fallback aus Abschnitt 4. Falls eine GF partout nicht passt: entweder mehr Grundriss-Laenge einplanen, oder pruefen, ob ein Vertikalbogen (Vario-Kurve mit groesserem Winkel, siehe Stufe 1) die bessere Wahl ist.

b) Motorstation + Separator + ES-Element haben einen FESTEN Fussabdruck

Am Kettenende ist nicht die ganze gepickte Reststrecke frei verfuegbar - ein fester Anteil ist fuer Motorstation und Separator reserviert (*vfk-feste-horizontal-kettenende* = 800mm = 500mm Motorstation + 300mm Separator), und falls zusaetzlich ein ES-Element gewaehlt wird, kommt dessen eigener Fussabdruck (abhaengig von 30/90 Grad Bauform) noch oben drauf. Wer diese festen 800mm (+ ES) nicht einplant, landet schnell bei einer negativen "freien" Reststrecke - genau der Fall, der in Abschnitt 4 den Stufe-2- Fallback ausloest.

c) Seitlicher Versatz bei 90-Grad-AS/ES-Elementen ist NORMAL

Ein AS- oder ES-Element mit 90 Grad Bauform dreht die Fahrtrichtung nicht einfach "auf der Stelle" - sein Block hat eine reale Baugroesse mit einem seitlichen (quer zur Fahrtrichtung liegenden) Versatz. Sowohl im Standard- Testfall (linienzug_tests.json) als auch im Stufe-2-Testfall (linienzug_tests_stufe2.json) betraegt dieser Versatz ca. 638mm (dort als erwartung_dx_mm dokumentiert, da die Fahrtrichtung am Kettenende auf der Y-Achse liegt und sich der Versatz dadurch in X statt in Y zeigt). Das ist kein Baufehler - es ist die tatsaechliche Geometrie des 90-Grad-ES/AS-Blocks. Ein "Ist-Ziel-Report" mit einer Restabweichung von ca. 638mm quer zur letzten Fahrtrichtung, aber ~0mm in Laengs-/Hoehenrichtung, ist ein KORREKTES Ergebnis, keine Abweichung, die weiter untersucht werden muss.

6. Nachvollziehen / Nachbauen

  • Live in BricsCAD: FOERDERANLAGE -> Linienzug -> Modus 1, und die Eingaben aus der Tabelle in Abschnitt 3 der Reihe nach eintippen/klicken.
  • Automatisiert (ohne Klicks): Befehl TEST_LINIENZUG_STUFE2 (nach Laden von tests/test_linienzug.lsp) spielt exakt dieselbe Sequenz aus tests/testdata/linienzug_tests_stufe2.json ab und meldet das Ist-Ziel-Ergebnis in der Konsole.
  • Debug-Log: mit dbgopen/dem zentralen Debug-Schalter (siehe Lisp/ssg_dbg.lsp) lassen sich alle GEOMETRIE:/GEOMETRIE ERFOLG:- Zeilen in eine .dbg-Datei im Log-Verzeichnis mitschreiben - hilfreich, um genau wie in diesem Beispiel eine reale Sitzung nachtraeglich in einen Testfall zu verwandeln.