feat: Linienzug Modus 1 kann rueckwaerts bauen (ES als exakter Anker)

Bisher war der geklickte Punkt immer der KettenANFANG. Oft steht aber das
andere Ende fest - typisch der Anschluss an einen Kreisel. Modus 1 fragt
deshalb jetzt ganz am Anfang nach der Bau-Richtung:
  vorwaerts  = geklickter Punkt ist der Kettenanfang (alles wie bisher)
  rueckwaerts= er ist das Kettenende, genauer das KS_AUS des ES-Elements

ABLAUF RUECKWAERTS
ES setzen? + Winkel + Seite + Fahrtrichtung (2. Punkt) in EINEM Dialog, dann
"Neue Linie: GF" und die Laengenfrage mit drei Optionen:
  1 Kettenanfang klicken  -> + Neigungswinkel, Anfangshoehe wird gerechnet
  2 Anfangshoehe vorgeben -> + Neigungswinkel, Laenge wird gerechnet
  3 Parallel zum Kreisel  -> nur Abstand (nur mit ES waehlbar)
Danach ist die Kette fertig. Die Spiegelfrage "Ist das der Kettenanfang?"
mit optionalem AS und Weiterbauen ist bewusst NICHT enthalten (Nutzer-
Entscheidung: vorerst kleiner Umfang).

ANKER
Das ES wird mit insert-block-mixed-to-ks und xy-ref/z-ref="KS_AUS" EXAKT auf
den geklickten Punkt gesetzt; alles Weitere wird daraus zurueckgerechnet
(vfl-rueck-punkt) und dann normal vorwaerts platziert. Gleiches Ergebnis,
aber mit den erprobten Einfuege-Primitiven. Eine Rest-Ungenauigkeit landet
am Kettenanfang statt am Kreisel-Anschluss.

Option 3 spiegelt die Vorwaerts-Variante: Bogenseite = Gegenseite der
ES-Seite, Bogenwinkel hebt den gemessenen ES-Schwenk auf. Dafuer werden die
bereits getesteten Kerne vfl-par-bogen-waehlen/vfl-par-gf-laenge
wiederverwendet - die Zuordnung (ES 30 links -> 30-Grad-Bogen rechts usw.)
faellt daraus heraus, statt gepflegt zu werden.

ZWEI FEHLER, DIE DER ERSTE BRICSCAD-TEST GEFUNDEN HAT
1. vflw-gruppe-as-impl legt VIER Werte in die Pending-Queue (ja/nein,
   Winkel, Seite, Punkt). Die Ja/Nein-Antwort wurde nicht konsumiert, alles
   rutschte eine Position weiter - der Winkel bekam die "1" der Ja/Nein-
   Frage, Blockname "ES_Element_1_links". Die Frage wird jetzt gestellt und
   ausgewertet; "Nein" ist dabei sinnvoll belegt (Kette endet direkt am
   geklickten Punkt, Richtung ueber vfl-frage-fahrtrichtung-p2).
2. insert-block-ks-to-ks richtet immer den EINGANG eines Blocks aus.
   Rueckwaerts sitzt der Bogen VOR dem GF-Stueck, sein AUSGANG muss also auf
   der GF-Achse liegen - der Eingang ist um den Bogenschwenk vorzudrehen
   (hz-bogen = hz-ein - bogen-turn). Ohne das zeigte der Ausgang um genau den
   Bogenwinkel daneben, KS_AUS und KS_EIN trafen sich nicht. Gilt fuer den
   Probe-Bau UND das echte Einfuegen - waere nur eins gedreht, saesse der
   Bogen richtig orientiert an der falschen Stelle.

BEDIENUNG
- Kurze Entscheidungen im Rueckwaerts-Ablauf als Radio-Buttons statt
  Auswahlliste (vfl-menu-radio).
- Beim Klick auf den Kettenanfang haengt der Cursor auf der Kettenachse
  (neuer Wrapper vfl-in-point-achse ueber das vorhandene
  vfl-getpoint-achse): ab dort kann nur noch entlang dieser Achse gebaut
  werden, ein frei schwenkendes Gummiband gaukelte eine Freiheit vor.
- Zahlen-Dialoge belegen ihr Feld jetzt mit der Vorgabe vor. Die Prompts
  tragen sie ohnehin in Klammern ("[3]", "<2154.0>"), der Dialog hat sie nur
  ignoriert - bewusst generisch geloest (vflw-vorgabe-aus-prompt), die
  Luecke hatten alle Zahlen-Dialoge des Assistenten.
- vflw_as beschriftet Seite und Achse neutral, weil derselbe Dialog jetzt
  AS (vorwaerts) und ES (rueckwaerts) bedient; die Punkt-Anzeige heisst beim
  ES "Endpunkt".

ABWAERTSKOMPATIBILITAET
Die Richtungsfrage steht VOR der AS-Frage und journalisiert ihren WERT
("vor"/"rueck") statt eines Index - ein Index "1"/"2" waere von der
nachfolgenden AS-Ja/Nein-Antwort nicht zu unterscheiden. Fehlt der Eintrag,
ist es ein Alt-Journal und es wird vorwaerts gebaut. Dafuer der neue Wrapper
vfl-menu-strwert.

