[FEAT] VF-Linienzug Modus 2+3: Segment-Gruppen-Dialoge + Highlight

Modus 2 (Pfad+Zielhoehe) und Modus 3 (Vorwaerts-Nachbau) fassen die je
Segment unmittelbar aufeinanderfolgenden Fragen (Typ + ggf. Neigung/
Vario-Winkel/Variante) in EINEM Wizard-DCL-Dialog zusammen - analog zu
Modus 1. Der Dialogkopf zeigt "Segment i/n ..."; das aktuelle Pfad-Segment
(LINE/ARC) wird vorher per redraw-Highlight in der Zeichnung hervorgehoben.

- Neue DCL-Dialoge: vflw_seg_linie_m2, vflw_seg_linie_m3, vflw_seg_bogen
- Neue Helfer: vflw-seg-*-impl (fuellen *vflw-pending*), vfl-seg-highlight,
  vfl-seg-kopf
- Modus 3 zusaetzlich: Kettenstart- und AS-Element-Gruppen-Dialog; AS-Winkel
  jetzt pending-aware ueber vfl-in-value
- Bogen-Dialog: vario-erlaubt-Flag (Modus 3 nur im offenen VF-Lauf), sonst
  wuerde die unkonsumierte Variante-Antwort ins naechste Segment lecken

