diff --git a/menu/SSG_LIB.cui b/menu/SSG_LIB.cui index eeacf5c..58b2b9f 100644 --- a/menu/SSG_LIB.cui +++ b/menu/SSG_LIB.cui @@ -20,715 +20,715 @@ - + Einfuegen ^C^C(ssg-ensure "KreiselInsert") KreiselInsert - + Verbinden ^C^C(ssg-ensure "KreiselInsert") KreiselConnect - + Bearbeiten ^C^C(ssg-ensure "KreiselInsert") KreiselEdit - + Eckrad ^C^C(ssg-ensure "KreiselInsert") ILS_Eckrad - + BTMT-Beladung ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_BTMT_Beladung - + BTMT-Entladung ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_BTMT_Entladung - + Scanner einfuegen ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_SCANNER_INSERT - + Separator einfuegen ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_SEPARATOR_INSERT - + Werte manuell ^C^C(ssg-ensure "VarioFoerderer") StandardVarioFoerderer - + aus 3D-Linie ^C^C(ssg-ensure "VarioFoerderer") StandardVarioFoerderer3D - + Werte manuell ^C^C(ssg-ensure "VarioFoerderer") EtageVarioFoerderer - + aus 3D-Linie ^C^C(ssg-ensure "VarioFoerderer") EtageVarioFoerderer3D - + 3D-Linienzug ^C^C(ssg-ensure "VarioFoerderer") LinienzugVarioFoerderer - + Vario_Kette_Merge ^C^C(ssg-ensure "VarioFoerderer") Vario_Kette_Merge - + VarioFoerderer nachruesten (Marker) ^C^C(ssg-ensure "VarioFoerderer") VARIOFOERDERER_NACHRUESTEN - + einfach ^C^C(ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_EINFACH - + aus 3D-Linie ^C^C(ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_3DLINIE - + aus Linienzug (LINE + ARC) ^C^C(ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_LINIENZUG - + 90 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_630_90 - + 67.5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_550_675 - + 45 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_630_45 - + 22.5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_550_225 - + 180 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_650_180 - + 90 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APB60_90 - + AP 60 ^C^C(ssg-ensure "OmniModulInsert") OMNI_AP60 - + AP 110 ^C^C(ssg-ensure "OmniModulInsert") OMNI_AP110 - + APG 110 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APG110 - + Einfach 90 700/700 links M ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Einfach - + Doppel 90 700/700 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Doppel - + Dreiwege 90 700/700 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Dreiwege - + Einfach 45 350/700 links M ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Einfach - + Doppel 45 350/700 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Doppel - + Dreiwege 45 350/700 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Dreiwege - + Einfach Parallel 200/750 links M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Einfach - + Doppel Parallel 200/750 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Doppel - + Dreiwege Parallel 200/750 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Dreiwege - + Einfach 22.5 links M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Einfach - + Doppel 22.5 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Doppel - + Dreiwege 22.5 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Dreiwege - + Delta 1400/700 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1400 - + Delta 1600/800 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1600 - + Star 1400/1400 M ^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Star - + TEF Antriebst. rechts ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebR - + TEF Umlenkspannst. rechts ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkR - + TEF Antriebst. links ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebL - + TEF Umlenkspannst. links ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkL - + TEF Gerade auf Linie ^C^C(ssg-ensure "TEFInsert") TEF_FOERDERER_LINIE - + TEF Gerade ^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_Gerade - + Stopper AP ^C^C(ssg-ensure "OmniModulInsert") OMNI_STOPPER - + Scanner ^C^C(ssg-ensure "OmniModulInsert") OMNI_SCANNER - + Bürstenbremse ^C^C(ssg-ensure "OmniModulInsert") OMNI_BUERSTENBREMSE - + KettenFoerderer ^C^C(ssg-ensure "OmniModulInsert") OMNI_KettenFoerderer - + TV W-W kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_W - + TV W-AP110 kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP110 - + TV W-AP60 oben kpl. ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP60 - + TV W-AP110-W kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP110_W - + TV W-AP oben kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_AP - + TV 80 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_80 - + TV 50 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_50 - + Endplatte Al-Profil AP schraubbar ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_ENDPLATTE - + Anschlag AP-Ende fuer Spulenzug ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_ANSCHLAG - + TV-A fuer AP110/AP60 kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_A_AP110_AP60 - + TV-A fuer AP60/ST ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_A_AP60_ST - + TV-A fuer AP110/ST kpl ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_A_AP110_ST - + TV-SW II fuer SW-SW ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_II_SW_SW - + TV-SW III fuer SW-AP110-SW ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_III_AP110_SW - + TV-SW III fuer SW-AP110 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_III_AP110 - + TV-SW IV fuer Anschluss SW-AP60 ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_IV_AP60 - + TV-SW IV fuer SW-ST ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_SW_IV_ST - + Muffe ^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_MUFFE - + APB 110 R400/45 140 nur fuer Delta ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R400_45_140 - + APB 110 R550/45 194 nur fuer Delta ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_45_194 - + APBW 110 R550/22,5 360x248,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_360 - + APBW 110 R550/22,5 410x298,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_410A - + APBW 110 R550/22,5 410x78,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_410B - + APBW 110 R550/22,5 410x98,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_225_410C - + APBW 110 R550/67,5 360x598,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_360 - + APBW 110 R400/67,5 260x398,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R400_675_260 - + APBW 110 R550/45 77x160 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_45_77 - + APBW 110 R550/67,5 125x83,5 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_125 - + APBW 110 R750/90 200x290 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R750_90_200 - + APBW 110 R650/90 300x190 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R650_90_300 - + APBW 110 R550/67,5 208x347 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_208 - + APBW 110 R550/67,5 58x497 ^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_58 - + Element bearbeiten ^C^C(ssg-ensure "OmniModulInsert") OMNI_EDIT - + Marker einfuegen ^C^C(ssg-ensure "Tro_Edit") TRO_INSERT - + Marker bearbeiten ^C^C(ssg-ensure "Tro_Edit") TRO_EDIT - + Bearbeiten (Auto) ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT - + Verbindung einfuegen ^C^C(ssg-ensure "Connection_Edit") CONNECTION_INSERT - + Verbindung bearbeiten ^C^C(ssg-ensure "Connection_Edit") CONNECTION_EDIT - + Eingang ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_EINGANG_INSERT - + Ausgang ^C^C(ssg-ensure "SSG_LIB_Commands") ILS_AUSGANG_INSERT - + SPS Schliessen ^C^C - + Export Sivas ^C^C(ssg-ensure "export") EXPORTSIVAS - + Export CSV ^C^C(ssg-ensure "export") EXPORTCSV - + Umschalten 2D und 3D ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_SWITCH - + Alle Bloecke auf 2D ^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_2D - + 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 - + alle Tests ausfuehren und exportieren ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) SSG_RUN_ALL_TESTS_EXPORT - + Tests ausfuehren und stehen lassen ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) SSG_RUN_ALL_TESTS_OFFEN - + Export CSV/Sivas ALL ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_export_all.lsp")) TEST_EXPORT_ALL - + Kreisel ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_kreisel.lsp")) TEST_KREISEL - + Foerderer ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_foerderer.lsp")) TEST_FOERDERER - + Foerderer-Linienzug ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_linienzug.lsp")) TEST_LINIENZUG - + Omniflo ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo.lsp")) TEST_OMNIFLO - + Omniflo Strecke ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo_strecke.lsp")) TEST_OMNIFLO_STRECKE - + Gefaellestrecke ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_gefaellestrecke.lsp")) TEST_GEFAELLESTRECKE - + Mubea Gesamtmodell ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_mubea.lsp")) TEST_MUBEA - + HundM05 Kreisel-Abschnitt ^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_hundm05.lsp")) TEST_HUNDM05 - + KS 2D/3D pruefen (CSV) ^C^C(load (strcat (getenv "DXFMAKRO") "/Lisp/ks_pruefung.lsp")) KS_PRUEFEN - + Kreisel bearbeiten (ssg-ensure "KreiselInsert") KreiselEdit - + Omniflo Element bearbeiten (ssg-ensure "OmniModulInsert") OMNI_EDIT - + Gefaellestrecke bearbeiten (ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_EDIT - + VarioFoerderer bearbeiten (ssg-ensure "VarioFoerderer") VARIOFOERDERER_EDIT - + TRO-Marker bearbeiten (ssg-ensure "Tro_Edit") TRO_EDIT - + Verbindung bearbeiten (ssg-ensure "Connection_Edit") CONNECTION_EDIT - + SSG Bearbeiten (Auto) (ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT @@ -740,846 +740,846 @@ - + POP1 SSG_LIB - - - - - - - - - ILS - - - + + + + + - + + ILS + + + + + + Kreisel-Module Einfuegen - + Verbinden - + Bearbeiten - + Eckrad - + - + Zusatzmodul BTMT-Beladung - + BTMT-Entladung - + Scanner einfuegen - + Separator einfuegen - + - + Foerderer - - + + 3D-Linienzug - + Vario_Kette_Merge - + VarioFoerderer nachruesten (Marker) - + - + Standard Werte manuell - + aus 3D-Linie - + - + Etage Werte manuell - + aus 3D-Linie - + - + Gefaellestrecke einfach - + aus 3D-Linie - + aus Linienzug (LINE + ARC) - + - + Omniflo - - - - - - - - - - + + + + + + + + + + ~KettenFoerderer - + - - + + Element bearbeiten - + - + Boegen APB110 90 - + 67.5 - + 45 - + 22.5 - + 180 - + - + Boegen APB60 90 - + - + Aluprofil Gerade AP 60 - + AP 110 - + APG 110 - + - + Weiche 90 Grad Einfach 90 700/700 links M - + Doppel 90 700/700 M - + Dreiwege 90 700/700 M - + - + Weiche 45 Grad Einfach 45 350/700 links M - + Doppel 45 350/700 M - + Dreiwege 45 350/700 M - + - + Weichen Parallel Einfach Parallel 200/750 links M - + Doppel Parallel 200/750 M - + Dreiwege Parallel 200/750 M - + - + Weichenkoerper Einfach 22.5 links M - + Doppel 22.5 M - + Dreiwege 22.5 M - + - + Weichenkombinationen Delta 1400/700 M - + Delta 1600/800 M - + Star 1400/1400 M - + - + TEF Elemente TEF Antriebst. rechts - + TEF Umlenkspannst. rechts - + TEF Antriebst. links - + TEF Umlenkspannst. links - + TEF Gerade auf Linie - + TEF Gerade - + - + Anbaugruppen Stopper AP - + Scanner - + Bürstenbremse - + - + Verbinder ~TV W-W kpl - + ~TV W-AP110 kpl - + ~TV W-AP60 oben kpl. - + ~TV W-AP110-W kpl - + ~TV W-AP oben kpl - + ~TV 80 - + ~TV 50 - + ~Endplatte Al-Profil AP schraubbar - + ~Anschlag AP-Ende fuer Spulenzug - + ~TV-A fuer AP110/AP60 kpl - + ~TV-A fuer AP60/ST - + ~TV-A fuer AP110/ST kpl - + ~TV-SW II fuer SW-SW - + ~TV-SW III fuer SW-AP110-SW - + ~TV-SW III fuer SW-AP110 - + ~TV-SW IV fuer Anschluss SW-AP60 - + ~TV-SW IV fuer SW-ST - + ~Muffe - + - + Boegen fuer Weichen ~APB 110 R400/45 140 nur fuer Delta - + ~APB 110 R550/45 194 nur fuer Delta - + ~APBW 110 R550/22,5 360x248,5 - + ~APBW 110 R550/22,5 410x298,5 - + ~APBW 110 R550/22,5 410x78,5 - + ~APBW 110 R550/22,5 410x98,5 - + ~APBW 110 R550/67,5 360x598,5 - + ~APBW 110 R400/67,5 260x398,5 - + ~APBW 110 R550/45 77x160 - + ~APBW 110 R550/67,5 125x83,5 - + ~APBW 110 R750/90 200x290 - + ~APBW 110 R650/90 300x190 - + ~APBW 110 R550/67,5 208x347 - + ~APBW 110 R550/67,5 58x497 - + - + SPS - - - - Eingang - - - - - - Ausgang - - - - + + SPS Schliessen - + - + TRO Marker einfuegen - + Marker bearbeiten - + Bearbeiten (Auto) - + - + Connections Verbindung einfuegen - + Verbindung bearbeiten - + + + + + Eingang + + + + + + Ausgang + + Bearbeiten (Auto) - + - + Export Export Sivas - + Export CSV - + - + Konfiguration Umschalten 2D und 3D - + Alle Bloecke auf 2D - + Alle Bloecke auf 3D - + Sprache - + Planquadrate an/aus - + Konfiguration Schliessen - + - + Tests alle Tests ausfuehren und exportieren - + Tests ausfuehren und stehen lassen - + Export CSV/Sivas ALL - + Kreisel - + Foerderer - + Foerderer-Linienzug - + Omniflo - + Omniflo Strecke - + Gefaellestrecke - + Mubea Gesamtmodell - + HundM05 Kreisel-Abschnitt - + KS 2D/3D pruefen (CSV) - + - + POP501 SSG_LIB Edit Context Kreisel bearbeiten - + Omniflo Element bearbeiten - + Gefaellestrecke bearbeiten - + VarioFoerderer bearbeiten - + TRO-Marker bearbeiten - + Verbindung bearbeiten - + SSG Bearbeiten (Auto) - + diff --git a/tests/test_hundm05.lsp b/tests/test_hundm05.lsp index 37fd11f..2c787cb 100644 --- a/tests/test_hundm05.lsp +++ b/tests/test_hundm05.lsp @@ -58,7 +58,10 @@ ;; lib/vf_spec_export.py uebernimmt sie beim Neuerzeugen der Spec-Daten ;; unveraendert ans Dateiende (sonst waeren sie beim naechsten Lauf weg). ;; -;; Bisher unterstuetzt: Kreisel (function "insert", wie test_kreisel.lsp). +;; Unterstuetzt: Kreisel (function "insert", wie test_kreisel.lsp) und +;; Separator/Scanner (zusaetzlich "block", wie in mubea.json - Schema +;; tests/testdata/object_data.md Abschnitt 5). Unterscheidung ueber das +;; Feld "block": nur Separator/Scanner-Eintraege haben es. ;; Weitere Arten kommen als eigener cond-Zweig dazu. (defun hundm05:zusatz-objekt-p (obj) @@ -116,10 +119,80 @@ (vsp-set (vsp-set rec "status" "abbruch") "fehler_text" "kreisel-insert-script lieferte nil")))))) +;; Separator/Scanner bauen ("block"-Eintraege, siehe object_data.md +;; Abschnitt 5). ils-insert-sensor (SSG_LIB_Commands.lsp) ist dafuer NICHT +;; scriptbar (fragt Punkt/Rotation per getpoint/pause in einer Schleife) - +;; wir bauen den _.INSERT darum direkt selbst nach, wie +;; mubea:build-separator-one in tests/test_mubea.lsp es fuer die +;; Mubea-Anlage schon vorgemacht hat (dieselbe Vorlage, hier auf das +;; hundm05:bau-*/vsp-rec-neu-Record-Format dieser Datei uebertragen statt +;; mubeas eigenes result-json). "sensor" als Sammelbegriff fuer den "kind"- +;; Wert, weil dieselbe Routine Separator UND Scanner einfuegt - genau wie +;; ils-insert-sensor selbst. +(defun hundm05:bau-sensor (obj / id blockname x y z rotation pt eff n ent ed rec) + (setq id (ssg-val obj "id")) + (setq blockname (ssg-val obj "block")) + (setq x (ssg-val obj "x") + y (ssg-val obj "y") + z (ssg-val obj "z") + rotation (ssg-val obj "rotation")) + (if (numberp x) (setq x (float x))) + (if (numberp y) (setq y (float y))) + (if (numberp z) (setq z (float z))) + (setq rotation (if (numberp rotation) (float rotation) 0.0)) + (setq rec (vsp-rec-neu (cond (id) (blockname) ("(ohne id)")))) + (setq rec (vsp-set rec "kind" "sensor")) + (setq rec (vsp-set rec "dimension" (vsp-dim-text))) + (cond + ((not (and (numberp x) (numberp y) (numberp z))) + (princ (strcat "\n [SENSOR] " (if id id "?") + " - FEHLER: x, y und z muessen Zahlen sein")) + (vsp-set (vsp-set rec "status" "spec-fehler") "fehler_text" + "x, y oder z fehlt bzw. ist keine Zahl")) + (T + (setq pt (list x y z)) + ;; NICHT (and blockname (ssg-ils-block-laden blockname)) - and liefert + ;; T/nil statt des Blocknamen-Strings (siehe CLAUDE.md, and/or-Falle). + (setq eff (if blockname (ssg-ils-block-laden blockname))) + (if (null eff) (setq eff (ssg-ils-block-laden "Separator_SP"))) + (cond + ((null eff) + (princ (strcat "\n [SENSOR] " (if id id "?") + " - FEHLER: weder '" blockname + "' noch Fallback 'Separator_SP' als Blockdatei gefunden")) + (vsp-set (vsp-set rec "status" "abbruch") "fehler_text" + "kein Block gefunden")) + (T + (princ (strcat "\n [SENSOR] " id " '" blockname "' -> (" + (rtos x 2 0) ", " (rtos y 2 0) ", " (rtos z 2 0) + ") R=" (rtos rotation 2 1))) + (command "_.INSERT" eff pt "" "" rotation) + ;; Verbleibende Prompts mit Enter abfangen, aber GEZAEHLT - siehe + ;; mubea:build-separator-one (ein Prompt, der Leer-Antworten + ;; ablehnt, haelt CMDACTIVE sonst dauerhaft > 0). + (setq n 0) + (while (and (> (getvar "CMDACTIVE") 0) (< n 5)) + (command "") + (setq n (1+ n))) + (if (> (getvar "CMDACTIVE") 0) + (progn + (command) + (princ (strcat "\n WARNUNG: INSERT von '" eff + "' nicht sauber beendet - abgebrochen.")))) + (setq ent (entlast)) + (if (atoms-family 1 '("ssg-id-generate")) (ssg-id-generate ent)) + (setq ed (entget ent)) + (princ (strcat " -> Block " (cdr (assoc 2 ed)))) + (setq rec (vsp-set rec "block_name" (cdr (assoc 2 ed)))) + (setq rec (vsp-set rec "block_handle" (cdr (assoc 5 ed)))) + (setq rec (vsp-set rec "insert_point" (cdr (assoc 10 ed)))) + (setq rec (vsp-set rec "attribs" (ssg-attrib-read ent))) + (vsp-set rec "status" "executed")))))) + ;; Alle Zusatzobjekte der Datei bauen. Eigener ssg-start-Rahmen, weil ;; vsp-bau-datei seinen schon geschlossen hat; ATTREQ/ATTDIA 0 ist Pflicht - ;; sonst fragt (command "_.INSERT" ...) nach Attributwerten. -(defun hundm05:bau-zusatzobjekte (datei / daten objekte out rec) +(defun hundm05:bau-zusatzobjekte (datei / daten objekte out rec builder kind) (setq daten (ssg-load-json datei)) (setq objekte '()) (foreach obj daten @@ -127,11 +200,6 @@ (setq objekte (reverse objekte)) (cond ((null objekte) nil) - ((null (car (atoms-family 1 '("KREISEL-INSERT-SCRIPT")))) - (princ (strcat "\n[TEST_HUNDM05] WARNUNG: " (itoa (length objekte)) - " Zusatzobjekt(e) uebersprungen - KreiselInsert nicht" - " geladen.")) - nil) (T (princ (strcat "\n " (itoa (length objekte)) " weitere(s) Objekt(e) der Anlage")) @@ -142,16 +210,28 @@ (setvar "ATTDIA" 0) (setq out '()) (foreach obj objekte - (setq rec (vl-catch-all-apply 'hundm05:bau-kreisel (list obj))) - (if (vl-catch-all-error-p rec) - (progn - (princ (strcat "\n [KREISEL] Ausnahme: " - (vl-catch-all-error-message rec))) - (setq rec (vsp-set (vsp-set (vsp-set - (vsp-rec-neu (ssg-val obj "id")) - "kind" "kreisel") "status" "abbruch") - "fehler_text" - (vl-catch-all-error-message rec))))) + ;; Unterscheidung Kreisel/Sensor ueber "block" (nur Separator/ + ;; Scanner-Eintraege haben es), je eigener Builder + "kind"-Wert. + (setq kind (if (ssg-val obj "block") "sensor" "kreisel")) + (setq builder (if (ssg-val obj "block") 'hundm05:bau-sensor 'hundm05:bau-kreisel)) + (cond + ((and (= kind "kreisel") + (null (car (atoms-family 1 '("KREISEL-INSERT-SCRIPT"))))) + (princ (strcat "\n [KREISEL] " (ssg-val obj "id") + " uebersprungen - KreiselInsert nicht geladen.")) + (setq rec (vsp-set (vsp-set (vsp-rec-neu (ssg-val obj "id")) + "kind" kind) "status" "spec-fehler"))) + (T + (setq rec (vl-catch-all-apply builder (list obj))) + (if (vl-catch-all-error-p rec) + (progn + (princ (strcat "\n [" (strcase kind) "] Ausnahme: " + (vl-catch-all-error-message rec))) + (setq rec (vsp-set (vsp-set (vsp-set + (vsp-rec-neu (ssg-val obj "id")) + "kind" kind) "status" "abbruch") + "fehler_text" + (vl-catch-all-error-message rec))))))) (setq out (cons rec out))) (ssg-end) (reverse out)))) diff --git a/tests/testdata/hm_recformat.json b/tests/testdata/hm_recformat.json index b9ffb11..9017a20 100644 --- a/tests/testdata/hm_recformat.json +++ b/tests/testdata/hm_recformat.json @@ -348,24 +348,24 @@ "anzahl_eingaben": 54, "block": "VF_46", "dxf_handle": "EFD4", - "startpunkt_mm": [8571.95068, 1276.061424, 2494.930831], + "startpunkt_mm": [8572.181, 1226.825, 2154.0], "rotation_grad": 0.0, - "beschreibung": "Linienzug (Modus 1), Start Z2495: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", + "beschreibung": "Linienzug (Modus 1), Start Z2154: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", "sivas_id": "0019", "sivas_bezeichnung": "VarioFoerderer :5", "planquadrat": "D/1", "erwartung_hinweis": "Sivas-Export (EXPORTSIVAS), Strecke 0019: DeltaL_mm=1788, DeltaH_mm=220, Hoehe_Von_mm=2154, Hoehe_Bis_mm=2374, L_GF_m=2.727,0.4,0.418, L_VF_m=0.177,0.339,0.356,0.548, VF_Winkel=0,0,39,0, Anzahl_Separator=3", - "quelle": "INSERT EFD4 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]" + "quelle": "INSERT EFD4 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]; korrigiert per HundM05.dxf (sps_skel) - Startpunkt war faelschlich auf [8571.95068, 1276.061424, 2494.930831] aufgezeichnet (Anschluss an Kreisel hatte Luecke)" }, { "typ": "point_abs", - "wert": [8571.95068, 1276.061424, 2494.930831], + "wert": [8572.181, 1226.825, 2154.0], "kommentar": "getpoint Startpunkt der Kette (absoluter Weltpunkt, einziger Anker der ganzen Kette)" }, { "typ": "real", - "wert": 2494.930831, - "kommentar": "getreal Hoehe (Z) Startpunkt -> 2494.9 mm" + "wert": 2154.0, + "kommentar": "getreal Hoehe (Z) Startpunkt -> 2154.0 mm" }, { "typ": "string", @@ -635,24 +635,24 @@ "anzahl_eingaben": 54, "block": "VF_46", "dxf_handle": "FA5A", - "startpunkt_mm": [12916.465798, 1276.061424, 2494.930831], + "startpunkt_mm": [12916.988, 1237.971, 2154.0], "rotation_grad": 0.0, - "beschreibung": "Linienzug (Modus 1), Start Z2495: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", + "beschreibung": "Linienzug (Modus 1), Start Z2154: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", "sivas_id": "0018", "sivas_bezeichnung": "VarioFoerderer :4", "planquadrat": "F/1", "erwartung_hinweis": "Sivas-Export (EXPORTSIVAS), Strecke 0018: DeltaL_mm=1788, DeltaH_mm=220, Hoehe_Von_mm=2154, Hoehe_Bis_mm=2374, L_GF_m=2.727,0.4,0.418, L_VF_m=0.177,0.339,0.356,0.548, VF_Winkel=0,0,39,0, Anzahl_Separator=3", - "quelle": "INSERT FA5A (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]" + "quelle": "INSERT FA5A (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]; korrigiert per HundM05.dxf (sps_skel) - Startpunkt war faelschlich auf [12916.465798, 1276.061424, 2494.930831] aufgezeichnet (Anschluss an Kreisel hatte Luecke)" }, { "typ": "point_abs", - "wert": [12916.465798, 1276.061424, 2494.930831], + "wert": [12916.988, 1237.971, 2154.0], "kommentar": "getpoint Startpunkt der Kette (absoluter Weltpunkt, einziger Anker der ganzen Kette)" }, { "typ": "real", - "wert": 2494.930831, - "kommentar": "getreal Hoehe (Z) Startpunkt -> 2494.9 mm" + "wert": 2154.0, + "kommentar": "getreal Hoehe (Z) Startpunkt -> 2154.0 mm" }, { "typ": "string", @@ -1209,24 +1209,24 @@ "anzahl_eingaben": 54, "block": "VF_46", "dxf_handle": "104E0", - "startpunkt_mm": [21490.273781, 1195.739767, 2494.930831], + "startpunkt_mm": [21491.319, 1213.582, 2154.0], "rotation_grad": 0.0, - "beschreibung": "Linienzug (Modus 1), Start Z2495: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", + "beschreibung": "Linienzug (Modus 1), Start Z2154: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", "sivas_id": "0008", "sivas_bezeichnung": "VarioFoerderer :3", "planquadrat": "J/1", "erwartung_hinweis": "Sivas-Export (EXPORTSIVAS), Strecke 0008: DeltaL_mm=1788, DeltaH_mm=220, Hoehe_Von_mm=2154, Hoehe_Bis_mm=2374, L_GF_m=2.727,0.4,0.418, L_VF_m=0.177,0.339,0.356,0.548, VF_Winkel=0,0,39,0, Anzahl_Separator=3", - "quelle": "INSERT 104E0 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]" + "quelle": "INSERT 104E0 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]; korrigiert per HundM05.dxf (sps_skel) - Startpunkt war faelschlich auf [21490.273781, 1195.739767, 2494.930831] aufgezeichnet" }, { "typ": "point_abs", - "wert": [21490.273781, 1195.739767, 2494.930831], + "wert": [21491.319, 1213.582, 2154.0], "kommentar": "getpoint Startpunkt der Kette (absoluter Weltpunkt, einziger Anker der ganzen Kette)" }, { "typ": "real", - "wert": 2494.930831, - "kommentar": "getreal Hoehe (Z) Startpunkt -> 2494.9 mm" + "wert": 2154.0, + "kommentar": "getreal Hoehe (Z) Startpunkt -> 2154.0 mm" }, { "typ": "string", diff --git a/tests/testdata/hundm05.json b/tests/testdata/hundm05.json index 37a3269..9936b0a 100644 --- a/tests/testdata/hundm05.json +++ b/tests/testdata/hundm05.json @@ -94,18 +94,18 @@ { "spec_id": "VF_hundm05_LZ_02", "modus": 1, - "start_punkt": [8571.95068, 1276.061424, 2494.930831], - "start_hoehe": 2494.930831, + "start_punkt": [8572.181, 1226.825, 2154.0], + "start_hoehe": 2154.0, "as": 1, "as_winkel": "90", "as_seite": "links", - "beschreibung": "Linienzug (Modus 1), Start Z2495: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", + "beschreibung": "Linienzug (Modus 1), Start Z2154: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", "sivas_id": "0019", "sivas_bezeichnung": "VarioFoerderer :5", "planquadrat": "D/1", "block": "VF_46", "dxf_handle": "EFD4", - "quelle": "INSERT EFD4 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]" + "quelle": "INSERT EFD4 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]; korrigiert per HundM05.dxf (sps_skel) - Startpunkt war faelschlich auf [8571.95068, 1276.061424, 2494.930831] aufgezeichnet (Anschluss an Kreisel hatte Luecke)" }, { "glied": "Linie-GF", @@ -175,18 +175,18 @@ { "spec_id": "VF_hundm05_LZ_03", "modus": 1, - "start_punkt": [12916.465798, 1276.061424, 2494.930831], - "start_hoehe": 2494.930831, + "start_punkt": [12916.988, 1237.971, 2154.0], + "start_hoehe": 2154.0, "as": 1, "as_winkel": "90", "as_seite": "links", - "beschreibung": "Linienzug (Modus 1), Start Z2495: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", + "beschreibung": "Linienzug (Modus 1), Start Z2154: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", "sivas_id": "0018", "sivas_bezeichnung": "VarioFoerderer :4", "planquadrat": "F/1", "block": "VF_46", "dxf_handle": "FA5A", - "quelle": "INSERT FA5A (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]" + "quelle": "INSERT FA5A (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]; korrigiert per HundM05.dxf (sps_skel) - Startpunkt war faelschlich auf [12916.465798, 1276.061424, 2494.930831] aufgezeichnet (Anschluss an Kreisel hatte Luecke)" }, { "glied": "Linie-GF", @@ -337,18 +337,18 @@ { "spec_id": "VF_hundm05_LZ_05", "modus": 1, - "start_punkt": [21490.273781, 1195.739767, 2494.930831], - "start_hoehe": 2494.930831, + "start_punkt": [21491.319, 1213.582, 2154.0], + "start_hoehe": 2154.0, "as": 1, "as_winkel": "90", "as_seite": "links", - "beschreibung": "Linienzug (Modus 1), Start Z2495: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", + "beschreibung": "Linienzug (Modus 1), Start Z2154: GF-Linie 3149 mm / 3 Grad -> Horizontal-VF 1575 mm -> Vario-Kurve 90 rechts innen -> Vario-Kurve 90 rechts innen -> Linie bis Kettenende 1153 mm auf Z2154 -> ES 90 links", "sivas_id": "0008", "sivas_bezeichnung": "VarioFoerderer :3", "planquadrat": "J/1", "block": "VF_46", "dxf_handle": "104E0", - "quelle": "INSERT 104E0 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]" + "quelle": "INSERT 104E0 (Block VF_46) in polylines.dxf, XDATA-App SSG_VF_EDIT, Marker linienzug; im Journal aufgezeichneter Kettenstart: [17201.778323, 1205.360995, 2100.000000]; korrigiert per HundM05.dxf (sps_skel) - Startpunkt war faelschlich auf [21490.273781, 1195.739767, 2494.930831] aufgezeichnet" }, { "glied": "Linie-GF", @@ -427,5 +427,145 @@ "expect_block_prefix": "KREISEL_", "expect_hoehe": "2154", "expect_kreiselart": "STANDARD" + }, + { + "id": "HundM05_SEP_01", + "comment": "Separator 1 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 2355, + "y": 365, + "z": 2154, + "rotation": 0 + }, + { + "id": "HundM05_SEP_02", + "comment": "Separator 2 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 4052.79, + "y": 1165.94, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_02", + "comment": "Scanner zu Separator 2 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 4095.51, + "y": 1164.08, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_03", + "comment": "Separator 3 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 7831.77, + "y": 1169.53, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_03", + "comment": "Scanner zu Separator 3 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 7874.49, + "y": 1167.67, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_04", + "comment": "Separator 4 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 12191.01, + "y": 1168.25, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_04", + "comment": "Scanner zu Separator 4 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 12233.73, + "y": 1166.39, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_05", + "comment": "Separator 5 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 16488.38, + "y": 1171.7, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_05", + "comment": "Scanner zu Separator 5 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 16531.1, + "y": 1169.84, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_06", + "comment": "Separator 6 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 20764.96, + "y": 1166.18, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_06", + "comment": "Scanner zu Separator 6 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 20807.68, + "y": 1164.32, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_07", + "comment": "Separator 7 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "S-LP", + "x": 23738.03, + "y": 1170.63, + "z": 2154, + "rotation": 180 + }, + { + "id": "HundM05_SCANNER_07", + "comment": "Scanner zu Separator 7 (Nachtrag HundM05, reale Koordinate laut Anwender)", + "function": "insert", + "block": "Scanner", + "x": 23780.75, + "y": 1168.77, + "z": 2154, + "rotation": 270 + }, + { + "id": "HundM05_SEP_08", + "comment": "Separator 8 (Nachtrag HundM05, reale Koordinate laut Anwender, ohne zugehoerigen Scanner)", + "function": "insert", + "block": "S-LP", + "x": 24630.12, + "y": 1167.22, + "z": 2154, + "rotation": 180 } ] diff --git a/tests/testdata/object_data.md b/tests/testdata/object_data.md index 7135125..4488269 100644 --- a/tests/testdata/object_data.md +++ b/tests/testdata/object_data.md @@ -649,7 +649,7 @@ Zwei Dateien beschreiben dieselben 5 Ketten, in zwei Formaten: | `tests/testdata/hm_recformat.json` | die **Aufzeichnung**: rohes Eingabe-Journal aus der XDATA der Kundenzeichnung, als Frage-Antwort-Protokoll | `TEST_HM_RECFORMAT` (in `alltests.json` abgeschaltet) | | `tests/testdata/hundm05.json` | die daraus abgeleitete **Spec** (Domaenenwerte statt Menue-Codes, 52 statt 281 Objekte) - hier werden weitere Teile der Anlage nachgetragen | `TEST_HUNDM05` | -In `hundm05.json` stehen neben den Ketten auch **andere Objekte der Anlage**, erkennbar am Feld `function` - Format wie in den jeweiligen Einzel-Testdaten (ein Kreisel also wie in `kreisel_tests.json`, Schema in Abschnitt 1). Damit beschreibt EINE Datei die ganze Anlage. Der Ketten-Uebersetzer ueberspringt diese Objekte (`vsp-gruppieren`), `hundm05:bau-zusatzobjekte` in `tests/test_hundm05.lsp` baut sie, und `lib/vf_spec_export.py` uebernimmt sie beim Neuerzeugen der Spec-Daten. Im Ergebnis-JSON unterscheidet das Feld `kind` die Objektarten (`linienzug` / `kreisel`). +In `hundm05.json` stehen neben den Ketten auch **andere Objekte der Anlage**, erkennbar am Feld `function` - Format wie in den jeweiligen Einzel-Testdaten (ein Kreisel also wie in `kreisel_tests.json`, Schema in Abschnitt 1). Damit beschreibt EINE Datei die ganze Anlage. Der Ketten-Uebersetzer ueberspringt diese Objekte (`vsp-gruppieren`), `hundm05:bau-zusatzobjekte` in `tests/test_hundm05.lsp` baut sie, und `lib/vf_spec_export.py` uebernimmt sie beim Neuerzeugen der Spec-Daten. Im Ergebnis-JSON unterscheidet das Feld `kind` die Objektarten (`linienzug` / `kreisel` / `sensor`). `sensor` sind Separator/Scanner-Eintraege (erkennbar an `block`, Schema wie Abschnitt 5/`mubea.json`) - `hundm05:bau-sensor` baut sie per direktem `_.INSERT` nach, analog zu `mubea:build-separator-one` in `tests/test_mubea.lsp` (`ils-insert-sensor` selbst ist nicht scriptbar). Die Spec ist das Eingabeformat, die Aufzeichnung die Vorlage, an der sie gemessen wird (Rundlauf-Beweis in `tests/test_vf_spec.py`). Warum beide bleiben: die Aufzeichnung ist die einzige eingecheckte Kopie der Originaldaten (`data/polylines.dxf` ist zu gross fuer das Repo) UND der einzige Test dafuer, dass ein BESTEHENDER `VF_n`-Block weiter abspielbar ist - also dass Doppelklick-Edit und 2D/3D-Konvertierung an Altbestand funktionieren. Gebaut wird routinemaessig nur noch aus der Spec, damit nicht zweimal dieselbe Geometrie entsteht.