diff --git a/Lisp/Gefaellestrecke.lsp b/Lisp/Gefaellestrecke.lsp index de7fc1b..f4507e4 100644 --- a/Lisp/Gefaellestrecke.lsp +++ b/Lisp/Gefaellestrecke.lsp @@ -665,7 +665,6 @@ (setq endpunkt (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car aktuell-frame) hz grade 300 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq aktuell-frame (make-frame-from-dir endpunkt xu-incl)) ) ) @@ -997,7 +996,6 @@ (setq sep-endpunkt (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car aktuell-frame) exit-hz grade 300 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") ;; Ausgangsrahmen nach Separator fuer ES-Element (setq rad-h-es (* (float exit-hz) (/ pi 180.0))) (setq rad-v-es (* (float grade) (/ pi 180.0))) @@ -1379,7 +1377,6 @@ (setq sep-endpunkt (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car aktuell-frame) hz winkel 300 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq sep-frame (make-frame-from-dir sep-endpunkt xu-incl)) ;; 4/4: EIN-Element (KS-zu-KS) diff --git a/Lisp/export.lsp b/Lisp/export.lsp index c3cc20f..c4e88d3 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -941,9 +941,9 @@ (setq zuordnung-fix-json (strcat ",\"zuordnung_fix\":\"" (csv:json-escape (cdr zuordnung-fix-eintrag)) "\"")) ) - ;; Streckentyp (VF/GF) DIESES EINZELNEN Separators, bauzeitig gesetzt - ;; (ssg-sep-typ-xdata-schreiben, siehe csv:sep-proxies-erzeugen/ - ;; -zuordnung-setzen) - NICHT vom Wrapper-Blocknamen ableitbar, da ein + ;; Streckentyp (VF/GF) DIESES EINZELNEN Separators - der Typ der Einheit, + ;; in der er in der Kette liegt (csv:kette-sep-typen, eingetragen von + ;; csv:ketten-verarbeiten). NICHT vom Wrapper-Blocknamen ableitbar, da ein ;; VF_n/GF_n-Wrapper intern zwischen VF-/GF-Abschnitten wechseln kann. ;; export_csv.py schreibt diesen Wert in die Merkmale der Proxy-Zeile ;; (Feld "Typ"). @@ -1273,16 +1273,12 @@ ) ;; --- Muster des AEUSSEREN Trennsteg-Blocks, der das Separator_SP-Symbol -;; und den Streckentyp-Marker traegt --- -;; ssg-sep-typ-xdata-schreiben (ssg_ks_insert.lsp) markiert bauzeitig NICHT -;; das Separator_SP-Symbol selbst, sondern seinen Verpacker -;; Staustrecke_Separator_SP_300_mm - der Grund: Separator_SP steckt als EIN -;; einziges, von der DWG-Blockdefinition geteiltes Sub-INSERT in JEDER -;; Staustrecke_Separator_SP_300_mm-Instanz (Block-Referenzen teilen sich ihre -;; Definition), eine XDATA-Markierung dort waere also fuer JEDEN Separator -;; der ganzen Zeichnung identisch. Staustrecke_Separator_SP_300_mm selbst ist -;; dagegen pro Einfuegung eine EIGENE Instanz mit eigenem Handle - genau dort -;; setzt der Bau seine Markierung. +;; traegt --- +;; Der Trennsteg Staustrecke_Separator_SP_300_mm ist der Kettenbaustein (mit +;; KS_EIN/KS_AUS, pro Einfuegung eine eigene Instanz); das Separator_SP-Symbol +;; darin steckt als EIN von der Blockdefinition geteiltes Sub-INSERT in jedem +;; Trennsteg und taugt daher nicht als Schluessel fuer einen einzelnen +;; Separator. (defun csv:pattern-nested-separator-aussen () "Staustrecke_Separator_SP_300_mm*" ) @@ -1324,20 +1320,12 @@ ;; Die AS-/ES-Kettenenden laufen NICHT mehr hierueber - fuer sie setzt ;; csv:asmark-aktualisieren einen eigenen Marker (siehe dort). ;; -;; proxy-liste-Eintrag: (proxy-ename wrapper-ename typ (x y z) strecke-typ -;; trennsteg-ent) - trennsteg-ent = der verpackte Trennsteg (Kettenbaustein, -;; Schluessel fuer die ID-Vergabe in Kettenfolge, csv:ketten-ids-vergeben), -;; nil fuer ein Symbol ohne Trennsteg (Kreisel-Separator). -;; strecke-typ = "VF"/"GF"/nil, gelesen von ssg-sep-typ-xdata-lesen AM -;; AEUSSEREN Trennsteg-Insert (csv:pattern-nested-separator-aussen), NICHT am -;; Separator_SP-Symbol selbst (das ist Block-Definitions-geteilt, siehe dort) -;; und NICHT vom Wrapper-Blocknamen abgeleitet (fruehere Fehlannahme, siehe -;; lib/dump_vf_kette_inhalt.py): ein einzelner VF_n/GF_n-Wrapper kann intern -;; mehrfach zwischen Foerderer- und Gefaellestrecke-Abschnitten wechseln, der -;; Marker sitzt daher direkt am jeweiligen Separator-Insert (gesetzt bauzeitig -;; in vf_linienzug.lsp/Gefaellestrecke.lsp/vf_standard.lsp/vf_etage.lsp, -;; direkt nach dessen Einfuegung). Zuordnung Symbol<->Trennsteg ueber die -;; Symbollage innerhalb des Trennstegs (csv:trennsteg-zu-symbol). +;; proxy-liste-Eintrag: (proxy-ename wrapper-ename typ (x y z) trennsteg-ent) +;; - trennsteg-ent = der verpackte Trennsteg (Kettenbaustein, Schluessel fuer +;; die ID-Vergabe in Kettenfolge UND fuer den Streckentyp VF/GF, beides in +;; csv:ketten-verarbeiten), nil fuer ein Symbol ohne Trennsteg (Kreisel- +;; Separator). Zuordnung Symbol<->Trennsteg ueber die Symbollage innerhalb +;; des Trennstegs (csv:trennsteg-zu-symbol). (defun csv:sep-proxies-erzeugen ( / ms recs aussen-paare rec aussen-rec proxy proxy-liste) (setq recs (csv:nested-welt-records (csv:pattern-nested-separator))) (setq aussen-paare (csv:trennsteg-paare @@ -1357,7 +1345,6 @@ (if proxy (setq proxy-liste (cons (list proxy (nth 0 rec) (csv:proxy-typ (nth 2 rec)) (nth 3 rec) - (if aussen-rec (ssg-sep-typ-xdata-lesen (nth 1 aussen-rec))) (if aussen-rec (nth 1 aussen-rec))) proxy-liste))) ) @@ -1368,8 +1355,8 @@ ;; --- Temporaere Kopie je verpacktem uebrigen VF_n/GF_n-Baustein (Bogen/ ;; Streckenelement/Umlenkstation/Motorstation) --- -;; Analog zu csv:sep-proxies-erzeugen, aber ohne die dortige "aussen"/XDATA- -;; Zusatzlogik (die existiert nur fuer Separator wegen SSG_SEP_TYP) und ohne +;; Analog zu csv:sep-proxies-erzeugen, aber ohne die dortige Trennsteg- +;; Zuordnung (Symbol im Trennsteg gibt es nur beim Separator) und ohne ;; ZUORDNUNG-Zuweisung: diese Elemente sind keine einem Carrier zugeordneten ;; Sensoren, sondern die Geometrie des Carriers (VF_n/GF_n) selbst - ARTINR/ ;; LAYER kommen direkt aus den ATTDEFs der kopierten Original-Blockdefinition @@ -1435,27 +1422,16 @@ ;; festgenagelt; cs-zuordnung-lauf uebernimmt sie unveraendert und zaehlt den ;; Separator beim richtigen Carrier. ;; -;; Gleich nebenbei wird der bauzeitig ermittelte Streckentyp (VF/GF) dieses -;; EINZELNEN Separators (nth 4 rec, siehe csv:sep-proxies-erzeugen) ueber -;; *cs-sep-typ-by-handle* festgehalten. csv:block-to-json schreibt den Wert -;; als "strecke_typ" mit in die Proxy-Zeile. NICHT vom Wrapper-Blocknamen -;; ableiten (fruehere Fehlannahme) - ein einzelner VF_n/GF_n-Wrapper kann -;; intern mehrfach zwischen VF- und GF-Abschnitten wechseln. -;; proxy-liste = Records (proxy-ename wrapper-ename typ (x y z) strecke-typ), +;; proxy-liste = Records (proxy-ename wrapper-ename typ (x y z) trennsteg-ent), ;; siehe csv:sep-proxies-erzeugen. Rueckgabe: Anzahl festgenagelter Kopien. (defun csv:sep-proxies-zuordnung-setzen (proxy-liste / rec proxy wrapper wrapper-id - handle gesetzt ohne-id strecke-typ) + handle gesetzt ohne-id) (setq gesetzt 0 ohne-id 0) (setq *cs-sep-fix-by-handle* nil) - (setq *cs-sep-typ-by-handle* nil) (foreach rec proxy-liste (setq proxy (nth 0 rec)) (setq wrapper (nth 1 rec)) (setq handle (cdr (assoc 5 (entget proxy)))) - (setq strecke-typ (nth 4 rec)) - (if strecke-typ - (setq *cs-sep-typ-by-handle* - (cons (cons handle strecke-typ) *cs-sep-typ-by-handle*))) (setq wrapper-id (cdr (assoc "ID" (ssg-attrib-read wrapper)))) (if (and wrapper-id (> (strlen wrapper-id) 0)) (progn @@ -1578,7 +1554,7 @@ ) ;; --- Nach der ID-Vergabe: ID jeder Kopie an ihren sepliste-Eintrag haengen --- -;; proxy-liste = Records (proxy-ename wrapper-ename typ (x y z) strecke-typ) +;; proxy-liste = Records (proxy-ename wrapper-ename typ (x y z) trennsteg-ent) ;; aus csv:sep-proxies-erzeugen (das 5. Feld wird hier nicht gebraucht). ;; MUSS nach ssg-id-check-all laufen: vorher hat eine frisch erzeugte Kopie ;; noch keine ID. @@ -1802,6 +1778,22 @@ (reverse erg) ) +;; --- Streckentyp (VF/GF) jedes Separators einer geordneten Kette --- +;; EINZIGE Quelle fuer das "Typ"-Merkmal der Separator-Zeilen: der Separator +;; erbt den Typ der Einheit, in die csv:kette-einheiten ihn schneidet - also +;; VF fuer den Separator direkt vor der Umlenkstation und jeden Separator +;; zwischen Umlenk- und Motorstation, sonst GF. Damit passen Separator-Typ und +;; Einheiten-Boundingbox per Konstruktion zusammen. +;; typen = Liste der Bausteintypen in Foerderrichtung (siehe csv:kette-typ). +;; Rueckgabe: ((index . "VF"/"GF") ...) fuer jeden "SEP"-Index, aufsteigend. +(defun csv:kette-sep-typen (typen / erg einheit idx) + (foreach einheit (csv:kette-einheiten typen) + (foreach idx (cadr einheit) + (if (= (nth idx typen) "SEP") + (setq erg (cons (cons idx (car einheit)) erg))))) + (vl-sort erg (function (lambda (a b) (< (car a) (car b))))) +) + ;; --- Bounding-Box-Vereinigung mehrerer Entities --- ;; Verallgemeinert csv:get-bbox (siehe dort) von einer Entity auf eine Liste: ;; min/max ueber alle vla-getboundingbox-Ergebnisse, gleiche Fehler- @@ -2437,6 +2429,9 @@ ;; Die Export-CSV ist nach TeileId sortiert, damit stehen die Zeilen jeder ;; Kette jetzt von AS nach ES. Bereits vorhandene IDs (AS/ES-Marker mit ;; reservierter ID vom Wrapper) bleiben unangetastet. +;; Nebenbei (in BEIDEN Modi): Streckentyp VF/GF jeder Separator-Kopie aus +;; ihrer Einheit (csv:kette-sep-typen) nach *cs-sep-typ-by-handle* - +;; csv:block-to-json schreibt ihn als "strecke_typ" in die Separator-Zeile. ;; sep-proxies/element-proxies/asmarks = die Stellvertreter-Listen dieses ;; Laufs (letztes Feld jedes Records = verpackter Baustein). ;; Rueckgabe: Einheiten-Proxy-Records (proxy-ename wrapper-ename typ lfdnr) - @@ -2444,14 +2439,15 @@ (defun csv:ketten-verarbeiten (sep-proxies element-proxies asmarks / alt gruppiert blockname ms traeger r naechste-id wrapper teile einheit lfdnr mark starts - i teil u tr ergebnis res key) + i teil u tr ergebnis res key sep-typen) + (setq *cs-sep-typ-by-handle* nil) (setq alt (csv:unitmark-bestand-loeschen)) (setq gruppiert (= *csv-export-modus* "group_vf_gf")) (if gruppiert (setq blockname (csv:unitmark-blockdef-sicherstellen))) (setq ms (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) ;; Stellvertreter ueber (wrapper baustein) nachschlagbar machen. (foreach r sep-proxies - (if (nth 5 r) (setq traeger (cons (cons (list (nth 1 r) (nth 5 r)) (nth 0 r)) traeger)))) + (if (nth 4 r) (setq traeger (cons (cons (list (nth 1 r) (nth 4 r)) (nth 0 r)) traeger)))) (foreach r element-proxies (if (nth 4 r) (setq traeger (cons (cons (list (nth 1 r) (nth 4 r)) (nth 0 r)) traeger)))) (foreach r asmarks @@ -2461,6 +2457,7 @@ (setq teile (csv:kette-ordnen (csv:kette-teile wrapper) (cdr (assoc 2 (entget wrapper))))) (setq res (ssg-id-res-lesen wrapper)) + (setq sep-typen (csv:kette-sep-typen (mapcar 'car teile))) ;; Einheiten (nur gruppiert); starts = ((erster-index key . proxy) ...) (setq starts nil lfdnr 0) (if (and gruppiert blockname) @@ -2485,12 +2482,17 @@ (cdr (assoc (nth 1 u) res)))) (csv:res-merken wrapper (nth 1 u) (nth 2 u))))) (if (setq tr (cdr (assoc (list wrapper (nth 1 (nth 1 teil))) traeger))) - (if (member (car teil) '("AS" "ES")) - (setq naechste-id (csv:id-vergeben tr naechste-id nil)) - (progn - (setq key (csv:res-key-kette i)) - (setq naechste-id (csv:id-vergeben tr naechste-id (cdr (assoc key res)))) - (csv:res-merken wrapper key tr)))) + (progn + (if (assoc i sep-typen) + (setq *cs-sep-typ-by-handle* + (cons (cons (cdr (assoc 5 (entget tr))) (cdr (assoc i sep-typen))) + *cs-sep-typ-by-handle*))) + (if (member (car teil) '("AS" "ES")) + (setq naechste-id (csv:id-vergeben tr naechste-id nil)) + (progn + (setq key (csv:res-key-kette i)) + (setq naechste-id (csv:id-vergeben tr naechste-id (cdr (assoc key res)))) + (csv:res-merken wrapper key tr))))) (setq i (1+ i))) ) (if gruppiert diff --git a/Lisp/ssg_ks_insert.lsp b/Lisp/ssg_ks_insert.lsp index 985691e..35e21e4 100644 --- a/Lisp/ssg_ks_insert.lsp +++ b/Lisp/ssg_ks_insert.lsp @@ -610,38 +610,6 @@ ent ) -;; --- Streckentyp (VF/GF) EINES Separator-Inserts als XDATA vermerken --- -;; App "SSG_SEP_TYP", einzelne 1000-Gruppe = "VF"/"GF". Anders als die -;; Sepliste (EIN Eintrag je Wrapper, alle Separatoren zusammengefasst) sitzt -;; dieser Marker DIREKT am einzelnen Staustrecke_Separator_SP_300_mm-Insert - -;; noetig, weil ein einzelner VF_n/GF_n-Wrapper intern mehrfach zwischen -;; Foerderer- und Gefaellestrecke-Abschnitten wechseln kann (siehe -;; lib/dump_vf_kette_inhalt.py: HundM05 VF_1 hat 4 Separatoren, 2x VF, 2x GF). -;; Der Wrapper-Blockname (VF_n/GF_n) sagt darueber nichts aus und darf dafuer -;; NICHT herangezogen werden (fruehere Fehlannahme). Aufrufer: die -;; Separator-Einfuegestellen in vf_linienzug.lsp/Gefaellestrecke.lsp/ -;; vf_standard.lsp/vf_etage.lsp, direkt nach gf-insert-hz-with-ks (ueber -;; entlast - zwischen Insert und Tag darf nichts anderes erzeugt werden). -;; Gelesen von csv:sep-proxies-erzeugen (export.lsp) am NESTED-Original -;; (nested-ent), bevor die temporaere Kopie entsteht. -(defun ssg-sep-typ-xdata-schreiben (ent typ) - (if (and ent typ) - (progn - (regapp "SSG_SEP_TYP") - (entmod (append (entget ent) (list (list -3 (list "SSG_SEP_TYP" (cons 1000 typ)))))) - ) - ) - ent -) - -;; Liest den Streckentyp-Marker zurueck. Rueckgabe: "VF"/"GF" oder nil (kein -;; Marker - z.B. Altbestand ohne den neuen Bauzeit-Tag). -(defun ssg-sep-typ-xdata-lesen (ent / xd app-data) - (setq xd (entget ent (list "SSG_SEP_TYP"))) - (setq app-data (cdr (assoc -3 xd))) - (if app-data (cdr (cadr (car app-data))) nil) -) - ;; Liest die Sepliste-XDATA. Rueckgabe: Liste von (typ lfdnr x y), oder nil ;; (kein/unbekanntes Sepliste-XDATA am Entity). (defun ssg-sepliste-xdata-lesen (ent app-name / xd app-data werte) diff --git a/Lisp/vf_etage.lsp b/Lisp/vf_etage.lsp index 40423b1..8147fd4 100644 --- a/Lisp/vf_etage.lsp +++ b/Lisp/vf_etage.lsp @@ -534,7 +534,6 @@ (setq aktueller-punkt (insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt as-hz *vfk-gefaelle-winkel* *vfk-separator-laenge* 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "VF") ;; Ab hier laufende Richtung cur-hz mitfuehren (frame-verkettet). Start = ;; KS_AUS-Richtung des AS (as-hz). Jeder Gefaellebogen dreht cur-hz um seinen @@ -687,7 +686,6 @@ (setq aktueller-punkt (insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt cur-hz *vfk-gefaelle-winkel* *vfk-separator-laenge* 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "VF") ;; 15. ES_30 (verkettet: KS_EIN auf cur-hz; KS_AUS auf der Hauptlinie) (princ (ssg-textf "vfe-step15" (list es-block (rtos cur-hz 2 1)))) diff --git a/Lisp/vf_linienzug.lsp b/Lisp/vf_linienzug.lsp index 26a5707..4d11e93 100644 --- a/Lisp/vf_linienzug.lsp +++ b/Lisp/vf_linienzug.lsp @@ -3474,7 +3474,6 @@ (defun vfl-sep-hz (pt hz / ep) (princ (ssg-text "vfl-sep-horizontal-info")) (setq ep (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" pt hz 0 *vfk-separator-laenge* 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "VF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*)) ep) @@ -6205,7 +6204,6 @@ (setq w (ssg-cfg-or "vario" "gefaelle_winkel" 3)) (setq sep-endpunkt (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz w *vfk-separator-laenge* 0)) - (ssg-sep-typ-xdata-schreiben (entlast) "VF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*)) (make-frame-from-dir sep-endpunkt (hz-winkel->xu hz w)) ) @@ -6224,7 +6222,6 @@ (setq w-eff (if (= typ "GF") winkel (ssg-cfg-or "vario" "gefaelle_winkel" 3))) (setq sep-endpunkt (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz w-eff *vfk-separator-laenge* 0)) - (ssg-sep-typ-xdata-schreiben (entlast) typ) (setq sep-frame (make-frame-from-dir sep-endpunkt (hz-winkel->xu hz w-eff))) (if (boundp '*vfl-acc-separator*) (setq *vfl-acc-separator* (1+ *vfl-acc-separator*))) ; Separator vor ES @@ -7252,7 +7249,6 @@ (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz-neu winkel *vfk-separator-laenge* 0) (hz-winkel->xu hz-neu winkel))) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*)) ) ) @@ -7276,7 +7272,6 @@ (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz-neu winkel *vfk-separator-laenge* 0) (hz-winkel->xu hz-neu winkel))) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*)) (setq letzter-typ "Separator") (setq p-aktuell (car frame)) @@ -9924,7 +9919,6 @@ (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz winkel *vfk-separator-laenge* 0) (hz-winkel->xu hz winkel))) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*)))) (setq frame (vfl-insert-gf-segment (car frame) hz deltaL winkel)) (vfl-acc-gf-seg (/ deltaL (cos (* winkel (/ pi 180.0)))) winkel) @@ -9935,7 +9929,6 @@ (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz winkel *vfk-separator-laenge* 0) (hz-winkel->xu hz winkel))) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*))))) ((= typ "Bogen") (setq bwinkel (nth 3 seg) bseite (nth 4 seg) klass (nth 5 seg)) @@ -10261,7 +10254,6 @@ (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz winkel *vfk-separator-laenge* 0) (hz-winkel->xu hz winkel))) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*)))) (setq frame (vfl-insert-gf-segment (car frame) hz deltaL winkel)) (vfl-acc-gf-seg (/ deltaL (cos (* winkel (/ pi 180.0)))) winkel) @@ -10272,7 +10264,6 @@ (gf-insert-hz-with-ks "Staustrecke_Separator_SP_300_mm" (car frame) hz winkel *vfk-separator-laenge* 0) (hz-winkel->xu hz winkel))) - (ssg-sep-typ-xdata-schreiben (entlast) "GF") (setq *vfl-acc-separator* (1+ *vfl-acc-separator*))))) ((= typ "Bogen") (setq bwinkel (nth 3 seg) bseite (nth 4 seg) klass (nth 5 seg)) diff --git a/Lisp/vf_standard.lsp b/Lisp/vf_standard.lsp index 8e09207..96825ab 100644 --- a/Lisp/vf_standard.lsp +++ b/Lisp/vf_standard.lsp @@ -593,7 +593,6 @@ (ssg-cfg-or "vario" "gefaelle_winkel" 3) (ssg-cfg-or "vario" "separator_block_dx" 300) (ssg-cfg-or "vario" "separator_block_dz" 0) hz)) - (ssg-sep-typ-xdata-schreiben (entlast) "VF") ) ) ;; 3. Umlenkstation @@ -758,7 +757,6 @@ (ssg-cfg-or "vario" "gefaelle_winkel" 3) (ssg-cfg-or "vario" "separator_block_dx" 300) (ssg-cfg-or "vario" "separator_block_dz" 0) hz)) - (ssg-sep-typ-xdata-schreiben (entlast) "VF") ) ) aktueller-punkt diff --git a/doc/csv-export.md b/doc/csv-export.md index ed6c8db..1031f94 100644 --- a/doc/csv-export.md +++ b/doc/csv-export.md @@ -186,6 +186,12 @@ dem Export geloescht, ausser der Debug-Schalter `csv_leave_proxies` ist gesetzt. Reisst die KS-Kette ab, meldet der Export das (`exp-kette-luecke`) und fuehrt den Rest als eigene Teilkette weiter. Die fruehere Gruppierung ueber die sepliste-XDATA und den Separator-Typ (`SSG_SEP_TYP`) ist entfallen. +Auch das Merkmal `Typ` (VF/GF) der Separator-Zeilen kommt aus dieser +Schneidung (`csv:kette-sep-typen`): der Separator erbt den Typ seiner Einheit, +also VF fuer den Separator direkt vor der Umlenkstation und jeden Separator +zwischen Umlenk- und Motorstation, sonst GF. Die fruehere bauzeitige +XDATA-Markierung `SSG_SEP_TYP` an jedem Trennsteg wird nicht mehr geschrieben +oder gelesen - sie war an 15 Einfuegestellen verteilt und dort teils falsch. **Die `bbox` ist das einzige Feld, das `vla-getboundingbox` braucht** — alle anderen Felder kommen aus rohen DXF-Gruppencodes oder XDATA. Ein Ausfall von diff --git a/lib/export_csv.py b/lib/export_csv.py index d0785b8..9a014a7 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -238,11 +238,11 @@ def build_sensor_merkmale(block): Separator_SP-Symbole und traegt die ID des Wrapper-Blocks, in dem das Symbol steckt - eine bekannte, keine geratene Zuordnung. - "strecke_typ" (csv:block-to-json/csv:wrapper-strecke-typ) traegt bei - denselben verpackten Kopien den Streckentyp (VF/GF) des Wrappers, in dem - der Separator steckt - eine Strecke wechselt sich zwingend Foerderer/ - Gefaellestrecke ab. Fehlt bei eigenstaendigen Separator_SP/Scanner- - Bloecken (keinem Wrapper zugeordnet) und bleibt dann leer.""" + "strecke_typ" (csv:block-to-json) traegt bei denselben verpackten Kopien + den Streckentyp (VF/GF) der Einheit, in der der Separator in der Kette + liegt (csv:kette-sep-typen in export.lsp - dieselbe Einheiten-Schneidung + wie die Einheiten-Boundingbox). Fehlt bei eigenstaendigen Separator_SP/ + Scanner-Bloecken (keinem Wrapper zugeordnet) und bleibt dann leer.""" attribs = block.get("attribs", {}) return { "Zuordnung": block.get("zuordnung_fix") or attribs.get("ZUORDNUNG", ""), diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index fb14263..1bbe92c 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -482,6 +482,26 @@ '(("GF" (1 2)) ("VF" (3 4 5))) (csv:kette-einheiten '("AS" "SEP" "BOGEN" "UMLENKSTATION" "STRECKENELEMENT" "MOTORSTATION" "ES"))) + ;; --- csv:kette-sep-typen: Separator erbt den Typ seiner Einheit --- + ;; HundM05 VF_5: Einlauf-Separator vor der Umlenkstation (2) -> VF; der + ;; Separator hinter der Motorstation (11) -> GF; der Separator hinter dem + ;; Gefaellestueck, der zugleich Einlauf der zweiten VF ist (13) -> VF; der + ;; Separator vor dem ES (27) -> GF. + (tu-eq "csv:kette-sep-typen/hundm05" + '((2 . "VF") (11 . "GF") (13 . "VF") (27 . "GF")) + (csv:kette-sep-typen _kette-hundm05)) + ;; Separator INNERHALB der VF (vor der Motorstation) -> VF. + (tu-eq "csv:kette-sep-typen/sep-im-koerper" + '((1 . "VF") (4 . "VF") (7 . "GF")) + (csv:kette-sep-typen '("AS" "SEP" "UMLENKSTATION" "STRECKENELEMENT" "SEP" + "STRECKENELEMENT" "MOTORSTATION" "SEP" "ES"))) + ;; Reine Gefaellestrecke -> alle GF; Kette ohne Separator -> nil. + (tu-eq "csv:kette-sep-typen/nur-gf" + '((1 . "GF") (3 . "GF")) + (csv:kette-sep-typen '("AS" "SEP" "STRECKENELEMENT" "SEP" "ES"))) + (tu-nil "csv:kette-sep-typen/ohne-sep" + (csv:kette-sep-typen '("AS" "STRECKENELEMENT" "ES"))) + ;; --- csv:kette-ordnen: Vektorkette K2 -> K1, unabhaengig von der ;; Eingangsreihenfolge; Start am AS. rec wird dafuer nicht gebraucht (nil). (setq _t-as (list "AS" nil '(0.0 0.0 0.0) '(10.0 0.0 0.0)))