Alles hinter (vfl-wizard-aktiv) - bei GUI-aus (Tests) faellt alles
unveraendert auf Konsole/Replay zurueck.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-31 16:45:06 +02:00
parent 311595822b
commit 1d19121679
4 changed files with 338 additions and 9 deletions
+1 -1
View File
@@ -119,7 +119,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
| `tro_insert.dcl` | TRO_INSERT (Tro_Edit.lsp) | | `tro_insert.dcl` | TRO_INSERT (Tro_Edit.lsp) |
| `tro_edit.dcl` | TRO_EDIT (Tro_Edit.lsp) | | `tro_edit.dcl` | TRO_EDIT (Tro_Edit.lsp) |
| `vfl_edit.dcl` | Linienzug-Editieren/Fortsetzen (vf_linienzug.lsp, `vfl-dlg-position`, aufgerufen aus `vfl-edit-ent`) | | `vfl_edit.dcl` | Linienzug-Editieren/Fortsetzen (vf_linienzug.lsp, `vfl-dlg-position`, aufgerufen aus `vfl-edit-ent`) |
| `vf_linienzug_wizard.dcl` | Linienzug Modus 1 Assistent: zwei generische Einzel-Dialoge (Zahl-Eingabe, Mehrfachauswahl; `vflw-zahl`/`vflw-wahl`, aufgerufen aus `vfl-in-real`/`vfl-in-string`/`vfl-in-int` bei aktivem `*vfl-wizard-mode*`) PLUS sieben Gruppen-Dialoge, die mehrere immer unmittelbar aufeinanderfolgende Fragen in einem Bildschirm zusammenfassen (Kettenstart, AS-Element, GF-Bogen, ES-Element, Vario-Kurve, Gefaelle festlegen, Ziel-Hoehe, Horizontales Stueck - inkl. Punktwahl-Button mit X/Y/Z-Anzeige; `vflw-gruppe-*-impl` in vf_linienzug.lsp fuellen dafuer vorab eine kleine Pending-Queue `*vflw-pending*`, die einzelnen `vfl-in-*`-Aufrufe bleiben dabei unveraendert). Details: `doc/variofoerderer.md` | | `vf_linienzug_wizard.dcl` | Linienzug-Assistent (Modus 1, 2 UND 3): zwei generische Einzel-Dialoge (Zahl-Eingabe, Mehrfachauswahl; `vflw-zahl`/`vflw-wahl`, aufgerufen aus `vfl-in-real`/`vfl-in-string`/`vfl-in-int` bei aktivem `*vfl-wizard-mode*`) PLUS sieben Gruppen-Dialoge, die mehrere immer unmittelbar aufeinanderfolgende Fragen in einem Bildschirm zusammenfassen (Kettenstart, AS-Element, GF-Bogen, ES-Element, Vario-Kurve, Gefaelle festlegen, Ziel-Hoehe, Horizontales Stueck - inkl. Punktwahl-Button mit X/Y/Z-Anzeige; `vflw-gruppe-*-impl` in vf_linienzug.lsp fuellen dafuer vorab eine kleine Pending-Queue `*vflw-pending*`, die einzelnen `vfl-in-*`-Aufrufe bleiben dabei unveraendert) PLUS drei Segment-Gruppen-Dialoge fuer die segmentweise Klassifizierung in Modus 2/3 (`vflw_seg_linie_m2` = Typ+GF-Neigung, `vflw_seg_linie_m3` = 4-fach-Typ+kontextabh. Wertfeld, `vflw_seg_bogen` = Typ+Variante; `vflw-seg-*-impl`). Beide Modi heben vor der Frage das aktuelle Pfad-Segment (LINE/ARC) per `vfl-seg-highlight` (`redraw`) in der Zeichnung hervor und zeigen "Segment i/n ..." im Dialogkopf. Details: `doc/variofoerderer.md` |
## Menue (SSG_LIB.mnu + SSG_LIB.mnl) ## Menue (SSG_LIB.mnu + SSG_LIB.mnl)
+213 -5
View File
@@ -845,6 +845,159 @@
(if mit-ende (list (itoa (1+ (atoi gende)))) nil)))))) (if mit-ende (list (itoa (1+ (atoi gende)))) nil))))))
(princ)) (princ))
;; ============================================================
;; TEIL 0b-4b: SEGMENT-GRUPPEN-DIALOGE (Modus 2 + Modus 3)
;; ============================================================
;; Modus 2 und Modus 3 gehen die Kette Segment fuer Segment durch und stellen
;; je Segment mehrere unmittelbar aufeinanderfolgende Fragen (Typ + ggf.
;; Neigung/Vario-Winkel/Variante). Diese werden - wie die uebrigen Gruppen -
;; im Wizard in EINEM Dialog erfasst und die Antworten in *vflw-pending*
;; abgelegt; die unveraenderten vfl-in-*/vfl-menu-Aufrufe im Segment-Loop
;; konsumieren sie danach der Reihe nach. Der Dialog-Kopf zeigt immer
;; "Segment i/n ..." (wie die Konsolen-Frage). Das jeweils abgefragte Segment
;; wird VOR dem Dialog per vfl-seg-highlight in der Zeichnung hervorgehoben.
;;
;; Highlight: Segment-Entity (LINE/ARC) hervorheben (redraw-Modus 3) bzw.
;; zuruecksetzen (0). ent darf nil sein (dann No-op) - der Aufrufer uebergibt
;; (car (nth i kette)) als VLA-Objekt; wir wandeln in einen Ename fuer redraw.
(defun vfl-seg-highlight (ent an / en)
(if ent
(progn
(setq en (vl-catch-all-apply 'vlax-vla-object->ename (list ent)))
(if (and en (not (vl-catch-all-error-p en)))
(redraw en (if an 3 0)))))
(princ))
;; Kopfzeile "Segment i/n: <Text>" fuer die Segment-Dialoge (i 1-basiert).
(defun vfl-seg-kopf (i n txt)
(strcat "Segment " (itoa i) "/" (itoa n) ": " txt))
;; --- Modus 2, Segment "Gerade": Typ (GF/VF) + [bei GF] Neigung ---
;; Original-Reihenfolge/-Journal im Loop: vfl-menu (Typ), dann bei GF
;; vfl-in-real (Neigung). Bei VF wird KEIN Neigungswert gefragt -> nur "2"
;; in die Pending-Queue. neigung-default: Vorbelegung Neigungsfeld (Grad).
(defun vflw-seg-linie-m2-impl (kopf-txt neigung-default / dat ergebnis gtyp gwert)
(setq dat (load_dialog (vflw-dcl-pfad)))
(if (not (new_dialog "vflw_seg_linie_m2" dat))
(if (and dat (>= dat 0)) (unload_dialog dat))
(progn
(set_tile "kopf" (vflw-clean kopf-txt))
(start_list "typ")
(add_list (vflw-clean "GF (Neigungswinkel)"))
(add_list (vflw-clean "VF (Bruecke)"))
(end_list)
(set_tile "typ" "0")
(set_tile "wert" (rtos (float neigung-default) 2 1))
;; Neigungsfeld nur bei GF (Index 0) aktiv.
(action_tile "typ"
"(mode_tile \"wert\" (if (= (get_tile \"typ\") \"0\") 0 1))")
(action_tile "accept"
"(setq gtyp (get_tile \"typ\")) (setq gwert (get_tile \"wert\")) (done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq ergebnis (start_dialog))
(unload_dialog dat)
(if (= ergebnis 1)
(if (= gtyp "0")
(vflw-pending-push-all (list "1" (atof gwert))) ; GF + Neigung
(vflw-pending-push-all (list "2")))))) ; VF (keine Neigung)
(princ))
;; --- Modus 3, Segment "Gerade": Typ (GF/VF-Ab/VF-Auf/VF-Hor) + Wert ---
;; Original-Reihenfolge/-Journal im Loop: vfl-in-string (Typ "1".."4"), dann
;; bei GF vfl-in-real (Neigung), bei VF-Ab/Auf vfl-in-int (Vario-Winkel), bei
;; VF-Hor KEINE weitere Frage. neigung-default/vario-default: Vorbelegungen.
(defun vflw-seg-linie-m3-impl (kopf-txt neigung-default vario-default /
dat ergebnis gtyp gwert)
(setq dat (load_dialog (vflw-dcl-pfad)))
(if (not (new_dialog "vflw_seg_linie_m3" dat))
(if (and dat (>= dat 0)) (unload_dialog dat))
(progn
(set_tile "kopf" (vflw-clean kopf-txt))
(start_list "typ")
(add_list (vflw-clean "GF (Neigungswinkel)"))
(add_list (vflw-clean "VF-Ab"))
(add_list (vflw-clean "VF-Auf"))
(add_list (vflw-clean "VF-Horizontal"))
(end_list)
(set_tile "typ" "0")
(set_tile "wlabel" "GF-Neigung (Grad):")
(set_tile "wert" (rtos (float neigung-default) 2 1))
;; Feld/Beschriftung schaltet mit dem Typ um: GF->Neigung, VF-Ab/Auf->
;; Vario-Winkel, VF-Hor->deaktiviert. Werte-Defaults liegen als lokale
;; Variablen vor und werden im Callback (dynamic scope) gelesen.
(action_tile "typ"
"(cond
((= (get_tile \"typ\") \"0\")
(set_tile \"wlabel\" \"GF-Neigung (Grad):\")
(set_tile \"wert\" (rtos (float neigung-default) 2 1))
(mode_tile \"wert\" 0))
((= (get_tile \"typ\") \"3\")
(set_tile \"wlabel\" \"(kein Wert)\")
(mode_tile \"wert\" 1))
(t
(set_tile \"wlabel\" \"Vario-Winkel (Grad):\")
(set_tile \"wert\" (rtos (float vario-default) 2 1))
(mode_tile \"wert\" 0)))")
(action_tile "accept"
"(setq gtyp (get_tile \"typ\")) (setq gwert (get_tile \"wert\")) (done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq ergebnis (start_dialog))
(unload_dialog dat)
(if (= ergebnis 1)
(cond
;; typ 0 = GF -> "1" + Neigung(real)
((= gtyp "0") (vflw-pending-push-all (list "1" (atof gwert))))
;; typ 1 = VF-Ab -> "2" + Vario-Winkel(int)
((= gtyp "1") (vflw-pending-push-all (list "2" (fix (atof gwert)))))
;; typ 2 = VF-Auf -> "3" + Vario-Winkel(int)
((= gtyp "2") (vflw-pending-push-all (list "3" (fix (atof gwert)))))
;; typ 3 = VF-Hor -> "4" (kein Wert)
(t (vflw-pending-push-all (list "4")))))))
(princ))
;; --- Segment "Eck/Bogen" (Modus 2 + Modus 3): Typ + [bei Vario] Variante ---
;; Original-Reihenfolge/-Journal: vfl-in-string/vfl-menu (Typ "1"/"2"), dann
;; bei Vario-Kurve vfl-in-string/vfl-menu (Variante "1"/"2"). Bei GF-Bogen
;; wird KEINE Variante gefragt -> nur "1" in die Pending-Queue.
;; vario-erlaubt: T, wenn Vario-Kurve hier zulaessig ist (Modus 2 immer T;
;; Modus 3 nur im offenen VF-Lauf - sonst konsumiert der Aufrufer die
;; Variante-Antwort nicht und sie wuerde ins naechste Segment lecken). Bei
;; nil wird die Vario-Kurve-Option deaktiviert und bei versehentlicher Wahl
;; als GF-Bogen ("1") behandelt (der Aufrufer weist Vario dort ohnehin ab).
(defun vflw-seg-bogen-impl (kopf-txt vario-erlaubt / dat ergebnis gtyp gvariante)
(setq dat (load_dialog (vflw-dcl-pfad)))
(if (not (new_dialog "vflw_seg_bogen" dat))
(if (and dat (>= dat 0)) (unload_dialog dat))
(progn
(set_tile "kopf" (vflw-clean kopf-txt))
(start_list "typ")
(add_list (vflw-clean "GF-Bogen"))
(add_list (vflw-clean (if vario-erlaubt "Vario-Kurve" "Vario-Kurve (nur im VF-Lauf)")))
(end_list)
(set_tile "typ" "0")
(start_list "variante")
(add_list (vflw-clean (ssg-text "vfl-variante-aussen")))
(add_list (vflw-clean (ssg-text "vfl-variante-innen")))
(end_list)
(set_tile "variante" "0")
(mode_tile "variante" 1) ; Variante erst bei Vario-Kurve aktiv
;; Variante-Feld nur aktivieren, wenn Vario gewaehlt UND erlaubt.
(if vario-erlaubt
(action_tile "typ"
"(mode_tile \"variante\" (if (= (get_tile \"typ\") \"1\") 0 1))"))
(action_tile "accept"
"(setq gtyp (get_tile \"typ\")) (setq gvariante (get_tile \"variante\")) (done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq ergebnis (start_dialog))
(unload_dialog dat)
(if (= ergebnis 1)
(if (and (= gtyp "1") vario-erlaubt)
;; Vario-Kurve: "2" + Variante ("1"=aussen / "2"=innen; Index+1)
(vflw-pending-push-all (list "2" (itoa (1+ (atoi gvariante)))))
;; GF-Bogen (oder Vario unzulaessig): "1" (keine Variante)
(vflw-pending-push-all (list "1"))))))
(princ))
;; ============================================================ ;; ============================================================
;; TEIL 0b-3: GRUPPEN-DIALOGE (PENDING-QUEUE) ;; TEIL 0b-3: GRUPPEN-DIALOGE (PENDING-QUEUE)
;; ============================================================ ;; ============================================================
@@ -4369,7 +4522,7 @@
best) best)
(defun vf-linienzug-modus3 ( / ss obj-liste startpunkt start-hoehe as-seite (defun vf-linienzug-modus3 ( / ss obj-liste startpunkt start-hoehe as-seite
es-seite kette segmente n i seg typ hz laenge es-seite kette segmente n i seg seg-ent typ hz laenge
bwinkel bseite frame antwort winkel deltaL bwinkel bseite frame antwort winkel deltaL
anzahl-gf anzahl-vf vfl-nummer lastEnt hoehe-bis anzahl-gf anzahl-vf vfl-nummer lastEnt hoehe-bis
ecke-bad first-line last-line letzt-winkel ecke-bad first-line last-line letzt-winkel
@@ -4417,16 +4570,32 @@
(setq obj-liste (mapcar 'vlax-ename->vla-object ss)) (setq obj-liste (mapcar 'vlax-ename->vla-object ss))
;; --- 2. Startpunkt (hoehere Seite) + Hoehe + AS-Seite --- ;; --- 2. Startpunkt (hoehere Seite) + Hoehe + AS-Seite ---
;; Wizard: Startpunkt+Hoehe als EIN Gruppen-Dialog (analog Modus 2). Die
;; unveraenderten vfl-in-point/vfl-in-real-Aufrufe konsumieren die Antworten
;; danach aus *vflw-pending*.
(if (vfl-wizard-aktiv)
(vl-catch-all-apply 'vflw-gruppe-punkt-hoehe-impl
(list "vfl-m3-prompt-startpunkt" "Starthoehe (Z, mm):")))
(setq startpunkt (vfl-in-point nil (ssg-text "vfl-m3-prompt-startpunkt"))) (setq startpunkt (vfl-in-point nil (ssg-text "vfl-m3-prompt-startpunkt")))
(if (null startpunkt) (progn (princ (ssg-text "vfl-abgebrochen")) (exit))) (if (null startpunkt) (progn (princ (ssg-text "vfl-abgebrochen")) (exit)))
(setq start-hoehe (vfl-in-real (ssg-textf "vfl-prompt-hoehe-startpunkt" (setq start-hoehe (vfl-in-real (ssg-textf "vfl-prompt-hoehe-startpunkt"
(list (rtos (caddr startpunkt) 2 1))))) (list (rtos (caddr startpunkt) 2 1)))))
(if (null start-hoehe) (setq start-hoehe (caddr startpunkt))) (if (null start-hoehe) (setq start-hoehe (caddr startpunkt)))
(setq startpunkt (list (car startpunkt) (cadr startpunkt) start-hoehe)) (setq startpunkt (list (car startpunkt) (cadr startpunkt) start-hoehe))
;; vf-frage-element-winkel ruft direkt getstring/vflw-wahl auf (kein ;; AS-Element (in Modus 3 immer gesetzt): Winkel(30/90) + Seite als EIN
;; vfl-in-*-Wrapper darin) - manuell mitloggen, sonst wuerde diese eine ;; Gruppen-Dialog. vflw-gruppe-winkel-seite-impl legt Winkel ("90"/"30")
;; Eingabe durchrutschen. ;; und Seite ("1"/"2") in *vflw-pending* ab - genau die Reihenfolge, die
(setq *vfl-as-winkel* (vf-frage-element-winkel "vf-winkel-aus-header")) ; 30/90 vor Seite ;; die beiden Reads unten erwarten. AS-Winkel ueber vfl-in-value (pending-
;; aware; vf-frage-element-winkel selbst ist es NICHT), damit der vom Dialog
;; abgelegte Wert konsumiert wird statt live erneut zu fragen.
(if (vfl-wizard-aktiv)
(vl-catch-all-apply 'vflw-gruppe-winkel-seite-impl
(list "vf-winkel-aus-header"
(list (ssg-text "vf-winkel-90") (ssg-text "vf-winkel-30"))
(list "90" "30"))))
(setq *vfl-as-winkel*
(vfl-in-value "STR"
(function (lambda () (vf-frage-element-winkel "vf-winkel-aus-header"))))) ; 30/90 vor Seite
(if dbg-an (progn (dbgmsg "AS-Winkel:") (dbg '*vfl-as-winkel*) (dbgflush))) (if dbg-an (progn (dbgmsg "AS-Winkel:") (dbg '*vfl-as-winkel*) (dbgflush)))
(princ (ssg-text "vfl-vwnb-aus-seite-menu")) (princ (ssg-text "vfl-vwnb-aus-seite-menu"))
(setq as-seite (if (= (vfl-in-string (ssg-text "prompt-wahl-1-2")) "2") "rechts" "links")) (setq as-seite (if (= (vfl-in-string (ssg-text "prompt-wahl-1-2")) "2") "rechts" "links"))
@@ -4478,6 +4647,26 @@
(setq i 0) (setq i 0)
(while (< i n) (while (< i n)
(setq seg (nth i segmente) typ (car seg) hz (cadr seg)) (setq seg (nth i segmente) typ (car seg) hz (cadr seg))
(setq seg-ent (car (nth i kette))) ; echte LINE/ARC-Entity dieses Segments
;; Wizard: alle Fragen dieses Segments in EINEM Dialog erfassen (die
;; unveraenderten vfl-in-*-Aufrufe unten konsumieren die Antworten aus
;; *vflw-pending*). Segment vorher in der Zeichnung hervorheben. Bei einem
;; Bogen ist Vario-Kurve nur im offenen VF-Lauf erlaubt - deshalb die
;; Variante-Antwort nur mitschicken, wenn run-typ="VF" (sonst konsumiert
;; der Aufrufer sie nicht und sie wuerde ins naechste Segment lecken).
(if (vfl-wizard-aktiv)
(progn
(vfl-seg-highlight seg-ent T)
(if (= typ "Linie")
(vflw-seg-linie-m3-impl
(vfl-seg-kopf (1+ i) n
(strcat "Gerade L=" (rtos (caddr seg) 2 0) " mm hz=" (rtos hz 2 1)))
*vfk-gefaelle-winkel* 3)
(vflw-seg-bogen-impl
(vfl-seg-kopf (1+ i) n
(strcat "Eck/Bogen " (itoa (nth 3 seg)) " Grad " (nth 4 seg)))
(= run-typ "VF"))) ; Modus 3: Vario nur im offenen VF-Lauf
(vfl-seg-highlight seg-ent nil)))
(cond (cond
;; ===================== GERADE ===================== ;; ===================== GERADE =====================
((= typ "Linie") ((= typ "Linie")
@@ -4806,6 +4995,7 @@
(defun vf-linienzug-modus2 ( / ss k obj-liste startpunkt start-hoehe as-seite (defun vf-linienzug-modus2 ( / ss k obj-liste startpunkt start-hoehe as-seite
endpunkt end-hoehe es-seite kette segmente n i seg endpunkt end-hoehe es-seite kette segmente n i seg
seg-ent
typ hz laenge bwinkel bseite antwort winkel klass typ hz laenge bwinkel bseite antwort winkel klass
plan e ecke-bad vf-start vf-ende dz z-front plan e ecke-bad vf-start vf-ende dz z-front
z-junction dH-bruecke span-bruecke dH-gesamt z-junction dH-bruecke span-bruecke dH-gesamt
@@ -4952,6 +5142,24 @@
(setq n (length segmente) i 0 plan '()) (setq n (length segmente) i 0 plan '())
(while (< i n) (while (< i n)
(setq seg (nth i segmente) typ (car seg) hz (cadr seg) laenge (caddr seg)) (setq seg (nth i segmente) typ (car seg) hz (cadr seg) laenge (caddr seg))
(setq seg-ent (car (nth i kette))) ; echte LINE/ARC-Entity dieses Segments
;; Wizard: alle Fragen dieses Segments in EINEM Dialog erfassen (die
;; unveraenderten vfl-menu/vfl-in-*-Aufrufe unten konsumieren die Antworten
;; aus *vflw-pending*). Segment vorher in der Zeichnung hervorheben. Der
;; nach-kurve-Fall stellt keine Frage (auto-VF) -> kein Dialog.
(if (and (vfl-wizard-aktiv) (not (and (= typ "Linie") nach-kurve)))
(progn
(vfl-seg-highlight seg-ent T)
(if (= typ "Linie")
(vflw-seg-linie-m2-impl
(vfl-seg-kopf (1+ i) n
(strcat "Gerade L=" (rtos laenge 2 0) " mm hz=" (rtos hz 2 1)))
*vfk-gefaelle-winkel*)
(vflw-seg-bogen-impl
(vfl-seg-kopf (1+ i) n
(strcat "Eck/Bogen " (itoa (nth 3 seg)) " Grad " (nth 4 seg)))
T)) ; Modus 2: Vario-Kurve immer erlaubt
(vfl-seg-highlight seg-ent nil)))
(cond (cond
((= typ "Linie") ((= typ "Linie")
(princ (ssg-textf "vfl-m3-seg-gerade" (princ (ssg-textf "vfl-m3-seg-gerade"
+98
View File
@@ -266,3 +266,101 @@ vflw_horizontal : dialog {
ok_cancel; ok_cancel;
} }
// ============================================================
// SEGMENT-GRUPPEN-DIALOGE (Modus 2 + Modus 3) - fassen die pro Segment
// aufeinanderfolgenden Fragen in EINEM Bildschirm zusammen. "kopf" zeigt
// dabei immer "Segment i/n ..." (wie die Konsolen-Frage), das jeweils
// abgefragte Segment ist zusaetzlich in der Zeichnung hervorgehoben
// (redraw-Highlight, gesetzt von vfl-seg-highlight in vf_linienzug.lsp VOR
// dem Oeffnen des Dialogs). Aufgerufen aus den vflw-seg-*-impl-Funktionen.
// ============================================================
// Modus 2, Segment "Gerade": Typ (GF/VF) + [nur bei GF aktiv] GF-Neigung.
// Das Neigungsfeld wird per action_tile auf "typ" aktiviert/deaktiviert.
vflw_seg_linie_m2 : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: popup_list {
key = "typ";
label = "Typ:";
width = 40;
}
: text {
key = "wlabel";
label = "GF-Neigung (Grad):";
}
: edit_box {
key = "wert";
label = "";
edit_width = 10;
}
}
ok_cancel;
}
// Modus 3, Segment "Gerade": Typ (GF / VF-Ab / VF-Auf / VF-Horizontal) + EIN
// Wertfeld, dessen Beschriftung mit dem Typ umschaltet (GF -> Neigung,
// VF-Ab/Auf -> Vario-Winkel, VF-Horizontal -> Feld deaktiviert). Umschaltung
// per action_tile auf "typ" (siehe vflw-seg-linie-m3-impl).
vflw_seg_linie_m3 : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: popup_list {
key = "typ";
label = "Typ:";
width = 45;
}
: text {
key = "wlabel";
label = "";
}
: edit_box {
key = "wert";
label = "";
edit_width = 10;
}
}
ok_cancel;
}
// Segment "Eck/Bogen" (Modus 2 + Modus 3 identisch): Typ (GF-Bogen /
// Vario-Kurve) + [nur bei Vario-Kurve aktiv] Variante (aussen/innen). Die
// Variante-Liste wird per action_tile auf "typ" aktiviert/deaktiviert.
vflw_seg_bogen : dialog {
label = "VarioFoerderer Assistent";
: column {
: text {
key = "kopf";
label = "";
width = 60;
}
: popup_list {
key = "typ";
label = "Typ:";
width = 40;
}
: popup_list {
key = "variante";
label = "Variante:";
width = 30;
}
}
ok_cancel;
}
+26 -3
View File
@@ -57,14 +57,34 @@ sichtbar und der naechste Punkt treffsicher anwaehlbar ist. Aendert nur die
Ansicht, nicht das aktive BKS; rein kosmetisch und per `vl-catch-all-apply` Ansicht, nicht das aktive BKS; rein kosmetisch und per `vl-catch-all-apply`
abgesichert. abgesichert.
Nicht umgestellt (bleiben bewusst reine Konsole, siehe Abschnitt 6): Modus 3 Modus 2 (Pfad+Zielhoehe-Solver) UND Modus 3 (Vorwaerts-Nachbau) sind
(Vorwaerts-Nachbau, Legacy - im Code selbst als "wird umgebaut" markiert, inzwischen ebenfalls auf Wizard-Dialoge umgestellt: beide gehen die Kette
Aufwand fuer bald ersetzten Code waere nicht sinnvoll) sowie die Segment fuer Segment durch und fassen die je Segment unmittelbar
aufeinanderfolgenden Fragen (Typ + ggf. Neigung/Vario-Winkel/Variante) in
EINEM Segment-Gruppen-Dialog zusammen (siehe Tabelle unten und Abschnitt
"Segment-Highlight"). Modus 3 nutzt zusaetzlich Kettenstart- und AS-Element-
Gruppen-Dialoge (Startpunkt+Hoehe bzw. AS-Winkel+Seite). Nur der Modus-3-Bau
selbst bleibt intern Konsolen-getrieben (die vfl-in-*-Wrapper konsumieren die
Dialog-Antworten aus `*vflw-pending*`). Weiterhin reine Konsole: die
Gefaellestrecke-Konsolenmodi 2/3. Punktwahl (`getpoint`) bleibt ausserhalb Gefaellestrecke-Konsolenmodi 2/3. Punktwahl (`getpoint`) bleibt ausserhalb
von Gruppen-Dialogen unveraendert Konsole/Zeichnung - eine Maus-Punktauswahl von Gruppen-Dialogen unveraendert Konsole/Zeichnung - eine Maus-Punktauswahl
braucht keinen eigenen Dialog, das BricsCAD-Prompt an der Eingabezeile braucht keinen eigenen Dialog, das BricsCAD-Prompt an der Eingabezeile
leistet bereits die vom Nutzer gewuenschte "Punkt waehlen"-Statusmeldung. leistet bereits die vom Nutzer gewuenschte "Punkt waehlen"-Statusmeldung.
### Segment-Highlight (Modus 2 + 3)
Vor jedem Segment-Gruppen-Dialog wird die zugehoerige Pfad-Entity (LINE/ARC)
in der Zeichnung per `(redraw ename 3)` hervorgehoben und danach per
`(redraw ename 0)` zurueckgesetzt (`vfl-seg-highlight` in `vf_linienzug.lsp`).
Die Zuordnung ist direkt: `segmente[i]` (aus `gf-analysiere-kette`) und
`kette[i]` (aus `gf-sortiere-objekte`) sind 1:1 in gleicher Reihenfolge, die
Entity ist `(car (nth i kette))` als VLA-Objekt (via `vlax-vla-object->ename`
in einen Ename gewandelt). Der Dialog-Kopf zeigt zusaetzlich immer
"Segment i/n ..." (wie die Konsolen-Frage), sodass der Nutzer sieht, zu
welchem Segment die Frage gehoert. Nur aktiv bei echtem Wizard-Live-Lauf
(`vfl-wizard-aktiv`); bei abgeschalteter GUI (Tests) faellt alles auf den
Konsolen-/Replay-Pfad zurueck (kein Highlight, keine Dialoge).
### Gruppen-Dialoge (mehrere Fragen in einem Bildschirm) ### Gruppen-Dialoge (mehrere Fragen in einem Bildschirm)
Fragen, die im Ablauf IMMER unmittelbar hintereinander kommen (kein Fragen, die im Ablauf IMMER unmittelbar hintereinander kommen (kein
@@ -83,6 +103,9 @@ Gruppen-Dialoge PLUS die beiden generischen Einzel-Dialoge (siehe
| Gefaelle festlegen | Modus(Hoehe/Winkel) + EIN Wertfeld (Beschriftung wechselt mit dem Modus) | Teil von Block 36 | | Gefaelle festlegen | Modus(Hoehe/Winkel) + EIN Wertfeld (Beschriftung wechselt mit dem Modus) | Teil von Block 36 |
| Ziel-Hoehe | Zielhoehe (generischer `vflw_zahl`-Dialog, an 4 Aufrufstellen wiederverwendet: Block 36 GF-Wechsel, 37, 41/vfl-body-abschluss, 42) | Je 1 Screen | | Ziel-Hoehe | Zielhoehe (generischer `vflw_zahl`-Dialog, an 4 Aufrufstellen wiederverwendet: Block 36 GF-Wechsel, 37, 41/vfl-body-abschluss, 42) | Je 1 Screen |
| Horizontales Stueck | Separator VOR + Separator NACH + Foerderer-Ende (3 Optionen) | Teil von Block 38 | | Horizontales Stueck | Separator VOR + Separator NACH + Foerderer-Ende (3 Optionen) | Teil von Block 38 |
| Segment Gerade (Modus 2) | Typ (GF/VF) + GF-Neigung (nur bei GF aktiv) | 2 Konsolen-Fragen/Segment (`vflw_seg_linie_m2`) |
| Segment Gerade (Modus 3) | Typ (GF/VF-Ab/VF-Auf/VF-Hor) + kontextabh. Wertfeld (GF-Neigung / Vario-Winkel / bei Hor deaktiviert) | 2 Konsolen-Fragen/Segment (`vflw_seg_linie_m3`) |
| Segment Eck/Bogen (Modus 2+3) | Typ (GF-Bogen/Vario-Kurve) + Variante (nur bei Vario-Kurve aktiv; in Modus 3 nur im offenen VF-Lauf) | 2 Konsolen-Fragen/Segment (`vflw_seg_bogen`) |
**Punktwahl-Button nur bei "Kettenstart"** (bzw. bei Modus 2s Start-/ **Punktwahl-Button nur bei "Kettenstart"** (bzw. bei Modus 2s Start-/
Endpunkt): `(getpoint)` direkt aus einem offenen `action_tile`-Callback Endpunkt): `(getpoint)` direkt aus einem offenen `action_tile`-Callback