export: Kettenbausteine ueber KS verketten, Einheiten neu gruppieren

K1/K2 und Boundingbox je Export-Zeile folgen jetzt dem echten
Kettenbaustein statt seinem Stellvertreter:
- Separator (all_elements): KS + bbox des 300-mm-Trennstegs statt des
  Sensor-Symbols; separator_track/group_vf_gf behalten das Symbol
- AS/ES (all_elements, group_vf_gf): KS + bbox des AS-/ES-Elements statt
  des 200x200-Markers ohne K
- gemeinsamer Kern csv:ks-welt-punkte; VF/GF-Wrapper-K1/K2 = K1 des AS
  bzw. K2 des ES

Gruppierter Export neu (sepliste-/XDATA-Algorithmus entfernt):
- Bausteine je Wrapper als Vektorkette K2 -> K1 ordnen (Start am AS)
- Foerdereinheit = Separator vor der Umlenkstation bis Motorstation,
  alles dazwischen Gefaelleeinheit (csv:kette-einheiten, Unit-Tests)
- je Einheit ein temporaerer Proxy mit 3D-Boundingbox, K1/K2, Laenge und
  Anzahl Boegen; wird nach dem Export geloescht (ausser csv_leave_proxies)
- IDs neuer Export-Objekte entlang der Kette AS -> ES aufsteigend

