diff --git a/Lisp/vf_core.lsp b/Lisp/vf_core.lsp index a7b7ccd..a301894 100644 --- a/Lisp/vf_core.lsp +++ b/Lisp/vf_core.lsp @@ -909,6 +909,116 @@ ) ) +;; ============================================================ +;; TEIL 10b: GEMEINSAMER DIALOG-ABLAUF (Standard + Etage) +;; ============================================================ +;; Standard- und Etage-Typ teilen denselben Neuanlage-/Berechnen-Einfuege- +;; Ablauf; sie unterscheiden sich nur in Berechnungs-/Einfuege-Funktion (aus +;; der Typ-Registry), im XDATA-Marker und darin, ob die horizontale +;; Zwischenstrecke (nur "Ab") als Zusatzoption angeboten wird. +;; berechne-fn/einfuege-fn kommen aus *vf-typ-registry* (via typ). +(defun vf-registry-berechne-fn (typ) (nth 1 (assoc typ *vf-typ-registry*))) +(defun vf-registry-einfuege-fn (typ) (nth 2 (assoc typ *vf-typ-registry*))) + +;; Gemeinsame Berechnung + Winkel/Verteilung-Dialog + Einfuegung fuer einen +;; Registry-Typ. horizontal-p = T: horizontale Zwischenstrecke (Winkel 0) als +;; Zusatzoption bei "Ab" anbieten (Standard); nil: nicht (Etage). +;; Rueckgabe: (vf-insert vf-endpunkt), bei Abbruch (nil nil). +(defun vf-dialog-berechnen-einfuegen (typ vf-nummer deltaL deltaH richtung startpunkt hz seite + winkel-prefill geruest-einzelmodul geruest-typ horizontal-p / + berechne-fn einfuege-fn ergebnis ergebnis-liste gueltige-winkel + horizontal-info winkelwahl best-winkel L_GF L_VF L_GF1 L_GF2 + verteilung-modus n-scanner hoehe-von hoehe-bis lastEnt + vf-insert vf-endpunkt staustrecke-basis) + (setq berechne-fn (vf-registry-berechne-fn typ)) + (setq einfuege-fn (vf-registry-einfuege-fn typ)) + (setq ergebnis (apply berechne-fn (list deltaL deltaH richtung seite))) + (setq ergebnis-liste (cadddr ergebnis)) + (setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000)) + + ;; Horizontale Zwischenstrecke als Zusatzoption (nur bei "Ab", nur wenn + ;; horizontal-p). Winkel-Sentinel 0. + (setq horizontal-info nil) + (if (and horizontal-p (= richtung "Ab")) + (progn + (setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab")) + (if (and horizontal-info (caddr horizontal-info)) + (setq ergebnis-liste + (append ergebnis-liste (list (list 0 (car horizontal-info) (cadr horizontal-info) T)))) + (setq horizontal-info nil) + ) + ) + ) + + (setq gueltige-winkel + (mapcar 'car + (vl-remove-if-not + (function (lambda (e) (and (nth 3 e) (numberp (nth 1 e)) (numberp (nth 2 e)) + (>= (nth 1 e) 0) (>= (nth 2 e) 0)))) + ergebnis-liste))) + + (if (null gueltige-winkel) + (alert (ssg-textf "vfc-alert-kein-winkel" + (list (chr 916) (rtos deltaL 2 0) (rtos deltaH 2 0) richtung))) + (progn + (setq winkelwahl (vfs-dialog-winkel-verteilung gueltige-winkel ergebnis-liste staustrecke-basis winkel-prefill)) + (if (null winkelwahl) + (princ (ssg-text "vfc-vorgang-abgebrochen")) + (progn + (setq best-winkel (nth 0 winkelwahl) + L_GF (nth 1 winkelwahl) + L_VF (nth 2 winkelwahl) + L_GF1 (nth 3 winkelwahl) + L_GF2 (nth 4 winkelwahl) + verteilung-modus (nth 5 winkelwahl)) + (setq n-scanner 0) + (setq hoehe-von (caddr startpunkt)) + (setq hoehe-bis + (cond ((= richtung "Auf") (+ hoehe-von deltaH)) + ((= richtung "Ab") (- hoehe-von deltaH)) + (t hoehe-von))) + (setq lastEnt (vf-lastent-ohne-attribute)) + (setq vf-endpunkt + (apply einfuege-fn + (list deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz))) + (setq vf-insert + (vf-block-erstellen typ seite vf-nummer n-scanner + hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 + richtung best-winkel startpunkt lastEnt hz + geruest-einzelmodul geruest-typ)) + (if vf-insert (vf-edit-xdata-schreiben vf-insert typ hz)) + (princ "\n=========================================") + ) + ) + ) + ) + (list vf-insert vf-endpunkt) +) + +;; Neuanlage (Menue/Konsole -> Dialog) fuer einen Registry-Typ: Startpunkt +;; (X/Y) picken, Basis-Dialog, dann vf-dialog-berechnen-einfuegen. +(defun vf-dialog-ablauf (typ vf-nummer horizontal-p / eingabe deltaL deltaH richtung + z-start hz seite startpunkt startpunkt-xy dim + geruest-einzelmodul geruest-typ motorseite) + (setq startpunkt-xy (getpoint (ssg-text "vfc-prompt-startpunkt-aus"))) + (if (null startpunkt-xy) (setq startpunkt-xy '(0 0 0))) + (setq eingabe (vfs-dialog-eingabe-basis nil)) + (if (null eingabe) + (princ (ssg-text "vfc-vorgang-abgebrochen")) + (progn + (vf-basis-eingabe-entpacken eingabe) + (setq startpunkt (list (car startpunkt-xy) (cadr startpunkt-xy) z-start)) + ;; Gewaehlte Dimension (2D/3D) + Motorseite fuer den Bau erzwingen, danach zurueck. + (setq *ssg-ils-dim* dim) + (setq *vf-motorseite* motorseite) + (vf-dialog-berechnen-einfuegen typ vf-nummer deltaL deltaH richtung startpunkt hz seite nil + geruest-einzelmodul geruest-typ horizontal-p) + (setq *ssg-ils-dim* nil) + (setq *vf-motorseite* nil) + ) + ) +) + ;; ============================================================ ;; TEIL 11: UNTERMODULE LADEN ;; ============================================================ diff --git a/Lisp/vf_etage.lsp b/Lisp/vf_etage.lsp index 5db7656..fba0126 100644 --- a/Lisp/vf_etage.lsp +++ b/Lisp/vf_etage.lsp @@ -738,89 +738,18 @@ ;; seite), Einfuegung ueber etage-foerderanlage-einfuegen, KEINE horizontale ;; Zwischenstrecke (Winkel-Sentinel 0). XDATA-Marker "etage". -;; Gemeinsame Berechnung + Winkel/Verteilung-Dialog + Einfuegung. -;; Wird von der Neuanlage (vfe-etage-dialog-ablauf) und vom Edit (vfe-edit-ent) -;; genutzt. winkel-prefill: Vorbelegung fuer vfs-dialog-winkel-verteilung oder nil. -;; Analog vfs-standard-dialog-berechnen-einfuegen in vf_standard.lsp. +;; Duenner Wrapper auf den gemeinsamen vf-dialog-berechnen-einfuegen (vf_core). +;; Etage = OHNE horizontale Zwischenstrecke (horizontal-p nil). (defun vfe-etage-dialog-berechnen-einfuegen (vf-nummer deltaL deltaH richtung startpunkt hz seite - winkel-prefill geruest-einzelmodul geruest-typ / - ergebnis ergebnis-liste gueltige-winkel - winkelwahl best-winkel L_GF L_VF L_GF1 L_GF2 verteilung-modus - n-scanner hoehe-von hoehe-bis lastEnt vf-insert vf-endpunkt - staustrecke-basis) - (setq ergebnis (berechne-etage deltaL deltaH richtung seite)) - (setq ergebnis-liste (cadddr ergebnis)) - (setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000)) - - (setq gueltige-winkel - (mapcar 'car - (vl-remove-if-not - (function (lambda (e) (and (nth 3 e) (numberp (nth 1 e)) (numberp (nth 2 e)) - (>= (nth 1 e) 0) (>= (nth 2 e) 0)))) - ergebnis-liste))) - - (if (null gueltige-winkel) - (alert (ssg-textf "vfc-alert-kein-winkel" - (list (chr 916) (rtos deltaL 2 0) (rtos deltaH 2 0) richtung))) - (progn - (setq winkelwahl (vfs-dialog-winkel-verteilung gueltige-winkel ergebnis-liste staustrecke-basis winkel-prefill)) - (if (null winkelwahl) - (princ (ssg-text "vfc-vorgang-abgebrochen")) - (progn - (setq best-winkel (nth 0 winkelwahl) - L_GF (nth 1 winkelwahl) - L_VF (nth 2 winkelwahl) - L_GF1 (nth 3 winkelwahl) - L_GF2 (nth 4 winkelwahl) - verteilung-modus (nth 5 winkelwahl)) - (setq n-scanner 0) - (setq hoehe-von (caddr startpunkt)) - (setq hoehe-bis - (cond ((= richtung "Auf") (+ hoehe-von deltaH)) - ((= richtung "Ab") (- hoehe-von deltaH)) - (t hoehe-von))) - (setq lastEnt (vf-lastent-ohne-attribute)) - (setq vf-endpunkt - (etage-foerderanlage-einfuegen deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz)) - (setq vf-insert - (vf-block-erstellen "etage" seite vf-nummer n-scanner - hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 - richtung best-winkel startpunkt lastEnt hz - geruest-einzelmodul geruest-typ)) - (if vf-insert (vf-edit-xdata-schreiben vf-insert "etage" hz)) - (princ "\n=========================================") - ) - ) - ) - ) - (list vf-insert vf-endpunkt) -) + winkel-prefill geruest-einzelmodul geruest-typ) + (vf-dialog-berechnen-einfuegen "etage" vf-nummer deltaL deltaH richtung startpunkt hz seite + winkel-prefill geruest-einzelmodul geruest-typ nil)) ;; Neuanlage (Menue/Konsole -> Dialog): Startpunkt (X/Y) picken, Basis-Dialog, ;; dann gemeinsame Berechnung/Winkel-Dialog/Einfuegung. ;; Analog vfs-standard-dialog-ablauf in vf_standard.lsp. -(defun vfe-etage-dialog-ablauf (vf-nummer / eingabe deltaL deltaH richtung - z-start hz seite startpunkt startpunkt-xy dim - geruest-einzelmodul geruest-typ motorseite) - (setq startpunkt-xy (getpoint (ssg-text "vfc-prompt-startpunkt-aus"))) - (if (null startpunkt-xy) (setq startpunkt-xy '(0 0 0))) - - (setq eingabe (vfs-dialog-eingabe-basis nil)) - (if (null eingabe) - (princ (ssg-text "vfc-vorgang-abgebrochen")) - (progn - (vf-basis-eingabe-entpacken eingabe) - (setq startpunkt (list (car startpunkt-xy) (cadr startpunkt-xy) z-start)) - ;; Gewaehlte Dimension (2D/3D) + Motorseite fuer den Bau erzwingen, danach zurueck. - (setq *ssg-ils-dim* dim) - (setq *vf-motorseite* motorseite) - (vfe-etage-dialog-berechnen-einfuegen vf-nummer deltaL deltaH richtung startpunkt hz seite nil - geruest-einzelmodul geruest-typ) - (setq *ssg-ils-dim* nil) - (setq *vf-motorseite* nil) - ) - ) -) +(defun vfe-etage-dialog-ablauf (vf-nummer) + (vf-dialog-ablauf "etage" vf-nummer nil)) ;; Edit eines bestehenden Etage-VF-Blocks (VF_n mit SSG_VF_EDIT-XDATA "etage"). ;; Wird von c:VARIOFOERDERER_EDIT (vf_standard.lsp) per Typ-Dispatch gerufen und diff --git a/Lisp/vf_standard.lsp b/Lisp/vf_standard.lsp index 6119310..336ba07 100644 --- a/Lisp/vf_standard.lsp +++ b/Lisp/vf_standard.lsp @@ -942,103 +942,19 @@ ;; Edit-Befehl (c:VARIOFOERDERER_EDIT) verwendet. ;; winkel-prefill: Vorbelegung fuer vfs-dialog-winkel-verteilung oder nil. ;; ============================================================ +;; Duenne Wrapper: der gemeinsame Ablauf liegt jetzt in vf_core +;; (vf-dialog-berechnen-einfuegen / vf-dialog-ablauf). Standard = mit +;; horizontaler Zwischenstrecke (horizontal-p T). (defun vfs-standard-dialog-berechnen-einfuegen (vf-nummer deltaL deltaH richtung startpunkt hz seite - winkel-prefill geruest-einzelmodul geruest-typ / - ergebnis ergebnis-liste gueltige-winkel horizontal-info - winkelwahl best-winkel L_GF L_VF L_GF1 L_GF2 verteilung-modus - n-scanner hoehe-von hoehe-bis lastEnt vf-insert vf-endpunkt staustrecke-basis) - (setq ergebnis (berechne-standard deltaL deltaH richtung seite)) - (setq ergebnis-liste (cadddr ergebnis)) - (setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000)) + winkel-prefill geruest-einzelmodul geruest-typ) + (vf-dialog-berechnen-einfuegen "standard" vf-nummer deltaL deltaH richtung startpunkt hz seite + winkel-prefill geruest-einzelmodul geruest-typ T)) - ;; Horizontale Zwischenstrecke als Zusatzoption (nur bei "Ab" erreichbar, - ;; siehe Kommentar in c:VarioFoerderer Schritt 5b). - (setq horizontal-info nil) - (if (= richtung "Ab") - (progn - (setq horizontal-info (berechne-horizontale-mitte deltaL deltaH "Ab")) - (if (and horizontal-info (caddr horizontal-info)) - (setq ergebnis-liste - (append ergebnis-liste (list (list 0 (car horizontal-info) (cadr horizontal-info) T)))) - (setq horizontal-info nil) - ) - ) - ) - (setq gueltige-winkel - (mapcar 'car - (vl-remove-if-not - (function (lambda (e) (and (nth 3 e) (numberp (nth 1 e)) (numberp (nth 2 e)) - (>= (nth 1 e) 0) (>= (nth 2 e) 0)))) - ergebnis-liste))) - - (if (null gueltige-winkel) - (alert (ssg-textf "vfc-alert-kein-winkel" - (list (chr 916) (rtos deltaL 2 0) (rtos deltaH 2 0) richtung))) - (progn - (setq winkelwahl (vfs-dialog-winkel-verteilung gueltige-winkel ergebnis-liste staustrecke-basis winkel-prefill)) - (if (null winkelwahl) - (princ (ssg-text "vfc-vorgang-abgebrochen")) - (progn - (setq best-winkel (nth 0 winkelwahl) - L_GF (nth 1 winkelwahl) - L_VF (nth 2 winkelwahl) - L_GF1 (nth 3 winkelwahl) - L_GF2 (nth 4 winkelwahl) - verteilung-modus (nth 5 winkelwahl)) - (setq n-scanner 0) - (setq hoehe-von (caddr startpunkt)) - (setq hoehe-bis - (cond ((= richtung "Auf") (+ hoehe-von deltaH)) - ((= richtung "Ab") (- hoehe-von deltaH)) - (t hoehe-von))) - (setq lastEnt (vf-lastent-ohne-attribute)) - - ;; endpunkt = tatsaechliches ES-KS_AUS (Weltpunkt) - wird fuer die - ;; Ausrichtung des Parallel-VF (gf-baue-parallel-vf) zurueckgegeben. - (setq vf-endpunkt - (variofoerderer-einfuegen deltaL deltaH richtung best-winkel L_GF1 L_GF2 L_VF startpunkt seite hz)) - - (setq vf-insert - (vf-block-erstellen "standard" seite vf-nummer n-scanner - hoehe-von hoehe-bis deltaH deltaL L_VF L_GF1 L_GF2 - richtung best-winkel startpunkt lastEnt hz - geruest-einzelmodul geruest-typ)) - (if vf-insert (vfs-xdata-schreiben vf-insert hz)) - (princ "\n=========================================") - ) - ) - ) - ) - ;; Rueckgabe: (vf-insert vf-endpunkt) fuer aufrufende Ausrichtungslogik; - ;; bei Abbruch/Fehler (nil nil). Menue-Aufrufer ignorieren die Rueckgabe. - (list vf-insert vf-endpunkt) -) - -;; Neuanlage (Menue/Konsole -> Dialog): Startpunkt (X/Y) picken, Basis-Dialog, -;; dann gemeinsame Berechnung/Winkel-Dialog/Einfuegung. -(defun vfs-standard-dialog-ablauf (vf-nummer / eingabe deltaL deltaH richtung - z-start hz seite startpunkt startpunkt-xy dim - geruest-einzelmodul geruest-typ motorseite) - (setq startpunkt-xy (getpoint (ssg-text "vfc-prompt-startpunkt-aus"))) - (if (null startpunkt-xy) (setq startpunkt-xy '(0 0 0))) - - (setq eingabe (vfs-dialog-eingabe-basis nil)) - (if (null eingabe) - (princ (ssg-text "vfc-vorgang-abgebrochen")) - (progn - (vf-basis-eingabe-entpacken eingabe) - (setq startpunkt (list (car startpunkt-xy) (cadr startpunkt-xy) z-start)) - ;; Gewaehlte Dimension (2D/3D) + Motorseite fuer den Bau erzwingen (Override), danach zurueck. - (setq *ssg-ils-dim* dim) - (setq *vf-motorseite* motorseite) - (vfs-standard-dialog-berechnen-einfuegen vf-nummer deltaL deltaH richtung startpunkt hz seite nil - geruest-einzelmodul geruest-typ) - (setq *ssg-ils-dim* nil) - (setq *vf-motorseite* nil) - ) - ) -) +;; Neuanlage (Menue/Konsole -> Dialog). Duenner Wrapper auf den gemeinsamen +;; vf-dialog-ablauf (vf_core); Standard = mit horizontaler Zwischenstrecke. +(defun vfs-standard-dialog-ablauf (vf-nummer) + (vf-dialog-ablauf "standard" vf-nummer T)) ;; Nicht-interaktive Umwandlung EINES bestehenden VF-Blocks (Standard ODER ;; Etage) in die Zieldimension (fuer die Batch-Umschaltung "Alle auf 2D/3D").