TESTS
12 neue file- und zeichnungsfreie Unit-Tests: vfl-rueck-punkt (Rundlauf
vorwaerts/rueckwaerts) und vflw-vorgabe-aus-prompt (gegen die echten
Prompt-Texte, inkl. der Stolperstellen "0 < Winkel <= 3" ohne schliessendes
">" und dem Nachsatz in runden Klammern). TEST_UNIT konnte noch nicht
laufen - BricsCAD war die ganze Sitzung geoeffnet. Der Rueckwaerts-Bau
selbst ist vom Nutzer in BricsCAD geprueft und bestaetigt.

SSG_LIB.cui ist das von BricsCAD neu erzeugte Kompilat zur Menue-Aenderung
des vorigen Commits.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-22 13:41:09 +02:00
parent e1e5fbf0c1
commit fb567949be
6 changed files with 528 additions and 7 deletions
+41
View File
@@ -449,6 +449,47 @@
(< (vfl-par-gf-laenge 100.0 200.0 300.0 1.0) 0.0))
;; AS schwenkt gar nicht aus der Achse -> keine Loesung
(tu-nil "vfl-par-laenge/kein-versatz" (vfl-par-gf-laenge 2000.0 0.0 0.0 0.0))
;; --- Vorgabewert aus einem Prompt ziehen (Dialog-Feld vorbelegen) ---
;; Die Konsolen-Prompts tragen ihre Vorgabe in Klammern; der Zahlen-Dialog
;; liest sie daraus. Gesucht ist die LETZTE Klammergruppe MIT Zahl - die
;; echten Texte enthalten davor "<" ohne Partner ("0 < Winkel <= 3") und
;; runde Klammern mit Fliesstext, beides darf nicht stoeren.
(tu-eq "vflw-vorgabe/neigungswinkel" "3"
(vflw-vorgabe-aus-prompt "\nNeigungswinkel (Grad, 0 < Winkel <= 3) [3]: "))
(tu-eq "vflw-vorgabe/neigungswinkel-berechnet" "3"
(vflw-vorgabe-aus-prompt
"\nNeigungswinkel (Grad, 0 < Winkel <= 3) [3] (deltaL wird berechnet und eingefuegt): "))
(tu-eq "vflw-vorgabe/spitze-klammer" "2154.0"
(vflw-vorgabe-aus-prompt "\nGewuenschte Hoehe am Kettenanfang (mm) <2154.0>: "))
(tu-eq "vflw-vorgabe/negativ" "-12.5"
(vflw-vorgabe-aus-prompt "Hoehendifferenz <-12.5>: "))
;; Ohne Klammergruppe bleibt das Feld leer (nil), nicht geraten.
(tu-nil "vflw-vorgabe/ohne-vorgabe"
(vflw-vorgabe-aus-prompt "\nAbstand zum Kreisel (mm, senkrecht zur Achse): "))
(tu-nil "vflw-vorgabe/keine-zahl"
(vflw-vorgabe-aus-prompt "Bitte Namen eingeben [frei]: "))
;; --- Rueckwaerts bauen: Punkt entgegen der Fahrtrichtung zuruecksetzen ---
;; vfl-rueck-punkt ist der Rechenkern des Rueckwaerts-Baus: zu einem
;; BEKANNTEN Endpunkt den Startpunkt eines Bausteins finden. Vorwaerts gilt
;; P_next = P + (L*cos hz, L*sin hz, -L*tan w) - hier also mit umgekehrtem
;; Vorzeichen. Die Hoehe muss STEIGEN (der Vorgaenger liegt hoeher).
(tu-eqf "vfl-rueck-punkt/ost-flach"
(list 0.0 0.0 0.0) (vfl-rueck-punkt '(1000.0 0.0 0.0) 0.0 1000.0 0.0))
(tu-eqf "vfl-rueck-punkt/nord-flach"
(list 0.0 0.0 0.0) (vfl-rueck-punkt '(0.0 1000.0 0.0) 90.0 1000.0 0.0))
;; 45 Grad Gefaelle: 1000 mm horizontal zurueck = 1000 mm hoeher
(tu-eqf "vfl-rueck-punkt/45-grad"
(list 0.0 0.0 1000.0) (vfl-rueck-punkt '(1000.0 0.0 0.0) 0.0 1000.0 45.0))
;; Rundlauf: vorwaerts wieder auf den Ausgangspunkt (3 Grad, schraeg)
(setq _l (vfl-rueck-punkt '(5000.0 3000.0 1800.0) 30.0 2000.0 3.0))
(tu-eqf "vfl-rueck-punkt/rundlauf-x" 5000.0
(+ (car _l) (* 2000.0 (cos (/ (* 30.0 pi) 180.0)))))
(tu-eqf "vfl-rueck-punkt/rundlauf-y" 3000.0
(+ (cadr _l) (* 2000.0 (sin (/ (* 30.0 pi) 180.0)))))
(tu-eqf "vfl-rueck-punkt/rundlauf-z" 1800.0
(- (caddr _l) (* 2000.0 (/ (sin (/ (* 3.0 pi) 180.0)) (cos (/ (* 3.0 pi) 180.0))))))
)