diff --git a/Lisp/export.lsp b/Lisp/export.lsp index 507f318..2b6e7ff 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -50,20 +50,63 @@ ;; ueberlebt damit jeden Neustart. (setq *export-test-override* nil) -;; --- Schalter: rohe Einzelteil-Zeilen statt gruppierter Foerdereinheit/ -;; Gefaelleeinheit-Zeilen exportieren --- -;; Default nil = gruppierter Modus (csv:unitmark-aktualisieren fasst Boegen/ -;; Streckenelemente/Umlenk-/Motorstation zu je einer Zeile pro -;; Foerdereinheit/Gefaelleeinheit zusammen, die vier pattern_nested_*- -;; Einzelteil-Zeilen bleiben aus dem Export ausgeschlossen). Auf T gesetzt: -;; Verhalten wie vor der Gruppierung - jedes Einzelteil bekommt seine eigene -;; Export-Zeile (csv:collect-export-blocks laesst die pattern_nested_*- -;; Klauseln dann durch). Nur per Lisp-Variable/den beiden Helfern -;; umschaltbar, kein Menuepunkt vorgesehen. -(if (not (boundp '*csv-export-alle-elemente*)) (setq *csv-export-alle-elemente* nil)) -(defun csv:export-alle-elemente-p () *csv-export-alle-elemente*) -(defun csv:export-alle-elemente-an () (setq *csv-export-alle-elemente* T) (princ)) -(defun csv:export-alle-elemente-aus () (setq *csv-export-alle-elemente* nil) (princ)) +;; --- Export-Modus: wie granular VF_n/GF_n-Ketten exportiert werden --- +;; Drei sich gegenseitig ausschliessende Werte (String, ueber CSV_EXPORT_ +;; KONFIG/dcl/csv_export_konfig.dcl bedienbar, siehe c:CSV_EXPORT_KONFIG +;; weiter unten): +;; "group_vf_gf" - Default. csv:unitmark-aktualisieren fasst Boegen/ +;; Streckenelemente/Umlenk-/Motorstation zu je einer +;; Zeile pro Foerdereinheit/Gefaelleeinheit zusammen, +;; die pattern_nested_*-Einzelteil-Zeilen bleiben aus +;; dem Export ausgeschlossen. +;; "all_elements" - Verhalten wie vor der Gruppierung: jedes Einzelteil +;; (Bogen/Streckenelement/Umlenk-/Motorstation) +;; bekommt seine eigene Export-Zeile +;; (csv:collect-export-blocks laesst die +;; pattern_nested_*-Klauseln durch, csv:unitmark- +;; aktualisieren legt keine neuen Marker an). +;; "separator_track" - Klassisches Verhalten vor beiden Erweiterungen: +;; nur AS/ES/Separator, keine Einzelteile UND keine +;; Foerdereinheit/Gefaelleeinheit-Marker (weder +;; csv:element-proxies-erzeugen noch csv:unitmark- +;; aktualisieren legen dafuer etwas Neues an - siehe +;; csv:export-vorbereiten). +;; Ein ungueltiger Wert wird von csv:export-modus-setzen ignoriert (Modus +;; bleibt unveraendert) statt die Zeichnung in einen unbekannten Zustand zu +;; versetzen. +(if (not (boundp '*csv-export-modus*)) (setq *csv-export-modus* "group_vf_gf")) +(defun csv:export-modus () *csv-export-modus*) +(defun csv:export-modus-setzen (modus) + (if (member modus '("all_elements" "group_vf_gf" "separator_track")) + (setq *csv-export-modus* modus)) + (princ) +) +;; Abgeleitete Boolean-Abfragen - bestehende Aufrufstellen (csv:collect- +;; export-blocks/csv:unitmark-aktualisieren) bleiben dadurch unveraendert. +(defun csv:export-alle-elemente-p () (= *csv-export-modus* "all_elements")) +(defun csv:export-separator-track-p () (= *csv-export-modus* "separator_track")) +;; Kurzformen, die die frueheren csv:export-alle-elemente-an/-aus 1:1 +;; ersetzen (z.B. fuer Testcode/Kommandozeile). +(defun csv:export-alle-elemente-an () (csv:export-modus-setzen "all_elements")) +(defun csv:export-alle-elemente-aus () (csv:export-modus-setzen "group_vf_gf")) + +;; --- Zwei unabhaengige Sichtbarkeits-Haken fuer die temporaeren Element- +;; Proxy-Kopien (siehe csv:element-proxies-loeschen/csv:unitmark- +;; aktualisieren) - ebenfalls ueber CSV_EXPORT_KONFIG bedienbar --- +;; *csv-export-pruef-zuordnung* - laesst die den Foerdereinheit-/ +;; Gefaelleeinheit-Markern zugeordneten Element-Kopien zusaetzlich +;; sichtbar, damit in BricsCAD optisch nachvollziehbar ist, welche +;; Einzelteile zu welchem ZZ_UNIT_MARKER-Rechteck zusammengefasst +;; wurden (die Marker selbst bleiben ohnehin immer stehen, persistent +;; wie ZZ_ASES_MARKER). +;; *csv-export-elemente-behalten* - laesst die Element-Proxy-Kopien +;; grundsaetzlich stehen, unabhaengig vom Gruppierungs-Debugging oben. +;; Beide unabhaengig vom bestehenden, als TEMPORAER dokumentierten Debug- +;; Schalter "csv_leave_proxies" (ssg_dbg.lsp) - der bleibt unveraendert und +;; steuert weiterhin zusaetzlich (ODER-verknuepft) sowohl Separator- als +;; auch Element-Proxies. +(if (not (boundp '*csv-export-pruef-zuordnung*)) (setq *csv-export-pruef-zuordnung* nil)) +(if (not (boundp '*csv-export-elemente-behalten*)) (setq *csv-export-elemente-behalten* nil)) ;; --- Feste Datei-/Skriptnamen dieses Moduls (keine Config, direkt im Code) --- @@ -1251,11 +1294,22 @@ ;; Eigene, minimale Loeschfunktion statt csv:sep-proxies-loeschen wieder- ;; zuverwenden: *cs-sep-fix-by-handle*/*cs-sep-typ-by-handle*/ ;; *csv-sepliste-id-by-handle* bleiben separator-/AS-/ES-spezifisch, diese -;; Elemente haben keine Entsprechung davon. Nutzt denselben Debug-Schalter -;; "csv_leave_proxies" wie Separator, fuer konsistentes Debugging. +;; Elemente haben keine Entsprechung davon. +;; +;; Drei unabhaengige Gruende, die Kopien trotzdem stehen zu lassen (ODER- +;; verknuepft): der dialoggesteuerte Haken "Element-Kopien behalten" +;; (*csv-export-elemente-behalten*), der Haken "Zuordnung pruefen" +;; (*csv-export-pruef-zuordnung* - zeigt zusammen mit den stehenbleibenden +;; ZZ_UNIT_MARKER-Rechtecken, welche Kopie zu welcher Einheit gehoert), und +;; der bestehende, als TEMPORAER dokumentierte Debug-Schalter +;; "csv_leave_proxies" (ssg_dbg.lsp) - dieser bleibt unveraendert und +;; steuert weiterhin zusaetzlich auch die Separator-Proxies +;; (csv:sep-proxies-loeschen). (defun csv:element-proxies-loeschen (proxy-liste / behalten) - (setq behalten (and (car (atoms-family 1 '("DBG-SCHALTER-P"))) - (dbg-schalter-p "csv_leave_proxies"))) + (setq behalten (or *csv-export-elemente-behalten* + *csv-export-pruef-zuordnung* + (and (car (atoms-family 1 '("DBG-SCHALTER-P"))) + (dbg-schalter-p "csv_leave_proxies")))) (if behalten (princ (strcat "\n[EXPORT] csv_leave_proxies=1: " (itoa (length proxy-liste)) @@ -2352,7 +2406,11 @@ ergebnis neu uebernommen verwaist) (setq neu 0 uebernommen 0 verwaist 0) (setq bestand (csv:unitmark-sammeln)) - (if (not (csv:export-alle-elemente-p)) + ;; Neue Marker nur im GENAU gruppierten Modus anlegen - sowohl + ;; "all_elements" als auch "separator_track" wollen keine ZZ_UNIT_MARKER, + ;; der Aufraeum-Pass unten (verwaiste Marker loeschen) laeuft in JEDEM + ;; Modus unbedingt weiter. + (if (= *csv-export-modus* "group_vf_gf") (progn (setq blockname (csv:unitmark-blockdef-sicherstellen)) (if blockname @@ -2659,8 +2717,10 @@ ;; temporaere Kopien ersetzen - siehe csv:element-proxies-erzeugen. MUSS wie ;; sep-proxies VOR ssg-id-check-all stehen, damit die frischen Kopien in ;; dessen Lauf mit nummeriert werden (siehe ssg-id-collect-blocks, - ;; ssg_id.lsp). - (setq element-proxies (csv:element-proxies-erzeugen)) + ;; ssg_id.lsp). Im Modus "separator_track" werden gar keine Element-Kopien + ;; erzeugt - dieser Modus kennt nur AS/ES/Separator. + (setq element-proxies + (if (csv:export-separator-track-p) nil (csv:element-proxies-erzeugen))) ;; Foerdereinheit-/Gefaelleeinheit-Marker (ZZ_UNIT_MARKER) aus den drei ;; obigen Proxy-/Marker-Listen bauen - MUSS nach ihnen (braucht ihre ;; Weltpositionen) und VOR ssg-id-check-all stehen (frische Marker werden @@ -2892,6 +2952,37 @@ ) +;; --- CSV_EXPORT_KONFIG: Dialog fuer Export-Modus + Proxy-Sichtbarkeit --- +(defun csv:export-konfig-init ( / idx) + (setq idx + (cond + ((= *csv-export-modus* "all_elements") "1") + ((= *csv-export-modus* "separator_track") "2") + (t "0"))) + (set_tile "modus" idx) + (set_tile "pruef_zuordnung" (if *csv-export-pruef-zuordnung* "1" "0")) + (set_tile "elemente_behalten" (if *csv-export-elemente-behalten* "1" "0")) +) + +(defun csv:export-konfig-accept ( / idx) + (setq idx (get_tile "modus")) + (csv:export-modus-setzen + (cond ((= idx "1") "all_elements") ((= idx "2") "separator_track") (t "group_vf_gf"))) + (setq *csv-export-pruef-zuordnung* (= (get_tile "pruef_zuordnung") "1")) + (setq *csv-export-elemente-behalten* (= (get_tile "elemente_behalten") "1")) +) + +(defun c:CSV_EXPORT_KONFIG () + (ssg-dialog-run + (strcat (getenv "DXFM_DCL") "/csv_export_konfig.dcl") + "csv_export_konfig" + 'csv:export-konfig-init + 'csv:export-konfig-accept + ) + (princ) +) + + ;; ============================================================ ;; OMNIFLO HOEHE/DREHUNG AKTUALISIEREN ;; ============================================================ diff --git a/dcl/csv_export_konfig.dcl b/dcl/csv_export_konfig.dcl new file mode 100644 index 0000000..776ad3d --- /dev/null +++ b/dcl/csv_export_konfig.dcl @@ -0,0 +1,51 @@ +// ============================================================ +// csv_export_konfig.dcl - CSV-Export Konfiguration (c:CSV_EXPORT_KONFIG, +// export.lsp). Steuert *csv-export-modus* (drei sich gegenseitig +// ausschliessende Radio-Buttons im selben boxed_radio_column) sowie die +// zwei unabhaengigen Sichtbarkeits-Haken fuer temporaere Element-Proxy- +// Kopien (*csv-export-pruef-zuordnung*/*csv-export-elemente-behalten*). +// +// Radio-Button-Labels sind FEST (Deutsch) - set_tile kann bei einem +// radio_button nur den Zustand, nicht das Label aendern (siehe Kommentar +// dcl/variofoerderer.dcl:16-23, gleiche Einschraenkung hier). +// ============================================================ + +csv_export_konfig : dialog { + label = "CSV-Export Konfiguration"; + + : boxed_radio_column { + label = "Export-Modus:"; + key = "modus"; + + : radio_button { + key = "modus_group"; + label = "Gruppiert: Foerdereinheit/Gefaelleeinheit (Standard)"; + value = "1"; + } + : radio_button { + key = "modus_all"; + label = "Alle Einzelelemente (Boegen, Strecken, Umlenk-/Motorstation)"; + } + : radio_button { + key = "modus_sep"; + label = "Nur Separator-Spur (AS/ES/Separator, ohne Streckenelemente)"; + } + } + + spacer; + + : boxed_column { + label = "Element-Proxy-Kopien (Debug)"; + + : toggle { + key = "pruef_zuordnung"; + label = "Zuordnung pruefen (Element-Kopien zusaetzlich sichtbar lassen)"; + } + : toggle { + key = "elemente_behalten"; + label = "Element-Kopien nach Export behalten (nicht loeschen)"; + } + } + + ok_cancel; +} diff --git a/menu/SSG_LIB.mnu b/menu/SSG_LIB.mnu index cc6d597..859954b 100644 --- a/menu/SSG_LIB.mnu +++ b/menu/SSG_LIB.mnu @@ -132,6 +132,7 @@ [Alle Bloecke auf 3D]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_3D [Sprache]^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE [Planquadrate an/aus]^C^C(ssg-ensure "DrawPlanquadrate") PLANQUADRATE_TOGGLE +[<-CSV-Export]^C^C(ssg-ensure "export") CSV_EXPORT_KONFIG [<-Konfiguration Schliessen]^C^C [->Tests] [alle Tests ausfuehren und exportieren]^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) SSG_RUN_ALL_TESTS_EXPORT diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index 19712dd..7fce004 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -491,6 +491,33 @@ (setq _elem-b (list 'PROXY_B 'WRAPPER "BOGEN" '(2.0 0.0 0.0))) (setq _zuord2 (csv:element-unit-zuordnung _spans-proj _sep-proj (list _elem-a _elem-b))) (tu-eq "csv:element-unit-zuordnung/sortiert" (list _elem-b _elem-a) (nth 0 _zuord2)) + + ;; --- csv:export-modus-setzen / -p-Praedikate: 3 Modi + Ungueltig-Schutz -- + ;; Bestehenden Modus sichern/wiederherstellen, damit dieser Testblock keine + ;; Seiteneffekte auf nachfolgende Tests oder eine laufende Sitzung hat. + (setq _modus-alt *csv-export-modus*) + + (csv:export-modus-setzen "all_elements") + (tu-eq "csv:export-modus-setzen/all_elements" "all_elements" *csv-export-modus*) + (tu-true "csv:export-alle-elemente-p/all_elements" (csv:export-alle-elemente-p)) + (tu-nil "csv:export-separator-track-p/all_elements" (csv:export-separator-track-p)) + + (csv:export-modus-setzen "group_vf_gf") + (tu-eq "csv:export-modus-setzen/group_vf_gf" "group_vf_gf" *csv-export-modus*) + (tu-nil "csv:export-alle-elemente-p/group_vf_gf" (csv:export-alle-elemente-p)) + (tu-nil "csv:export-separator-track-p/group_vf_gf" (csv:export-separator-track-p)) + + (csv:export-modus-setzen "separator_track") + (tu-eq "csv:export-modus-setzen/separator_track" "separator_track" *csv-export-modus*) + (tu-nil "csv:export-alle-elemente-p/separator_track" (csv:export-alle-elemente-p)) + (tu-true "csv:export-separator-track-p/separator_track" (csv:export-separator-track-p)) + + ;; Ungueltiger Wert wird ignoriert - Modus bleibt auf dem zuletzt gueltig + ;; gesetzten Stand (hier "separator_track"). + (csv:export-modus-setzen "unbekannt") + (tu-eq "csv:export-modus-setzen/ungueltig-ignoriert" "separator_track" *csv-export-modus*) + + (csv:export-modus-setzen _modus-alt) )