Weiteres:
- ssg-make-layer ohne _LAYER-Befehl fuer bestehende Layer (Konsole)
- einheitliche, zweisprachige Meldungen fuer behaltene Hilfskopien
- bin/show_exportcsv.bat: Export-CSV als Boundingbox-SVG (sps_skel)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Michael Stangl
2026-09-25 20:25:29 +02:00
co-authored by Claude Opus 5.5
parent bc481de901
commit 394d476d56
13 changed files with 1017 additions and 1037 deletions
+663 -764
View File
File diff suppressed because it is too large Load Diff
+17 -9
View File
@@ -363,15 +363,23 @@
;; Layer anlegen (falls nicht vorhanden) und optional aktivieren
;; lay-name = Name; color = Farbnummer als String z.B. "2"; set-aktiv = T/nil
;; Farbe wird nur bei Neuanlage gesetzt, bestehende Layer bleiben unveraendert
(defun ssg-make-layer (lay-name color set-aktiv / neu)
(setq neu (not (tblsearch "LAYER" lay-name)))
(if set-aktiv
(command "_LAYER" "_M" lay-name "")
(command "_LAYER" "_N" lay-name "")
)
(if neu
(command "_LAYER" "_CO" color lay-name "")
)
;; Ohne "_LAYER"-Befehl: ein bestehender Layer wird gar nicht angefasst (frueher
;; lief bei JEDEM Aufruf "_LAYER _N" und fuellte die Konsole, z.B. je Export-
;; Marker einmal), ein neuer per entmake angelegt, CLAYER direkt gesetzt. Nur
;; wenn entmake scheitert (ungueltiger Name), bleibt der alte Befehlsweg.
(defun ssg-make-layer (lay-name color set-aktiv / farbe)
(if (not (tblsearch "LAYER" lay-name))
(progn
(setq farbe (atoi (cond (color) ("7"))))
(if (or (< farbe 1) (> farbe 255)) (setq farbe 7))
(if (not (entmake (list '(0 . "LAYER") '(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord") (cons 2 lay-name)
'(70 . 0) (cons 62 farbe) '(6 . "Continuous"))))
(progn
(command "_LAYER" "_N" lay-name "")
(command "_LAYER" "_CO" color lay-name "")))))
(if (and set-aktiv (tblsearch "LAYER" lay-name))
(setvar "CLAYER" lay-name))
)
;; ------------------------------------------------------------
+3 -2
View File
@@ -73,8 +73,9 @@
;; weil der Marker in der Zeichnung stehen bleibt.
(wcmatch bname "ZZ_ASES_MARKER*")
;; ZZ_UNIT_MARKER: die Foerdereinheit-/Gefaelleeinheit-Marker
;; (siehe csv:unitmark-aktualisieren, export.lsp) - aus
;; demselben Grund wie ZZ_ASES_MARKER.
;; (siehe csv:ketten-verarbeiten, export.lsp) - temporaere
;; Export-Proxies, die wie die Separator-Kopien eine ID fuer
;; ihre Export-Zeile brauchen.
(wcmatch bname "ZZ_UNIT_MARKER*")
(wcmatch bname "Separator_SP*,S-LP*,Scanner*")
(wcmatch bname "BTMT-Beladung*,SC_Entladung*")
+73
View File
@@ -0,0 +1,73 @@
@echo off
REM ================================================================
REM DXFMAKROS - Export-CSV als Boundingbox-Draufsicht (SVG) anzeigen
REM ================================================================
REM Zeichnet jede Zeile der Export-CSV (EXPORTCSV) als achsparalleles
REM Rechteck aus Position + Boundingbox, mit Legende und Tooltip je
REM Rechteck sowie den Anschluss-Koordinatensystemen K1-K4 (rotes Kreuz,
REM blaue Linie K1->K2->K3->K4), und oeffnet das Ergebnis im Browser.
REM
REM Die Darstellung uebernimmt sps_skel (bin\material_flow.bat,
REM Option --show-bbs). sps_skel wird neben dxfmakros erwartet
REM (..\sps_skel) oder ueber die Umgebungsvariable SPS_SKEL_HOME.
REM
REM Aufruf:
REM bin\show_exportcsv.bat results\export.csv, alle Zeilen
REM bin\show_exportcsv.bat meine_export.csv andere CSV in results\ (oder Pfad)
REM bin\show_exportcsv.bat export.csv flow ohne VF/GF-Einzelbausteine
REM
REM Ergebnis: %SKEL_RESULTS%\<name>_bbs.svg
REM ================================================================
setlocal
REM Umgebung dxfmakros (DXFM_RESULTS ...)
call "%~dp0setenv.bat" >nul
REM sps_skel suchen
if not defined SPS_SKEL_HOME set "SPS_SKEL_HOME=%DXFMAKRO%\..\sps_skel"
if not exist "%SPS_SKEL_HOME%\bin\material_flow.bat" (
echo FEHLER: sps_skel nicht gefunden: %SPS_SKEL_HOME%
echo SPS_SKEL_HOME auf den sps_skel-Ordner setzen.
endlocal & exit /b 1
)
REM Umgebung sps_skel (SKEL_RESULTS ...) - material_flow.bat ruft setenv
REM zwar selbst auf, SKEL_RESULTS wird hier aber zum Oeffnen der SVG gebraucht.
call "%SPS_SKEL_HOME%\bin\setenv.bat" >nul
REM Eingabe-CSV: Dateiname wird in DXFM_RESULTS gesucht, Pfade bleiben
set "CSV=%~1"
if "%CSV%"=="" set "CSV=export.csv"
if exist "%DXFM_RESULTS%\%CSV%" set "CSV=%DXFM_RESULTS%\%CSV%"
if not exist "%CSV%" (
echo FEHLER: CSV nicht gefunden: %CSV%
echo Erst in BricsCAD EXPORTCSV ausfuehren.
endlocal & exit /b 1
)
for %%F in ("%CSV%") do (
set "CSV=%%~fF"
set "SVG=%SKEL_RESULTS%\%%~nF_bbs.svg"
)
REM Darstellungsmodus: all (Default) oder flow
set "MODE=%~2"
if "%MODE%"=="" set "MODE=all"
REM Alte SVG entfernen, damit nie eine veraltete Ansicht geoeffnet wird
if exist "%SVG%" del "%SVG%"
call "%SPS_SKEL_HOME%\bin\material_flow.bat" --file "%CSV%" --show-bbs %MODE% --show-kx
set "RC=%ERRORLEVEL%"
if not exist "%SVG%" (
echo FEHLER: SVG wurde nicht erzeugt ^(material_flow Exit-Code %RC%^).
endlocal & exit /b 1
)
echo.
echo Boundingbox-Ansicht: %SVG%
REM Vorschau direkt im Standardprogramm fuer .svg (Browser) oeffnen
start "" "%SVG%"
endlocal & exit /b 0
+15 -18
View File
@@ -76,14 +76,12 @@
# Gefaellestrecken-Segmente, Umlenk-/Motorstation). Wie pattern_schleuselement
# liegen sie NICHT als eigener top-level INSERT vor, sondern verpackt in der
# Wrapper-Blockdefinition - die Muster dienen der SUCHE dort
# (csv:nested-welt-records). Eine TEMPORAERE Kopie des jeweiligen Original-
# Blocks wird IMMER erzeugt (csv:element-proxies-erzeugen, wie bei Separator/
# pattern_separator - liefert die Positionsdaten fuer die Gruppierung unten)
# und nach dem Export IMMER wieder geloescht; als EIGENE Export-Zeile
# erscheinen sie aber NUR, wenn *csv-export-alle-elemente* (export.lsp) auf T
# gesetzt ist. Im Default (nil, gruppierter Modus) fasst
# csv:unitmark-aktualisieren sie stattdessen zu Foerdereinheit-/
# Gefaelleeinheit-Zeilen zusammen (siehe pattern_unit_marker). Vario_Kurve_*
# (csv:nested-welt-records). Im Modus all_elements wird je Baustein eine
# TEMPORAERE Kopie erzeugt (csv:element-proxies-erzeugen) und als eigene
# Export-Zeile ausgegeben, danach wieder geloescht. Im gruppierten Modus
# (group_vf_gf, Default) fasst csv:ketten-verarbeiten die Bausteine
# stattdessen zu Foerdereinheit-/Gefaelleeinheit-Zeilen zusammen (siehe
# pattern_unit_marker). Vario_Kurve_*
# ist laut Code-Kommentar (vf_linienzug.lsp) als "nirgends im Projekt
# tatsaechlich eingefuegt" dokumentiert - in der Praxis kommt es doch vor
# (siehe reale HundM05-Exporte), das Muster bleibt darum wirksam.
@@ -93,18 +91,17 @@
# vier Muster wie Separator/Scanner aus (Stueckzahl steckt schon in den
# GF_Bogen_*/VF_Bogen_*/ANZAHL_VF/ANZAHL_GF-Attributen des Wrappers).
#
# pattern_unit_marker: der Marker, den der Export je zusammenhaengendem
# pattern_unit_marker: der Proxy, den der Export im gruppierten Modus je
# Foerderer-Abschnitt ("Foerdereinheit") bzw. Gefaelle-Abschnitt
# ("Gefaelleeinheit") einer VF_n/GF_n-Kette setzt (ZZ_UNIT_MARKER, ein
# Rechteck auf der Bounding-Box-Vereinigung aller enthaltenen Boegen/
# Streckenelemente/Umlenk-/Motorstation-Mitglieder, csv:unitmark-
# aktualisieren in Lisp/export.lsp). Bleibt wie ZZ_ASES_MARKER dauerhaft in
# der Zeichnung stehen und behaelt seine ID ueber Exportlaeufe hinweg
# (Attribute ID/ZUORDNUNG/TYP/LFDNR/LAENGE_m/ANZAHL_BOEGEN/K1/K2, alle
# unsichtbar). Nur aktiv im gruppierten Modus (*csv-export-alle-elemente* =
# nil) - im Rohdaten-Modus werden keine neuen Marker angelegt, verwaiste
# Marker (z.B. nach einem Wechsel gruppiert->roh) werden aber immer
# aufgeraeumt. export_sivas.py schliesst dieses Muster wie die vier
# Rechteck auf der Bounding-Box-Vereinigung der enthaltenen Bausteine,
# csv:ketten-verarbeiten in Lisp/export.lsp). Die Kette wird dafuer als
# Vektorkette K2 -> K1 geordnet; eine Foerdereinheit reicht vom Separator vor
# der Umlenkstation bis zur Motorstation, alles dazwischen ist Gefaelle.
# Der Proxy ist ein reines Export-Hilfsmittel: er wird bei jedem Export neu
# erzeugt und danach geloescht, ausser der Debug-Schalter csv_leave_proxies
# ist gesetzt (Attribute ID/ZUORDNUNG/TYP/LFDNR/LAENGE_m/ANZAHL_BOEGEN/K1/K2,
# alle unsichtbar). export_sivas.py schliesst dieses Muster wie die vier
# pattern_nested_*-Muster aus (Stueckzahl steckt in ANZAHL_VF/ANZAHL_GF).
# ============================================================
+15 -23
View File
@@ -1,35 +1,27 @@
// ============================================================
// 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*).
// export.lsp). Steuert *csv-export-modus* (Combobox mit drei sich
// gegenseitig ausschliessenden Eintraegen) 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).
// popup_list statt radio_column: set_tile/get_tile auf einer
// boxed_radio_column liefern/erwarten den KEY des gewaehlten radio_button
// (String, z.B. "modus_all"), nicht den numerischen Index - das widersprach
// der urspruenglichen Annahme in csv:export-konfig-init/-accept (idx als
// "0"/"1"/"2" behandelt) und liess die Vorbelegung beim erneuten Oeffnen
// immer auf die erste Option zurueckfallen. popup_list ist eindeutig
// index-basiert (siehe dcl/sprache.dcl + SSG_LIB_Commands.lsp
// ssg-sprache-init/-accept, dasselbe Muster).
// ============================================================
csv_export_konfig : dialog {
label = "CSV-Export Konfiguration";
: boxed_radio_column {
label = "Export-Modus:";
: popup_list {
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)";
}
label = "Export-Modus:";
width = 55;
}
spacer;
+52 -3
View File
@@ -104,8 +104,8 @@ Pro INSERT wird ein JSON-Objekt geschrieben:
| `x`, `y`, `z`, `rotation` | `(assoc 10)` / `(assoc 50)` | roher Einfuegepunkt/-winkel, KEIN `vla-getboundingbox` |
| `attribs` | alle ATTRIB-Werte | |
| `insertpoint` | `csv:kos-encode` | Position+Rotation als 24-Zeichen-Base64 (Quaternion) |
| `k1`..`k4` | `csv:get-k-kos-strings` bzw. Fallbacks | Anschluss-Koordinatensysteme, siehe unten |
| `bbox` | `csv:get-bbox` (`vla-getboundingbox`) | NUR wenn `include-bbox=T` und der Aufruf gelingt; fehlt sonst komplett im JSON |
| `k1`..`k4` | `csv:k-liste` (Kern `csv:ks-welt-punkte`) bzw. Fallbacks | Anschluss-Koordinatensysteme, siehe unten |
| `bbox` | `csv:get-bbox` (`vla-getboundingbox`), im Modus `all_elements` fuer Separator/AS/ES die des Bausteins (`csv:baustein-merken`) | NUR wenn `include-bbox=T` und der Aufruf gelingt; fehlt sonst komplett im JSON |
| `warnung` | `*cs-scanner-warnung-by-handle*` | strittige Scanner-Zuordnung aus `cs-zuordnung-lauf` |
| `zuordnung_fix` | `*cs-sep-fix-by-handle*` | nur bei Proxy-Kopien: die feststehende Wrapper-ID |
| `sepliste` | `ssg-sepliste-xdata-lesen` + `*csv-sepliste-id-by-handle*` | nur bei VF_n/GF_n, siehe eigener Abschnitt |
@@ -116,7 +116,56 @@ Laenge+Rotation synthetisiert (`csv:gerade-k-kos-strings`). VF_n/GF_n leiten
K1 (Eingang) und K2 (Ausgang) aus den eingebetteten AS_Element/ES_Element ab
(`csv:vfgf-k-kos-strings`), damit die Kreisel<->Strecke-Kollisionspruefung in
Python mit einer kleinen festen Box an der AS/ES-Position arbeiten kann statt
mit der ganzen (oft sehr langen) Wrapper-Box.
mit der ganzen (oft sehr langen) Wrapper-Box. K1 des Wrappers ist dabei K1
des AS, K2 der K2 des ES (`csv:vfgf-element-punkte`, dieselbe Rechnung wie
deren eigene Zeilen).
**Kettenteile: Stellvertreter vs. Baustein.** Innerhalb einer VF_n/GF_n-Kette
gilt fuer jedes Teil K1 = KS_EIN, K2 = KS_AUS des Bausteins - K2 eines Teils
ist exakt K1 des naechsten. Bogen/Streckenelement/Motor-/Umlenkstation werden
als 1:1-Kopie exportiert und erfuellen das von selbst. Separator und AS/ES
exportieren dagegen einen **Stellvertreter**: die Kopie des Sensor-Symbols
`Separator_SP` (sitzt 235 mm weit im 300-mm-Trennsteg
`Staustrecke_Separator_SP_300_mm`, hat nur EIN eigenes KS) bzw. den
`ZZ_ASES_MARKER` (200x200, ohne KS). Was die Zeile fuehrt, haengt am Modus:
| Modus | Separator | AS/ES |
|---|---|---|
| `all_elements` | K1/K2 + bbox des Trennstegs | K1/K2 + bbox des AS-/ES-Elements (AS: K1 Kreisel, K2 Kettenanfang; ES: K1 Kettenende, K2 Kreisel) |
| `group_vf_gf` | KS + bbox des Symbols | wie `all_elements` (schliesst an die Einheiten an) |
| `separator_track` | KS + bbox des Symbols | bbox des Markers, keine K |
IDs der neuen Export-Objekte jeder Kette (Separator-/Element-Kopien, neue
AS/ES-Marker, Einheiten-Proxies) werden vor `ssg-id-check-all` entlang der
Kette von AS nach ES aufsteigend vergeben (`csv:ketten-verarbeiten`) - die
CSV ist nach TeileId sortiert, die Zeilen stehen damit in Kettenfolge.
Umgesetzt ueber `csv:baustein-merken`: beim Erzeugen des Stellvertreters
werden K-Punkte (`csv:ks-welt-punkte`) und bbox (kurzlebige Kopie des
Bausteins, `csv:baustein-bbox`) unter seinem Handle gemerkt
(`*csv-baustein-by-handle*`, je Lauf neu); `csv:k-liste` und
`csv:block-to-json` bevorzugen diese Werte. Der Trennsteg eines Symbols wird
ueber die Lage des Symbols IM Trennsteg gefunden (`csv:trennsteg-zu-symbol`),
nicht ueber den naechsten Ursprung.
**Gruppierter Modus (`group_vf_gf`): Foerder-/Gefaelleeinheiten.** Eine
VF_n/GF_n-Kette wechselt zwischen Gefaelle- und Foerderabschnitten (GF, VF,
GF, ...). `csv:ketten-verarbeiten` holt je Wrapper alle Bausteine samt
Welt-KS (`csv:kette-teile`: AS, Trennstege, Boegen, Streckenelemente,
Umlenk-/Motorstation, ES), ordnet sie als **Vektorkette** - auf K2 eines
Bausteins liegt K1 des naechsten, Start am AS (`csv:kette-ordnen`, Toleranz
2 mm) - und schneidet die Typfolge in Einheiten (`csv:kette-einheiten`):
eine **Foerdereinheit** beginnt am Separator vor der Umlenkstation und endet
mit der Motorstation, alles dazwischen ist eine **Gefaelleeinheit**; AS/ES
bleiben eigene Zeilen. Kurven sind dabei kein Problem, weil nur die
KS-Nachbarschaft zaehlt. Je Einheit entsteht ein Proxy `ZZ_UNIT_MARKER` auf
der vereinigten Boundingbox (gemessen an kurzlebigen Kopien der Bausteine),
mit K1 vom ersten und K2 vom letzten Baustein, `LAENGE_m` = Summe der
Streckenelement-Laengen K1->K2, `ANZAHL_BOEGEN`. Alle Proxies werden nach
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.
**Die `bbox` ist das einzige Feld, das `vla-getboundingbox` braucht** — alle
anderen Felder kommen aus rohen DXF-Gruppencodes oder XDATA. Ein Ausfall von
+9
View File
@@ -711,6 +711,15 @@
"exp-asmark-blockdef-fehler": "\n[EXPORT] WARNUNG: Blockdefinition '%1' konnte nicht angelegt werden - es werden keine AS/ES-Marker gesetzt.",
"exp-asmark-bilanz": "\n[EXPORT] AS/ES-Marker: %1 neu, %2 mit bisheriger ID uebernommen, %3 verwaiste entfernt.",
"exp-asmark-ids": "\n[EXPORT] %1 AS/ES-Marker mit ihrer ID am sepliste-Eintrag vermerkt.",
"exp-unitmark-blockdef": "\n[EXPORT] Blockdefinition '%1' fuer die Einheiten-Proxies angelegt.",
"exp-unitmark-blockdef-fehler": "\n[EXPORT] WARNUNG: Blockdefinition '%1' konnte nicht angelegt werden - es werden keine Foerder-/Gefaelleeinheiten exportiert.",
"exp-unitmark-bilanz": "\n[EXPORT] Foerder-/Gefaelleeinheiten: %1 Proxy(s) erzeugt, %2 alte entfernt.",
"exp-unitmark-ids": "\n[EXPORT] %1 Einheiten-Proxy(s) mit ID versehen.",
"exp-kette-luecke": "\n[EXPORT] WARNUNG: Kette '%1' reisst ab (kein K1 auf dem letzten K2) - %2 Baustein(e) als eigene Teilkette weitergefuehrt, Einheitengrenzen dort pruefen.",
"exp-hilfskopien-behalten": "\n[EXPORT] csv_leave_proxies=1: %1 %2 bleiben in der Zeichnung (Abschalten: (dbg-schalter-off \"csv_leave_proxies\"))",
"exp-art-separator": "Separator-Kopie(n)",
"exp-art-element": "Element-Kopie(n)",
"exp-art-einheit": "Einheiten-Proxy(s)",
"exp-update-hoehe-drehung": "\n[%1] Aktualisiere Hoehe/Drehung...",
"exp-collect-blocks": "\n[%1] Sammle relevante Bloecke...",
"exp-no-blocks-found": "\n[%1] Keine relevanten Bloecke gefunden.",
+9
View File
@@ -711,6 +711,15 @@
"exp-asmark-blockdef-fehler": "\n[EXPORT] WARNING: block definition '%1' could not be created - no AS/ES markers are placed.",
"exp-asmark-bilanz": "\n[EXPORT] AS/ES markers: %1 new, %2 kept with their previous ID, %3 orphaned ones removed.",
"exp-asmark-ids": "\n[EXPORT] %1 AS/ES marker ID(s) recorded at their sepliste entry.",
"exp-unitmark-blockdef": "\n[EXPORT] Block definition '%1' for the unit proxies created.",
"exp-unitmark-blockdef-fehler": "\n[EXPORT] WARNING: block definition '%1' could not be created - no conveyor/gravity units are exported.",
"exp-unitmark-bilanz": "\n[EXPORT] Conveyor/gravity units: %1 proxy(s) created, %2 old ones removed.",
"exp-unitmark-ids": "\n[EXPORT] %1 unit proxy(s) given an ID.",
"exp-kette-luecke": "\n[EXPORT] WARNING: chain '%1' is broken (no K1 at the last K2) - %2 element(s) continued as a separate sub-chain, check the unit boundaries there.",
"exp-hilfskopien-behalten": "\n[EXPORT] csv_leave_proxies=1: %1 %2 remain in the drawing (switch off: (dbg-schalter-off \"csv_leave_proxies\"))",
"exp-art-separator": "separator copy(ies)",
"exp-art-element": "element copy(ies)",
"exp-art-einheit": "unit proxy(ies)",
"exp-update-hoehe-drehung": "\n[%1] Updating height/rotation...",
"exp-collect-blocks": "\n[%1] Collecting relevant blocks...",
"exp-no-blocks-found": "\n[%1] No relevant blocks found.",
+10 -4
View File
@@ -274,7 +274,7 @@ def build_element_merkmale(block):
def build_einheit_merkmale(block):
"""Merkmale-Dict fuer eine Foerdereinheit-/Gefaelleeinheit-Zeile (ZZ_UNIT_
MARKER, siehe csv:unitmark-aktualisieren in export.lsp und
MARKER, siehe csv:ketten-verarbeiten in export.lsp und
pattern_unit_marker in cfg/export.cfg).
LAENGE_m/ANZAHL_BOEGEN kommen direkt aus den ATTDEFs des Markers - dort
@@ -282,9 +282,15 @@ def build_einheit_merkmale(block):
zugeordneten Streckenelement-Mitglieder bzw. Anzahl der Bogen-Mitglieder).
Python hat im gruppierten Modus KEINEN Zugriff auf die Einzelteile selbst
(die werden dort gar nicht erst exportiert), daher keine eigene
Neuberechnung hier."""
Neuberechnung hier.
"Zuordnung" ist die ID des VF_n/GF_n-Wrappers, aus dem diese Einheit
stammt (ATTDEF ZUORDNUNG, von csv:ketten-verarbeiten gesetzt) -
dieselbe Bedeutung wie "Zuordnung" bei build_sensor_merkmale, nur eine
Ebene hoeher (Einheit -> Strecke statt Sensor -> Carrier)."""
attribs = block.get("attribs", {})
return {
"Zuordnung": attribs.get("ZUORDNUNG", ""),
"Laenge_m": attribs.get("LAENGE_m", ""),
"Anzahl_Boegen": attribs.get("ANZAHL_BOEGEN", ""),
}
@@ -1034,8 +1040,8 @@ def process_blocks(blocks, lookup, dbg=None):
continue
# ZZ_UNIT_MARKER (siehe cfg/export.cfg pattern_unit_marker sowie
# csv:unitmark-aktualisieren in Lisp/export.lsp): der persistente
# Marker, den Lisp je zusammenhaengendem Foerderer-/Gefaelle-Abschnitt
# csv:ketten-verarbeiten in Lisp/export.lsp): der temporaere
# Proxy, den Lisp je zusammenhaengendem Foerderer-/Gefaelle-Abschnitt
# einer VF_n/GF_n-Kette setzt (gruppierter Modus, Default). TYP
# entscheidet VF->Foerdereinheit / GF->Gefaelleeinheit, analog zur
# AS/ES-Klassifikation oben. K1/K2 brauchen keine Sonderbehandlung -
+1 -1
View File
@@ -416,7 +416,7 @@ SKIP_BLOCKS = set(BLOCKPATTERNS.get("pattern_ks_subblocks", ["K1", "K2", "K3", "
# siehe csv:element-proxies-erzeugen, export.lsp; nur im Rohdaten-Modus
# *csv-export-alle-elemente*=T ueberhaupt in export_raw.json vorhanden) sowie
# fuer die gruppierten Foerdereinheit-/Gefaelleeinheit-Marker (ZZ_UNIT_MARKER,
# csv:unitmark-aktualisieren, Default-Modus): ihre Stueckzahl steckt bereits
# csv:ketten-verarbeiten, Default-Modus): ihre Stueckzahl steckt bereits
# in den GF_Bogen_*/VF_Bogen_*/ANZAHL_VF/ANZAHL_GF-Attributen des Wrappers
# (*strecke-attr-gruppe*, ssg_core.lsp) - ein eigener Sivas-Eintrag wuerde
# ebenso doppelt zaehlen. Muss VOR der pattern_strecke_module-Pruefung unten
+98 -136
View File
@@ -530,229 +530,217 @@
<Command>^C^C(ssg-ensure "OmniModulInsert") OMNI_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00114">
<MenuMacro UID="MM_00113">
<Macro>
<Name>Rohrabhaenger</Name>
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_ROHRABHAENGER</Command>
<Name>Geruest...</Name>
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00116">
<Macro>
<Name>2 Zoll Saeulen</Name>
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_SAEULE_2ZOLL</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00117">
<Macro>
<Name>1 Zoll Saeulen</Name>
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_SAEULE_1ZOLL</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00118">
<Macro>
<Name>Wandbefestigung</Name>
<Command>^C^C(ssg-ensure "GeruestInsert") GERUEST_WANDBEFESTIGUNG</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00121">
<Macro>
<Name>Marker einfuegen</Name>
<Command>^C^C(ssg-ensure "Tro_Edit") TRO_INSERT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00122">
<MenuMacro UID="MM_00117">
<Macro>
<Name>Marker bearbeiten</Name>
<Command>^C^C(ssg-ensure "Tro_Edit") TRO_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00123">
<MenuMacro UID="MM_00118">
<Macro>
<Name>Bearbeiten (Auto)</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00125">
<MenuMacro UID="MM_00120">
<Macro>
<Name>Verbindung einfuegen</Name>
<Command>^C^C(ssg-ensure "Connection_Edit") CONNECTION_INSERT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00126">
<MenuMacro UID="MM_00121">
<Macro>
<Name>Verbindung bearbeiten</Name>
<Command>^C^C(ssg-ensure "Connection_Edit") CONNECTION_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00128">
<MenuMacro UID="MM_00123">
<Macro>
<Name>Eingang</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") ILS_EINGANG_INSERT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00129">
<MenuMacro UID="MM_00124">
<Macro>
<Name>Ausgang</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") ILS_AUSGANG_INSERT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00130">
<MenuMacro UID="MM_00125">
<Macro>
<Name>SPS Schliessen</Name>
<Command>^C^C</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00132">
<MenuMacro UID="MM_00127">
<Macro>
<Name>Export Sivas</Name>
<Command>^C^C(ssg-ensure "export") EXPORTSIVAS</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00133">
<MenuMacro UID="MM_00128">
<Macro>
<Name>Export CSV</Name>
<Command>^C^C(ssg-ensure "export") EXPORTCSV</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00135">
<MenuMacro UID="MM_00130">
<Macro>
<Name>Umschalten 2D und 3D</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_SWITCH</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00136">
<MenuMacro UID="MM_00131">
<Macro>
<Name>Alle Bloecke auf 2D</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_2D</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00137">
<MenuMacro UID="MM_00132">
<Macro>
<Name>Alle Bloecke auf 3D</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_DIM_ALL_3D</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00138">
<MenuMacro UID="MM_00133">
<Macro>
<Name>Sprache</Name>
<Command>^C^C(ssg-ensure "SSG_LIB_Commands") SSG_SPRACHE</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00139">
<MenuMacro UID="MM_00134">
<Macro>
<Name>Planquadrate an/aus</Name>
<Command>^C^C(ssg-ensure "DrawPlanquadrate") PLANQUADRATE_TOGGLE</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00142">
<MenuMacro UID="MM_00135">
<Macro>
<Name>CSV-Export</Name>
<Command>^C^C(ssg-ensure "export") CSV_EXPORT_KONFIG</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00137">
<Macro>
<Name>alle Tests ausfuehren und exportieren</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) SSG_RUN_ALL_TESTS_EXPORT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00143">
<MenuMacro UID="MM_00138">
<Macro>
<Name>Tests ausfuehren und stehen lassen</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_run_all.lsp")) SSG_RUN_ALL_TESTS_OFFEN</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00144">
<MenuMacro UID="MM_00139">
<Macro>
<Name>Export CSV/Sivas ALL</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_export_all.lsp")) TEST_EXPORT_ALL</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00146">
<MenuMacro UID="MM_00141">
<Macro>
<Name>Kreisel</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_kreisel.lsp")) TEST_KREISEL</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00147">
<MenuMacro UID="MM_00142">
<Macro>
<Name>Foerderer</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_foerderer.lsp")) TEST_FOERDERER</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00148">
<MenuMacro UID="MM_00143">
<Macro>
<Name>Foerderer-Linienzug</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_linienzug.lsp")) TEST_LINIENZUG TEST_LINIENZUG_STUFE2</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00149">
<MenuMacro UID="MM_00144">
<Macro>
<Name>Omniflo</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo.lsp")) TEST_OMNIFLO</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00150">
<MenuMacro UID="MM_00145">
<Macro>
<Name>Omniflo Strecke</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_omniflo_strecke.lsp")) TEST_OMNIFLO_STRECKE</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00151">
<MenuMacro UID="MM_00146">
<Macro>
<Name>Gefaellestrecke</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_gefaellestrecke.lsp")) TEST_GEFAELLESTRECKE</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00152">
<MenuMacro UID="MM_00147">
<Macro>
<Name>Mubea Gesamtmodell</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_mubea.lsp")) TEST_MUBEA</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00153">
<MenuMacro UID="MM_00148">
<Macro>
<Name>HundM05 Kreisel-Abschnitt</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/tests/test_hundm05.lsp")) TEST_HUNDM05</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00154">
<MenuMacro UID="MM_00149">
<Macro>
<Name>KS 2D/3D pruefen (CSV)</Name>
<Command>^C^C(load (strcat (getenv "DXFMAKRO") "/Lisp/ks_pruefung.lsp")) KS_PRUEFEN</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00166">
<MenuMacro UID="MM_00161">
<Macro>
<Name>Kreisel bearbeiten</Name>
<Command>(ssg-ensure "KreiselInsert") KreiselEdit</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00167">
<MenuMacro UID="MM_00162">
<Macro>
<Name>Omniflo Element bearbeiten</Name>
<Command>(ssg-ensure "OmniModulInsert") OMNI_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00168">
<MenuMacro UID="MM_00163">
<Macro>
<Name>Gefaellestrecke bearbeiten</Name>
<Command>(ssg-ensure "Gefaellestrecke") GEFAELLESTRECKE_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00169">
<MenuMacro UID="MM_00164">
<Macro>
<Name>VarioFoerderer bearbeiten</Name>
<Command>(ssg-ensure "VarioFoerderer") VARIOFOERDERER_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00170">
<MenuMacro UID="MM_00165">
<Macro>
<Name>TRO-Marker bearbeiten</Name>
<Command>(ssg-ensure "Tro_Edit") TRO_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00171">
<MenuMacro UID="MM_00166">
<Macro>
<Name>Verbindung bearbeiten</Name>
<Command>(ssg-ensure "Connection_Edit") CONNECTION_EDIT</Command>
</Macro>
</MenuMacro>
<MenuMacro UID="MM_00173">
<MenuMacro UID="MM_00168">
<Macro>
<Name>SSG Bearbeiten (Auto)</Name>
<Command>(ssg-ensure "SSG_LIB_Commands") SSG_BLOCKEDIT</Command>
@@ -769,11 +757,16 @@
<Name>SSG_LIB</Name>
<PopMenuRef pUID="PM_00005"/>
<PopMenuRef pUID="PM_00031"/>
<PopMenuRef pUID="PM_00113"/>
<PopMenuRef pUID="PM_00119"/>
<PopMenuRef pUID="PM_00131"/>
<PopMenuRef pUID="PM_00134"/>
<PopMenuRef pUID="PM_00141"/>
<PopMenuItem>
<NameRef>Geruest...</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00113"/>
</MenuItem>
</PopMenuItem>
<PopMenuRef pUID="PM_00114"/>
<PopMenuRef pUID="PM_00126"/>
<PopMenuRef pUID="PM_00129"/>
<PopMenuRef pUID="PM_00136"/>
</PopMenu>
<PopMenu UID="PM_00005">
<Name>ILS</Name>
@@ -1366,276 +1359,245 @@
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00113">
<Name>Geruest</Name>
<PopMenuItem>
<NameRef>Rohrabhaenger</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00114"/>
</MenuItem>
</PopMenuItem>
<PopMenuRef pUID="PM_00115"/>
<PopMenuItem>
<NameRef>Wandbefestigung</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00118"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00115">
<Name>Saeulen</Name>
<PopMenuItem>
<NameRef>2 Zoll Saeulen</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00116"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>1 Zoll Saeulen</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00117"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00119">
<PopMenu UID="PM_00114">
<Name>SPS</Name>
<PopMenuRef pUID="PM_00120"/>
<PopMenuRef pUID="PM_00124"/>
<PopMenuRef pUID="PM_00115"/>
<PopMenuRef pUID="PM_00119"/>
<PopMenuItem>
<NameRef>Eingang</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00128"/>
<MacroRef MenuMacroID="MM_00123"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Ausgang</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00129"/>
<MacroRef MenuMacroID="MM_00124"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>SPS Schliessen</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00130"/>
<MacroRef MenuMacroID="MM_00125"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00120">
<PopMenu UID="PM_00115">
<Name>TRO</Name>
<PopMenuItem>
<NameRef>Marker einfuegen</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00121"/>
<MacroRef MenuMacroID="MM_00116"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Marker bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00122"/>
<MacroRef MenuMacroID="MM_00117"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Bearbeiten (Auto)</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00123"/>
<MacroRef MenuMacroID="MM_00118"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00124">
<PopMenu UID="PM_00119">
<Name>Connections</Name>
<PopMenuItem>
<NameRef>Verbindung einfuegen</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00125"/>
<MacroRef MenuMacroID="MM_00120"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Verbindung bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00126"/>
<MacroRef MenuMacroID="MM_00121"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Bearbeiten (Auto)</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00123"/>
<MacroRef MenuMacroID="MM_00118"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00131">
<PopMenu UID="PM_00126">
<Name>Export</Name>
<PopMenuItem>
<NameRef>Export Sivas</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00132"/>
<MacroRef MenuMacroID="MM_00127"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Export CSV</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00133"/>
<MacroRef MenuMacroID="MM_00128"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00134">
<PopMenu UID="PM_00129">
<Name>Konfiguration</Name>
<PopMenuItem>
<NameRef>Umschalten 2D und 3D</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00135"/>
<MacroRef MenuMacroID="MM_00130"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Alle Bloecke auf 2D</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00136"/>
<MacroRef MenuMacroID="MM_00131"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Alle Bloecke auf 3D</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00137"/>
<MacroRef MenuMacroID="MM_00132"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Sprache</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00138"/>
<MacroRef MenuMacroID="MM_00133"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Planquadrate an/aus</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00139"/>
<MacroRef MenuMacroID="MM_00134"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Konfiguration Schliessen</NameRef>
<NameRef>CSV-Export</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00130"/>
<MacroRef MenuMacroID="MM_00135"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00141">
<PopMenu UID="PM_00136">
<Name>Tests</Name>
<PopMenuItem>
<NameRef>alle Tests ausfuehren und exportieren</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00142"/>
<MacroRef MenuMacroID="MM_00137"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Tests ausfuehren und stehen lassen</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00143"/>
<MacroRef MenuMacroID="MM_00138"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Export CSV/Sivas ALL</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00144"/>
<MacroRef MenuMacroID="MM_00139"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem IsSeparator="true"/>
<PopMenuItem>
<NameRef>Kreisel</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00146"/>
<MacroRef MenuMacroID="MM_00141"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Foerderer</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00147"/>
<MacroRef MenuMacroID="MM_00142"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Foerderer-Linienzug</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00148"/>
<MacroRef MenuMacroID="MM_00143"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Omniflo</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00149"/>
<MacroRef MenuMacroID="MM_00144"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Omniflo Strecke</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00150"/>
<MacroRef MenuMacroID="MM_00145"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Gefaellestrecke</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00151"/>
<MacroRef MenuMacroID="MM_00146"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Mubea Gesamtmodell</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00152"/>
<MacroRef MenuMacroID="MM_00147"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>HundM05 Kreisel-Abschnitt</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00153"/>
<MacroRef MenuMacroID="MM_00148"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>KS 2D/3D pruefen (CSV)</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00154"/>
<MacroRef MenuMacroID="MM_00149"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
<PopMenu UID="PM_00165">
<PopMenu UID="PM_00160">
<Alias>POP501</Alias>
<Name>SSG_LIB Edit Context</Name>
<PopMenuItem>
<NameRef>Kreisel bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00166"/>
<MacroRef MenuMacroID="MM_00161"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Omniflo Element bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00167"/>
<MacroRef MenuMacroID="MM_00162"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Gefaellestrecke bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00168"/>
<MacroRef MenuMacroID="MM_00163"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>VarioFoerderer bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00169"/>
<MacroRef MenuMacroID="MM_00164"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>TRO-Marker bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00170"/>
<MacroRef MenuMacroID="MM_00165"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem>
<NameRef>Verbindung bearbeiten</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00171"/>
<MacroRef MenuMacroID="MM_00166"/>
</MenuItem>
</PopMenuItem>
<PopMenuItem IsSeparator="true"/>
<PopMenuItem>
<NameRef>SSG Bearbeiten (Auto)</NameRef>
<MenuItem>
<MacroRef MenuMacroID="MM_00173"/>
<MacroRef MenuMacroID="MM_00168"/>
</MenuItem>
</PopMenuItem>
</PopMenu>
+52 -77
View File
@@ -411,86 +411,61 @@
(tu-eq "csv:element-teileart/unbekannt" nil
(csv:element-teileart "AS_Element_90_links"))
;; --- csv:sepliste-partition: sepliste in Foerdereinheit-/Gefaelleeinheit-
;; Spannen aufteilen (Lauflaengen-Kodierung ueber den effektiven Typ) -----
;; Reine Rechenfunktion auf (typ lfdnr strecke-typ welt-pt)-Tupeln, hier
;; ohne Zeichnung testbar (welt-pt wird von der Partitionierung selbst
;; nicht gebraucht, darum ueberall nil).
;; --- csv:kette-typ: Bausteintyp einer VF_n/GF_n-Kette aus dem Blocknamen --
(tu-eq "csv:kette-typ/as" "AS" (csv:kette-typ "AS_Element_90_links_3D"))
(tu-eq "csv:kette-typ/es" "ES" (csv:kette-typ "ES_Element_30_rechts_2D"))
(tu-eq "csv:kette-typ/sep" "SEP" (csv:kette-typ "Staustrecke_Separator_SP_300_mm_3D"))
(tu-eq "csv:kette-typ/streckenelement" "STRECKENELEMENT"
(csv:kette-typ "Staustrecke_SP_1000_mm_3D"))
(tu-eq "csv:kette-typ/umlenk" "UMLENKSTATION"
(csv:kette-typ "Vario_Umlenkstation_500mm_rechts_3D"))
(tu-nil "csv:kette-typ/symbol-ist-kein-baustein" (csv:kette-typ "Separator_SP_3D"))
;; HundM05 VF_1-Beispiel (echt verifiziert): AS, SEP2=VF, SEP3=GF, SEP4=GF,
;; SEP5=VF, ES -> 3 Einheiten VF,GF,VF. SEP3+SEP4 bracketen GEMEINSAM eine
;; einzige Gefaelleeinheit (nicht zwei separate).
(setq _sep-hundm05
'(("AS" 1 nil nil) ("SEP" 2 "VF" nil) ("SEP" 3 "GF" nil)
("SEP" 4 "GF" nil) ("SEP" 5 "VF" nil) ("ES" 6 nil nil)))
(tu-eq "csv:sepliste-partition/hundm05"
'(("VF" (1 2)) ("GF" (3 4)) ("VF" (5 6)))
(csv:sepliste-partition _sep-hundm05))
;; Minimalfall: nur AS-SEP(VF)-ES, kein Typwechsel -> 1 Foerdereinheit ueber
;; die ganze Kette.
(setq _sep-minimal '(("AS" 1 nil nil) ("SEP" 2 "VF" nil) ("ES" 3 nil nil)))
(tu-eq "csv:sepliste-partition/minimal"
'(("VF" (1 2 3)))
(csv:sepliste-partition _sep-minimal))
;; Einzel-GF-Fall: die Gefaelleeinheit wird nur von EINEM SEP (nicht zwei)
;; UND dem nachfolgenden ES bracketiert.
(setq _sep-einzel-gf
'(("AS" 1 nil nil) ("SEP" 2 "VF" nil) ("SEP" 3 "GF" nil) ("ES" 4 nil nil)))
(tu-eq "csv:sepliste-partition/einzel-gf"
'(("VF" (1 2)) ("GF" (3 4)))
(csv:sepliste-partition _sep-einzel-gf))
;; 3+ gleichtypige SEP-Eintraege hintereinander muessen weiterhin EINE
;; Einheit ergeben (nicht mehrere) - Lauflaengen-Regel, kein Sonderfall.
(setq _sep-dreifach-gf
'(("AS" 1 nil nil) ("SEP" 2 "VF" nil) ("SEP" 3 "GF" nil)
("SEP" 4 "GF" nil) ("SEP" 5 "GF" nil) ("SEP" 6 "VF" nil) ("ES" 7 nil nil)))
(tu-eq "csv:sepliste-partition/dreifach-gf"
'(("VF" (1 2)) ("GF" (3 4 5)) ("VF" (6 7)))
(csv:sepliste-partition _sep-dreifach-gf))
;; Kette beginnend mit GF (AS erbt den Typ des ersten SEP-Eintrags, hier GF
;; statt des sonstigen Default "VF").
(setq _sep-startet-gf
'(("AS" 1 nil nil) ("SEP" 2 "GF" nil) ("ES" 3 nil nil)))
(tu-eq "csv:sepliste-partition/startet-gf"
;; --- csv:kette-einheiten: geordnete Typfolge in VF-/GF-Einheiten schneiden
;; VF = Separator vor der Umlenkstation ... Motorstation; alles dazwischen
;; GF; AS/ES gehoeren zu keiner Einheit. Reine Rechenfunktion.
;; HundM05 VF_5 (Bausteinfolge aus der Testzeichnung, per KS-Kette geordnet):
;; GF(1) VF(2..10) GF(11 12) VF(13..25) GF(26 27) - passt zu L_GF_m
;; "0.727,0.201,0.318" des Wrappers (drei Gefaelleabschnitte).
(setq _kette-hundm05
'("AS" "STRECKENELEMENT" "SEP" "UMLENKSTATION" "BOGEN" "STRECKENELEMENT"
"BOGEN" "STRECKENELEMENT" "BOGEN" "BOGEN" "MOTORSTATION" "SEP"
"STRECKENELEMENT" "SEP" "UMLENKSTATION" "BOGEN" "STRECKENELEMENT" "BOGEN"
"BOGEN" "BOGEN" "STRECKENELEMENT" "BOGEN" "BOGEN" "STRECKENELEMENT" "BOGEN"
"MOTORSTATION" "STRECKENELEMENT" "SEP" "ES"))
(tu-eq "csv:kette-einheiten/hundm05"
'(("GF" (1)) ("VF" (2 3 4 5 6 7 8 9 10)) ("GF" (11 12))
("VF" (13 14 15 16 17 18 19 20 21 22 23 24 25)) ("GF" (26 27)))
(csv:kette-einheiten _kette-hundm05))
;; Reine Gefaellestrecke ohne Stationen -> eine einzige GF.
(tu-eq "csv:kette-einheiten/nur-gf"
'(("GF" (1 2 3)))
(csv:sepliste-partition _sep-startet-gf))
(csv:kette-einheiten '("AS" "STRECKENELEMENT" "BOGEN" "SEP" "ES")))
;; Kette beginnt direkt mit dem Foerderer (Separator gleich hinter dem AS),
;; endet mit der Motorstation vor dem ES -> nur eine VF, keine leeren GF.
(tu-eq "csv:kette-einheiten/nur-vf"
'(("VF" (1 2 3 4)))
(csv:kette-einheiten '("AS" "SEP" "UMLENKSTATION" "STRECKENELEMENT" "MOTORSTATION" "ES")))
;; Umlenkstation ohne Separator davor beginnt die VF selbst; der Separator,
;; der NICHT vor einer Umlenkstation steht, bleibt im Gefaelle.
(tu-eq "csv:kette-einheiten/umlenk-ohne-sep"
'(("GF" (1 2)) ("VF" (3 4 5)))
(csv:kette-einheiten '("AS" "SEP" "BOGEN" "UMLENKSTATION" "STRECKENELEMENT" "MOTORSTATION" "ES")))
;; --- csv:dot2: 2D-Skalarprodukt ---
(tu-eqf "csv:dot2/achsen" 0.0 (csv:dot2 '(1.0 0.0) '(0.0 1.0)))
(tu-eqf "csv:dot2/parallel" 6.0 (csv:dot2 '(2.0 0.0) '(3.0 0.0)))
;; --- csv:element-unit-zuordnung: Elemente per Kettenrichtungs-Projektion
;; den Einheiten-Spannen zuordnen und INNERHALB jeder Spanne nach der
;; Projektion sortieren -----------------------------------------------
;; Gerade Kette AS(0,0) -SEP2(VF, 10,0)- SEP3(GF, 20,0) -ES(30,0)- entlang
;; der X-Achse. unit-spans: VF=[1,2], GF=[2,3] (SEP2 gehoert zu beiden
;; Spannen als Grenzmarker, siehe csv:sepliste-partition).
(setq _sep-proj
'(("AS" 1 nil (0.0 0.0 0.0)) ("SEP" 2 "VF" (10.0 0.0 0.0))
("SEP" 3 "GF" (20.0 0.0 0.0)) ("ES" 4 nil (30.0 0.0 0.0))))
(setq _spans-proj (csv:sepliste-partition _sep-proj))
(tu-eq "csv:sepliste-partition/proj-spans" '(("VF" (1 2)) ("GF" (3 4))) _spans-proj)
;; Zwei Elemente: eines bei x=5 (klar in der VF-Spanne [0,10]), eines bei
;; x=17 (in der Luecke zwischen den Spannen-Grenzpunkten [10,20], aber
;; naeher an der GF-Grenze 20 als an der VF-Grenze 10 - eindeutig GF, kein
;; Gleichstand wie bei x=15 in der Luecken-Mitte).
(setq _elem-vf (list 'PROXY1 'WRAPPER "STRECKENELEMENT" '(5.0 0.0 0.0)))
(setq _elem-gf (list 'PROXY2 'WRAPPER "STRECKENELEMENT" '(17.0 0.0 0.0)))
(setq _zuord (csv:element-unit-zuordnung _spans-proj _sep-proj (list _elem-vf _elem-gf)))
(tu-eq "csv:element-unit-zuordnung/vf-treffer" (list _elem-vf) (nth 0 _zuord))
(tu-eq "csv:element-unit-zuordnung/gf-treffer" (list _elem-gf) (nth 1 _zuord))
;; Sortierung innerhalb einer Spanne: zwei Elemente in der VF-Spanne,
;; absichtlich in "falscher" Reihenfolge uebergeben - das Ergebnis muss
;; nach x sortiert sein (frueheres x zuerst).
(setq _elem-a (list 'PROXY_A 'WRAPPER "BOGEN" '(8.0 0.0 0.0)))
(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: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)))
(setq _t-s1 (list "STRECKENELEMENT" nil '(10.0 0.0 0.0) '(20.0 0.0 0.0)))
(setq _t-b (list "BOGEN" nil '(20.0 0.0 0.0) '(20.0 10.0 0.0)))
(setq _t-es (list "ES" nil '(20.0 10.0 0.0) '(30.0 10.0 0.0)))
(tu-eq "csv:kette-ordnen/verwuerfelt"
(list _t-as _t-s1 _t-b _t-es)
(csv:kette-ordnen (list _t-b _t-es _t-as _t-s1) "TEST"))
;; Innerhalb der Toleranz (2 mm) gilt ein Anschluss noch als geschlossen.
(setq _t-s1b (list "STRECKENELEMENT" nil '(11.5 0.0 0.0) '(20.0 0.0 0.0)))
(tu-eq "csv:kette-ordnen/toleranz"
(list _t-as _t-s1b)
(csv:kette-ordnen (list _t-s1b _t-as) "TEST"))
;; --- csv:export-modus-setzen / -p-Praedikate: 3 Modi + Ungueltig-Schutz --
;; Bestehenden Modus sichern/wiederherstellen, damit dieser Testblock keine