export: jeden Wert nur an einer Stelle setzen (ZUORDNUNG, sepliste-IDs, Typen, K1/K2)
- ZUORDNUNG: ssg-id-check-all laeuft jetzt ZUERST, danach sind die Wrapper-IDs endgueltig - Separator-Kopien, AS/ES- und Einheiten-Marker bekommen ZUORDNUNG direkt beim Erzeugen. Entfallen: csv:sep-proxies-zuordnung-setzen, csv:asmark-ids-setzen, csv:unitmark-ids-setzen. zuordnung_fix/*cs-sep-fix-by-handle* bleibt (count_sep_scan rechnet eigenstaendige Sensoren bewusst neu). - sepliste-IDs: Zuordnung ueber die KS-Kettenfolge je Typ (csv:sepliste-kette-paare) statt ueber die teils gespiegelten sepliste-Koordinaten (csv:sepliste-paare, csv:sepliste-ids-setzen entfallen). Die Kette wird je Lauf einmal berechnet (csv:kette-von); die ID liest csv:block-to-json erst beim Schreiben. Behebt vertauschte TrackIds/Nachbarn in HundM05 VF_1 (0031/0029). - Element-Klassifizierung: eine Tabelle csv:element-familien (cfg-Muster) fuer Suche und Klassifizierung; csv:proxy-typ entfaellt. - Einheiten-Marker: K1/K2 nur noch in *csv-baustein-by-handle* (csv:geometrie-merken), K1/K2-Attribute und csv:unitmark-k-kos-strings entfallen. Geprueft: HundM05-Export alt/neu headless verglichen - einzige Abweichung ist die korrigierte Reihenfolge in VF_1. LISP-Unit-Tests 303/303. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
e67f7cc1aa
commit
1e6b152d72
+33
-47
@@ -311,15 +311,6 @@
|
||||
;; ------------------------------------------------------------
|
||||
;; TESTS: export.lsp - CSV/KOS-Kodierung
|
||||
;; ------------------------------------------------------------
|
||||
;; Hilfsfunktion der csv:sepliste-paare-Tests: nur (lfdnr index) vergleichen,
|
||||
;; nicht den Fliesskomma-Abstand. Bewusst auf Top-Level (nicht im Testblock):
|
||||
;; per defun IN einem Testblock definierte Funktionen sind in BricsCAD im
|
||||
;; laufenden Durchlauf nicht zuverlaessig gebunden (siehe Ladearchitektur oben).
|
||||
(defun tu-paare (e p)
|
||||
(mapcar (function (lambda (x) (list (nth 0 x) (nth 1 x))))
|
||||
(csv:sepliste-paare e p))
|
||||
)
|
||||
|
||||
(defun tu-tests-export ()
|
||||
(princ "\n[export]")
|
||||
|
||||
@@ -344,40 +335,27 @@
|
||||
;; json-escape: Anfuehrungszeichen maskieren
|
||||
(tu-eq "csv:json-escape/quote" "a\\\"b" (csv:json-escape "a\"b"))
|
||||
|
||||
;; --- csv:sepliste-paare: sepliste-Eintrag <-> ausgepackte Kopie ---------
|
||||
;; Reine Rechenfunktion (Eintraege + Kopien rein, (lfdnr index abstand)
|
||||
;; raus) - hier ohne Zeichnung testbar. Im Export liefert
|
||||
;; csv:sepliste-ids-setzen die Kopien in Erzeugungsreihenfolge; nur der
|
||||
;; Index zaehlt, darum vergleichen die Tests (lfdnr index) statt der
|
||||
;; Fliesskomma-Abstaende.
|
||||
(tu-eq "csv:sepliste-paare/leer" nil (csv:sepliste-paare nil nil))
|
||||
|
||||
;; Gerade Kette AS -> SEP -> SEP -> ES; Kopien bewusst in anderer
|
||||
;; Reihenfolge als die sepliste (die Erzeugungsreihenfolge der Kopien folgt
|
||||
;; der Blockdefinition, nicht der Bauabfolge).
|
||||
(setq _e '(("AS" 1 0.0 0.0) ("SEP" 2 1000.0 0.0) ("SEP" 3 2000.0 0.0) ("ES" 4 3000.0 0.0)))
|
||||
(setq _p '(("SEP" 2000.0 0.0) ("AS" 0.0 0.0) ("ES" 3000.0 0.0) ("SEP" 1000.0 0.0)))
|
||||
(tu-eq "csv:sepliste-paare/kette" '((1 1) (2 3) (3 0) (4 2)) (tu-paare _e _p))
|
||||
|
||||
;; EIN fehlerhafter Koordinatenwert (bekannter Fehlerfall: gespiegeltes x
|
||||
;; bei lfdnr=2) darf die uebrigen Zuordnungen nicht verschieben - die
|
||||
;; exklusive Vergabe teilt dem fehlerhaften Eintrag den Rest zu.
|
||||
(setq _e '(("SEP" 1 1000.0 0.0) ("SEP" 2 -1000.0 -5000.0) ("SEP" 3 3000.0 0.0)))
|
||||
(setq _p '(("SEP" 1000.0 0.0) ("SEP" 2000.0 0.0) ("SEP" 3000.0 0.0)))
|
||||
(tu-eq "csv:sepliste-paare/gespiegelte-koordinate" '((1 0) (2 1) (3 2)) (tu-paare _e _p))
|
||||
|
||||
;; Gleiche Abstaende duerfen kein Paar verschlucken: vl-sort wirft
|
||||
;; Elemente weg, die unter der Vergleichsfunktion gleich sind - deshalb
|
||||
;; sortiert csv:sepliste-paare nach (Abstand, lfdnr, Index).
|
||||
(setq _e '(("SEP" 1 0.0 0.0) ("SEP" 2 0.0 0.0)))
|
||||
(setq _p '(("SEP" 0.0 0.0) ("SEP" 0.0 0.0)))
|
||||
(tu-eq "csv:sepliste-paare/gleiche-abstaende" '((1 0) (2 1)) (tu-paare _e _p))
|
||||
|
||||
;; Typ trennt: eine AS-Kopie wird nie einem SEP-Eintrag zugeteilt, der
|
||||
;; SEP-Eintrag bleibt ohne Partner (und im Export ohne ID).
|
||||
(setq _e '(("AS" 1 0.0 0.0) ("SEP" 2 10.0 0.0)))
|
||||
(setq _p '(("AS" 5.0 0.0)))
|
||||
(tu-eq "csv:sepliste-paare/typ-trennt" '((1 0)) (tu-paare _e _p))
|
||||
;; --- csv:sepliste-kette-paare: sepliste-Eintrag <-> Kettenbaustein -------
|
||||
;; Zuordnung ueber die Reihenfolge je Typ (k-tes AS/SEP/ES der sepliste =
|
||||
;; k-tes der geordneten Kette), Rueckgabe ((lfdnr . index) ...).
|
||||
(tu-nil "csv:sepliste-kette-paare/leer" (csv:sepliste-kette-paare nil nil))
|
||||
;; HundM05-artige Kette: Koordinaten spielen keine Rolle (auch gespiegelte
|
||||
;; x-Werte aendern nichts), Bausteine ohne sepliste-Typ werden uebersprungen.
|
||||
(setq _e '(("AS" 1 0.0 0.0) ("SEP" 2 -9999.0 0.0) ("SEP" 3 2000.0 0.0) ("ES" 4 3000.0 0.0)))
|
||||
(tu-eq "csv:sepliste-kette-paare/kette"
|
||||
'((1 . 0) (2 . 2) (3 . 5) (4 . 7))
|
||||
(csv:sepliste-kette-paare _e
|
||||
'("AS" "STRECKENELEMENT" "SEP" "UMLENKSTATION" "MOTORSTATION" "SEP" "BOGEN" "ES")))
|
||||
;; lfdnr-Reihenfolge zaehlt, nicht die Reihenfolge der Eintraege in der Liste.
|
||||
(setq _e '(("SEP" 3 0.0 0.0) ("AS" 1 0.0 0.0) ("SEP" 2 0.0 0.0)))
|
||||
(tu-eq "csv:sepliste-kette-paare/unsortiert"
|
||||
'((1 . 0) (2 . 1) (3 . 2))
|
||||
(csv:sepliste-kette-paare _e '("AS" "SEP" "SEP")))
|
||||
;; Mehr Eintraege als Bausteine: die ueberzaehligen bleiben ohne Partner.
|
||||
(setq _e '(("AS" 1 0.0 0.0) ("SEP" 2 0.0 0.0) ("SEP" 3 0.0 0.0)))
|
||||
(tu-eq "csv:sepliste-kette-paare/fehlender-baustein"
|
||||
'((1 . 0) (2 . 2))
|
||||
(csv:sepliste-kette-paare _e '("AS" "BOGEN" "SEP" "ES")))
|
||||
|
||||
;; --- csv:asmark-finden: bisherigen AS/ES-Marker im Bestand wiederfinden ---
|
||||
;; Schluessel ist (Wrapper-ID, Typ, lfdnr) - alle drei muessen passen, sonst
|
||||
@@ -415,10 +393,18 @@
|
||||
(vl-symbol-name (car b)))))))
|
||||
(setq *csv-res-sammlung* _rs)
|
||||
|
||||
;; csv:proxy-typ: Typmarker aus dem Blocknamen (Grundlage der Zuordnung).
|
||||
(tu-eq "csv:proxy-typ/as" "AS" (csv:proxy-typ "AS_Element_90_links_3D"))
|
||||
(tu-eq "csv:proxy-typ/es" "ES" (csv:proxy-typ "ES_Element_30_rechts_2D"))
|
||||
(tu-eq "csv:proxy-typ/sep" "SEP" (csv:proxy-typ "Separator_SP_3D"))
|
||||
;; csv:pattern-nested-element: Suchmuster = alle Familienmuster aus
|
||||
;; csv:element-familien - jede Familie ist also auch klassifizierbar.
|
||||
(tu-eq "csv:pattern-nested-element/aus-familien"
|
||||
(ssg-join (mapcar 'cdr (csv:element-familien)) ",")
|
||||
(csv:pattern-nested-element))
|
||||
(tu-true "csv:element-familien/jedes-muster-klassifiziert"
|
||||
(not (vl-some (function (lambda (f)
|
||||
(not (equal (car f) (csv:element-teileart
|
||||
(vl-string-subst "X" "*"
|
||||
(substr (cdr f) 1 (cond ((vl-string-search "," (cdr f)))
|
||||
((strlen (cdr f)))))))))))
|
||||
(csv:element-familien))))
|
||||
|
||||
;; csv:element-teileart: TeileArt-Familie eines ausgepackten VF_n/GF_n-
|
||||
;; Bausteins aus dem Blocknamen (Boegen/Streckenelement/Umlenk-/Motor-
|
||||
|
||||
Reference in New Issue
Block a user