diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index 162b30b..b0fe4e3 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -714,12 +714,150 @@ prev-hz ) +;; Dialog fuer Modus 3 (Linienzug), Teil 1: AUS-/EIN-Element Winkel+Seite - +;; ersetzt die vier Konsolenfragen (AUS-Winkel, AUS-Seite, EIN-Winkel, +;; EIN-Seite). Muss VOR der Segmentlaengen-Anpassung/Winkelberechnung +;; laufen (die braucht aus-dx/ein-dx aus vf-set-as-masse/-es-masse), darum +;; eigener, frueherer Dialog statt zusammen mit dem Winkel-Vorschlag. +;; Rueckgabe: (as-winkel as-seite es-winkel es-seite) bei OK, 'ABBRUCH wenn +;; der Nutzer bewusst abbricht (Aufrufer bricht dann den GANZEN Befehl ab, +;; KEIN Rueckfall auf die Konsole), nil wenn der Dialog gar nicht gezeigt +;; werden konnte/durfte (GUI aus) - NUR dann Konsolen-Rueckfall. +(defun gf-dialog-linienzug-aus-ein ( / dcl-pfad dat ergebnis + dlg-aus-winkel dlg-aus dlg-ein-winkel dlg-ein + as-seite es-seite as-winkel es-winkel) + (if (or (not (car (atoms-family 1 '("SSG-GUI-P")))) (ssg-gui-p)) + (progn + (setq dcl-pfad (strcat (getenv "DXFM_DCL") "/gefaellestrecke.dcl")) + (setq dat (load_dialog dcl-pfad)) + (if (not (new_dialog "gefaellestrecke_linienzug" dat)) + (progn (if (and dat (>= dat 0)) (unload_dialog dat)) nil) + (progn + (set_tile "zusammenfassung" (ssg-text "gf-dlg-linienzug-vorlauf")) + (mode_tile "winkel" 1) + + (start_list "aus_winkel") + (add_list "90") + (add_list "30") + (end_list) + (set_tile "aus_winkel" "0") + (start_list "aus_seite") + (add_list (ssg-text "gf-dlg-links")) + (add_list (ssg-text "gf-dlg-rechts")) + (end_list) + (set_tile "aus_seite" "0") + + (start_list "ein_winkel") + (add_list "90") + (add_list "30") + (end_list) + (set_tile "ein_winkel" "0") + (start_list "ein_seite") + (add_list (ssg-text "gf-dlg-links")) + (add_list (ssg-text "gf-dlg-rechts")) + (end_list) + (set_tile "ein_seite" "0") + + (action_tile "accept" + (strcat + "(setq dlg-aus-winkel (get_tile \"aus_winkel\"))" + "(setq dlg-aus (get_tile \"aus_seite\"))" + "(setq dlg-ein-winkel (get_tile \"ein_winkel\"))" + "(setq dlg-ein (get_tile \"ein_seite\"))" + "(done_dialog 1)" + ) + ) + (action_tile "cancel" "(done_dialog 0)") + (setq ergebnis (start_dialog)) + (unload_dialog dat) + + (cond + ((= ergebnis 1) + (setq as-winkel (if (= dlg-aus-winkel "1") "30" "90")) + (setq as-seite (if (= dlg-aus "1") "rechts" "links")) + (setq es-winkel (if (= dlg-ein-winkel "1") "30" "90")) + (setq es-seite (if (= dlg-ein "1") "rechts" "links")) + (list as-winkel as-seite es-winkel es-seite) + ) + (t 'ABBRUCH) + ) + ) + ) + ) + nil + ) +) + +;; Dialog fuer Modus 3, Teil 2: Gefaellewinkel-Bestaetigung VOR der +;; iterativen AS/ES-Korrekturschleife (die braucht den vom Nutzer +;; gewaehlten/bestaetigten Ausgangswinkel, berechnet selbst aber nicht +;; interaktiv weiter) - ersetzt die "Berechneten Winkel verwenden?"-Frage +;; samt optionalem manuellem Winkel. Ersetzt zugleich die SPAETERE finale +;; Einfuegen-Bestaetigung: nach diesem OK baut der Aufrufer direkt, ohne +;; weitere Rueckfrage (analog "dialog-bestaetigt" bei Modus 1/2) - die +;; Zusammenfassung mit dem Vorschlag genuegt als Entscheidungsgrundlage, +;; eine zweite Bestaetigung NACH der (rein automatischen) Korrekturschleife +;; waere redundant. Das AS/ES-Auswahlpaar wird hier nur noch ANGEZEIGT +;; (disabled), nicht erneut editierbar - es ist schon in die Segmentlaengen +;; eingerechnet. +;; zusammenfassung-zeilen: Liste bereits fertig formatierter Strings. +;; Rueckgabe: Gefaellewinkel (Grad) bei OK, 'ABBRUCH wenn der Nutzer bewusst +;; abbricht (Aufrufer bricht dann den GANZEN Befehl ab, KEIN Rueckfall auf +;; die Konsole), nil wenn der Dialog gar nicht gezeigt werden konnte/durfte +;; (GUI aus) - NUR dann Konsolen-Rueckfall (inkl. der spaeteren finalen +;; Einfuegen-Bestaetigung, die in diesem Fall unveraendert bleibt). +(defun gf-dialog-linienzug-winkel (zusammenfassung-zeilen winkel-vorschlag + as-winkel as-seite es-winkel es-seite / + dcl-pfad dat ergebnis dlg-winkel grade) + (if (or (not (car (atoms-family 1 '("SSG-GUI-P")))) (ssg-gui-p)) + (progn + (setq dcl-pfad (strcat (getenv "DXFM_DCL") "/gefaellestrecke.dcl")) + (setq dat (load_dialog dcl-pfad)) + (if (not (new_dialog "gefaellestrecke_linienzug" dat)) + (progn (if (and dat (>= dat 0)) (unload_dialog dat)) nil) + (progn + (set_tile "zusammenfassung" (ssg-join zusammenfassung-zeilen " | ")) + + (start_list "aus_winkel") (add_list as-winkel) (end_list) + (set_tile "aus_winkel" "0") + (start_list "aus_seite") (add_list as-seite) (end_list) + (set_tile "aus_seite" "0") + (start_list "ein_winkel") (add_list es-winkel) (end_list) + (set_tile "ein_winkel" "0") + (start_list "ein_seite") (add_list es-seite) (end_list) + (set_tile "ein_seite" "0") + (mode_tile "aus_winkel" 1) (mode_tile "aus_seite" 1) + (mode_tile "ein_winkel" 1) (mode_tile "ein_seite" 1) + + (set_tile "winkel" (rtos winkel-vorschlag 2 3)) + + (action_tile "accept" + "(setq dlg-winkel (get_tile \"winkel\")) (done_dialog 1)") + (action_tile "cancel" "(done_dialog 0)") + (setq ergebnis (start_dialog)) + (unload_dialog dat) + + (cond + ((= ergebnis 1) + (setq grade (atof dlg-winkel)) + (if (<= grade 0) (setq grade winkel-vorschlag)) + grade + ) + (t 'ABBRUCH) + ) + ) + ) + ) + nil + ) +) + ;; Hauptfunktion Modus 3 (defun gf-linienzug-modus ( / ss n i j obj obj-liste kette segmente seg startpunkt endpunkt-ref deltaH grade antwort idx as-seite es-seite as-block es-block - gf-as-winkel gf-es-winkel + gf-as-winkel gf-es-winkel dlg-aus-ein dlg-winkel-erg entry-hz exit-hz first-idx last-idx neu-l aktuell-frame nach-aus-pt @@ -787,29 +925,41 @@ (setq entry-hz (cadr (car segmente))) (setq exit-hz (gf-exit-hz segmente)) - ;; AUS-Element: 30/90 (vor Seite), dann Seite (vor Winkelberechnung, da die - ;; Laengenanpassung von der AS/ES-Masse abhaengt). Masse fuer Variante setzen. - (princ (ssg-text "vf-winkel-aus-header")) - (princ (ssg-text "vf-winkel-90")) - (princ (ssg-text "vf-winkel-30")) - (setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header")) - (princ (ssg-text "gf-seite-aus-header")) - (princ (ssg-text "gf-seite-links")) - (princ (ssg-text "gf-seite-rechts")) - (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) - (setq as-seite (if (= antwort "2") "rechts" "links")) - (vf-set-as-masse gf-as-winkel as-seite) + ;; AUS-/EIN-Element: 30/90 + Seite, in EINEM Dialog (vor Winkelberechnung, + ;; da die Laengenanpassung von der AS/ES-Masse abhaengt). Rueckfall auf die + ;; alten Konsolenfragen, wenn der Dialog nicht gezeigt werden kann/darf. + (setq dlg-aus-ein (gf-dialog-linienzug-aus-ein)) + (if (eq dlg-aus-ein 'ABBRUCH) + (progn (princ (ssg-text "vfc-vorgang-abgebrochen")) (exit)) + ) + (if dlg-aus-ein + (setq gf-as-winkel (nth 0 dlg-aus-ein) + as-seite (nth 1 dlg-aus-ein) + gf-es-winkel (nth 2 dlg-aus-ein) + es-seite (nth 3 dlg-aus-ein)) + (progn + (princ (ssg-text "vf-winkel-aus-header")) + (princ (ssg-text "vf-winkel-90")) + (princ (ssg-text "vf-winkel-30")) + (setq gf-as-winkel (vf-frage-element-winkel "vf-winkel-aus-header")) + (princ (ssg-text "gf-seite-aus-header")) + (princ (ssg-text "gf-seite-links")) + (princ (ssg-text "gf-seite-rechts")) + (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) + (setq as-seite (if (= antwort "2") "rechts" "links")) - ;; EIN-Element: 30/90 + Seite - (princ (ssg-text "vf-winkel-ein-header")) - (princ (ssg-text "vf-winkel-90")) - (princ (ssg-text "vf-winkel-30")) - (setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header")) - (princ (ssg-text "gf-seite-ein-header")) - (princ (ssg-text "gf-seite-links")) - (princ (ssg-text "gf-seite-rechts")) - (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) - (setq es-seite (if (= antwort "2") "rechts" "links")) + (princ (ssg-text "vf-winkel-ein-header")) + (princ (ssg-text "vf-winkel-90")) + (princ (ssg-text "vf-winkel-30")) + (setq gf-es-winkel (vf-frage-element-winkel "vf-winkel-ein-header")) + (princ (ssg-text "gf-seite-ein-header")) + (princ (ssg-text "gf-seite-links")) + (princ (ssg-text "gf-seite-rechts")) + (setq antwort (getstring (ssg-text "prompt-wahl-1-2"))) + (setq es-seite (if (= antwort "2") "rechts" "links")) + ) + ) + (vf-set-as-masse gf-as-winkel as-seite) (vf-set-es-masse gf-es-winkel es-seite) (setq as-block (strcat "AS_Element_" gf-as-winkel "_" as-seite)) @@ -881,14 +1031,30 @@ (princ (ssg-text "gf-status-berechne-winkel")) (setq grade (gf-winkel-berechnen segmente deltaH 1)) - ;; Manuelle Anpassung - (setq antwort - (getstring (ssg-textf "gf-prompt-winkel-verwenden" - (list (rtos grade 2 3) grad-zeichen)))) - (if (= (strcase antwort) "N") + ;; Manuelle Anpassung per Dialog (ersetzt zugleich die SPAETERE finale + ;; Einfuegen-Bestaetigung, siehe gf-dialog-linienzug-winkel) - Rueckfall + ;; auf die alten Konsolenfragen, wenn der Dialog nicht gezeigt werden + ;; kann/darf; dann bleibt auch die spaetere Einfuegen-Bestaetigung aktiv. + (setq dlg-winkel-erg + (gf-dialog-linienzug-winkel + (list (ssg-textf "gf-status-zus-segmente" (list (length segmente))) + (ssg-textf "gf-status-zus-deltah" (list delta-sym (rtos deltaH 2 2)))) + grade gf-as-winkel as-seite gf-es-winkel es-seite)) + (if (eq dlg-winkel-erg 'ABBRUCH) + (progn (princ (ssg-text "vfc-vorgang-abgebrochen")) (exit)) + ) + (if dlg-winkel-erg + (setq grade dlg-winkel-erg) (progn - (setq grade (getreal (ssg-text "gf-prompt-gefaellewinkel"))) - (if (or (null grade) (<= grade 0)) (setq grade 3.0)) + (setq antwort + (getstring (ssg-textf "gf-prompt-winkel-verwenden" + (list (rtos grade 2 3) grad-zeichen)))) + (if (= (strcase antwort) "N") + (progn + (setq grade (getreal (ssg-text "gf-prompt-gefaellewinkel"))) + (if (or (null grade) (<= grade 0)) (setq grade 3.0)) + ) + ) ) ) (setq grade (float grade)) @@ -953,8 +1119,9 @@ (princ (ssg-textf "gf-status-zus-ein-element" (list es-block))) (princ "\n=========================================") - ;; Bestaetigung - (setq antwort (getstring (ssg-text "gf-prompt-einfuegen"))) + ;; Bestaetigung - entfaellt, wenn der Dialog oben bereits bestaetigt hat + ;; (dlg-winkel-erg ist dann eine Zahl, kein nil/'ABBRUCH). + (setq antwort (if dlg-winkel-erg "1" (getstring (ssg-text "gf-prompt-einfuegen")))) (if (not (= antwort "2")) (progn ;; GF-Nummer und Entity-Grenze vor erster Einfuegung sichern. diff --git a/dcl/gefaellestrecke.dcl b/dcl/gefaellestrecke.dcl index bfb6c12..a6610ec 100644 --- a/dcl/gefaellestrecke.dcl +++ b/dcl/gefaellestrecke.dcl @@ -6,6 +6,14 @@ // Eingaben entsprechen dem interaktiven Skript Gefaellestrecke.lsp: // Abstand deltaL, Gefaellewinkel, Fahrtrichtung, // Seite AUS-Element, Seite EIN-Element. +// +// gefaellestrecke_linienzug: Modus 3 (aus Linienzug LINE+ARC) - ersetzt die +// Konsolenfragen AUS-/EIN-Element Winkel+Seite, Winkelbestaetigung und die +// finale Einfuegen-Bestaetigung in EINEM Dialog (gf-dialog-linienzug in +// Gefaellestrecke.lsp). Die Objektauswahl (ssget LINE/ARC) UND die +// Start-/Endpunktwahl bleiben davor Zeichnung/Konsole - der automatisch +// berechnete Vorschlagswinkel wird als Vorbelegung des Winkel-Feldes +// gezeigt, mit einer kurzen Zusammenfassung der Segmentanalyse darueber. // ============================================================ gefaellestrecke : dialog { @@ -108,3 +116,64 @@ gefaellestrecke : dialog { ok_cancel; } + +// Modus 3 (aus Linienzug): AUS-/EIN-Element Winkel+Seite, Gefaellewinkel +// (Vorschlag vorbelegt, ueberschreibbar) und eine kurze Zusammenfassung der +// automatisch analysierten Segmentkette. "zusammenfassung" wird per +// set_tile aus mehreren ssg-textf-Zeilen zusammengesetzt (gf-dialog- +// linienzug, Gefaellestrecke.lsp) - sprachunabhaengig, nur das Label-Chrome +// bleibt hart deutsch wie der Rest dieser Datei. +gefaellestrecke_linienzug : dialog { + label = "Gefaellestrecke aus Linienzug"; + + : column { + + : boxed_column { + label = "Segmentanalyse"; + : text { key = "zusammenfassung"; label = ""; width = 55; } + } + + : boxed_row { + label = "AUS-Element"; + + : popup_list { + key = "aus_winkel"; + label = "Winkel:"; + width = 12; + } + : popup_list { + key = "aus_seite"; + label = "Seite:"; + width = 14; + } + } + + : boxed_row { + label = "EIN-Element"; + + : popup_list { + key = "ein_winkel"; + label = "Winkel:"; + width = 12; + } + : popup_list { + key = "ein_seite"; + label = "Seite:"; + width = 14; + } + } + + : boxed_column { + label = "Gefaellewinkel"; + + : edit_box { + key = "winkel"; + label = "Gefaellewinkel (Grad):"; + edit_width = 10; + } + } + + } + + ok_cancel; +} diff --git a/doc/images/gf-linienzug1.png b/doc/images/gf-linienzug1.png new file mode 100644 index 0000000..3f86d3d Binary files /dev/null and b/doc/images/gf-linienzug1.png differ diff --git a/doc/images/gf-linienzug2.png b/doc/images/gf-linienzug2.png new file mode 100644 index 0000000..8cd4a5d Binary files /dev/null and b/doc/images/gf-linienzug2.png differ diff --git a/doc/images/gf-linienzug3.png b/doc/images/gf-linienzug3.png new file mode 100644 index 0000000..b5e6af2 Binary files /dev/null and b/doc/images/gf-linienzug3.png differ diff --git a/doc/variofoerderer.md b/doc/variofoerderer.md index 3d8a9aa..f4897a6 100644 --- a/doc/variofoerderer.md +++ b/doc/variofoerderer.md @@ -242,13 +242,43 @@ Das Winkel/Seite-Paar (`aus_winkel`/`aus_seite`, `ein_winkel`/`ein_seite`) taucht identisch auch im Linienzug als AS-/ES-Element-Baustein auf (siehe Abschnitt 5.2). -Zusaetzlich als Legacy-Konsole vorhanden (kein Dialog): +**Modus 2** — Startpunkt/Endpunkt waehlen (`GEFAELLESTRECKE_3DLINIE`): 2x +Punktwahl + Gefaellewinkel (Zahl, aus DeltaH automatisch vorgeschlagen). +Legacy-Konsole, kein Dialog. -- **Modus 2** — Startpunkt/Endpunkt waehlen: 2x Punktwahl + Gefaellewinkel - (Zahl, aus DeltaH automatisch vorgeschlagen). -- **Modus 3** — Bestehenden Linienzug (Linien/Boegen) auswaehlen: Objektauswahl, - Winkel wird aus der Geometrie vorgeschlagen und kann per j/n bestaetigt oder - ueberschrieben werden. +**Modus 3** — Bestehenden Linienzug (Linien/Boegen) auswaehlen +(`GEFAELLESTRECKE_LINIENZUG`): Objektauswahl (`ssget` LINE/ARC) und +Start-/Endpunktwahl bleiben Zeichnung/Konsole. AUS-/EIN-Element (Winkel +90/30 + Seite links/rechts) laufen danach ueber EINEN Dialog +(`gefaellestrecke_linienzug`, `gf-dialog-linienzug-aus-ein` in +`Lisp/Gefaellestrecke.lsp`) — muss vor der automatischen Segmentlaengen- +/Winkelberechnung laufen, die von der AS-/ES-Masse abhaengt. Danach zeigt +ein zweiter Dialog (`gf-dialog-linienzug-winkel`) den automatisch +berechneten Vorschlagswinkel ueberschreibbar zusammen mit einer kurzen +Segment-Zusammenfassung; dessen OK ersetzt zugleich die SPAETERE finale +Einfuegen-Bestaetigung (keine doppelte Rueckfrage nach der rein +automatischen AS/ES-Korrekturschleife). Rueckfall auf die alten +Konsolenfragen (inkl. der finalen Einfuegen-Bestaetigung), wenn einer der +beiden Dialoge nicht gezeigt werden kann/darf (GUI aus); ein bewusster +Dialog-Abbruch ('ABBRUCH) bricht dagegen den ganzen Befehl ab, OHNE auf die +Konsole zurueckzufallen. + +**Beispiel Modus 3 — Gefaellestrecke aus einem gezeichneten Linienzug:** + +1. Vorab eine Kette aus LINE-/ARC-Objekten entlang der gewuenschten Trasse + zeichnen (Geraden + Rundungen, hier ein abgerundeter Linienzug): + ![GF aus Linienzug - Ausgangslinie](images/gf-linienzug1.png) +2. `GEFAELLESTRECKE_LINIENZUG` aufrufen, die Objekte auswaehlen sowie Start- + und Endpunkt der Kette anklicken. Danach AS-/EIN-Element (Winkel/Seite) + im ersten Dialog waehlen; der zweite Dialog zeigt den automatisch aus + der Geometrie berechneten Gefaellewinkel-Vorschlag (hier 3°, AS/ES-Felder + nur noch zur Kontrolle, nicht mehr editierbar): + ![GF aus Linienzug - Dialog mit Vorschlagswinkel](images/gf-linienzug2.png) +3. Nach OK baut der Befehl die Gefaellestrecke direkt entlang der + Original-Linie (AUS-Element, Gefaellebogen an jeder Rundung, + Staustrecke, EIN-Element) — die urspruengliche Linie bleibt zur + Kontrolle in der Zeichnung stehen: + ![GF aus Linienzug - fertige Strecke neben der Ausgangslinie](images/gf-linienzug3.png) --- diff --git a/lang/de_DE.json b/lang/de_DE.json index f1d84dd..89a83c5 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -815,6 +815,7 @@ "gf-dlg-richtung-270": "270%1 (Y-, Sued)", "gf-dlg-links": "Links", "gf-dlg-rechts": "Rechts", + "gf-dlg-linienzug-vorlauf": "Linienzug ausgewaehlt - Winkel wird nach Bestaetigung berechnet.", "gf-status-gf-block-erstellt": "\n>>> GF-Block erstellt: %1 (%2)", "gf-status-schritt1-aus": "\n\n1/4: %1 Fahrtrichtung=%2%3 KS_EIN-hz=%4%5 v=%6%7", "gf-status-schritt2-staustrecke": "\n\n2/4: Staustrecke L=%1 mm hz=%2%3 v=%4%5", diff --git a/lang/en_GB.json b/lang/en_GB.json index 5888297..1c4e2b9 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -815,6 +815,7 @@ "gf-dlg-richtung-270": "270%1 (Y-, South)", "gf-dlg-links": "Left", "gf-dlg-rechts": "Right", + "gf-dlg-linienzug-vorlauf": "Path selected - angle will be calculated after confirmation.", "gf-status-gf-block-erstellt": "\n>>> GF block created: %1 (%2)", "gf-status-schritt1-aus": "\n\n1/4: %1 travel dir=%2%3 KS_EIN-hz=%4%5 v=%6%7", "gf-status-schritt2-staustrecke": "\n\n2/4: Buffer section L=%1 mm hz=%2%3 v=%4%5",