[MERGE] Lager branch in main

This commit is contained in:
2026-10-30 11:44:19 +01:00
96 changed files with 9707 additions and 727 deletions
+147
View File
@@ -87,6 +87,153 @@ dem gewuenschten Modus:
Lauf ohne manuellen Zusatzschritt, aber ohne gleichzeitige visuelle Kontrolle
aller Zeichnungen am Ende. Sinnvoll fuer reine CI-artige Validierung.
## Anordnung der Linienzug-Testketten
Der Menueeintrag **Tests -> Foerderer-Linienzug** faehrt drei Befehle
nacheinander (`TEST_LINIENZUG`, `TEST_LINIENZUG_STUFE2`,
`TEST_LINIENZUG_MODUS2`) und baut dabei **sieben** Ketten. Damit sie
nebeneinander auf einer Grundlinie entstehen statt verstreut, tragen die
Testdaten versetzte Startpunkte - 20 m Abstand, alle auf `Y = 0`:
| X | Z | Kette | Datei |
|---|---|---|---|
| 0 | 2154 | Modus 1, Standardfall | `linienzug_tests.json` |
| 20000 | 2154 | Modus 1, Stufe-2-Fallback | `linienzug_tests_stufe2.json` |
| 40000 | 0 | Variante A (Vario-Kurve) | `linienzug_modus2_variokurve.json` |
| 60000 | 0 | Variante B (GF-Bogen) | `linienzug_modus2_gfbogen.json` |
| 80000 | 355 | U-Form 1 (GF alles am Einlauf) | `..._uform_gf1.json` |
| 100000 | 711 | U-Form 2 (1/2 + 1/2) | `..._uform_halb.json` |
| 120000 | 709 | U-Form 3 (steilerer Winkel) | `..._uform_halb_steil.json` |
Die Koordinaten sind also **nicht** die der aufgezeichneten Laeufe, die
uebrige Geometrie schon. Verschoben wurde rein translatorisch: Laengen,
Winkel und die geprueften Abweichungen sind davon unabhaengig. `Z` blieb
jeweils stehen - die Starthoehe ist ein Eingabewert des Solvers, kein
Layout-Parameter.
Technisch unterscheiden sich die beiden Datenarten: die Modus-1-Skripte
brauchen nur ihren EINEN `point_abs` (alles Weitere ist `point_rel` mit
`dL`/`hz`), waehrend bei Modus 2 sowohl die `PT`-Eintraege ALS AUCH die
Pfadkoordinaten in `SEGS` (Felder 6..9) mitwandern muessen - sonst zeigt der
Pfad woanders hin als Start und Ziel.
## Referenzfaelle Linienzug Modus 2 (`c:TEST_LINIENZUG_MODUS2`)
Fuenf aufgezeichnete Laeufe, die als zwei Paare gebildet sind: A/B
unterscheiden die Eck-BAUTEILART, U-Form 1..3 den gefalteten Lauf nach
GF-Verteilung und Winkel. Ausgefuehrt ueber Menue -> Tests ->
Foerderer-Linienzug.
### Erster und zweiter Fall: Eck-Bauteilart
Zwei Laeufe auf **demselben gezeichneten Pfad**, die sich nur in der
Segment-Klassifizierung unterscheiden. Sie decken die beiden Eck-Bauteilarten
ab (waagerecht eingebaute Vario-Kurve und geneigt eingebauter Gefaellebogen)
und haben am 2026-10-26 sieben Budget-Fehler aufgedeckt, die ein einzelner
Lauf nicht gezeigt haette - erst der VERGLEICH zweier Varianten machte
sichtbar, dass eine Korrektur am falschen Segment landete.
**Gezeichneter Pfad** (5 Objekte, Boegen als R500-Verrundung):
| Segment | Art | Mass |
|---|---|---|
| 1 | Linie | L = 9700 mm, hz = 0 |
| 2 | Bogen | 90 Grad rechts, R500 |
| 3 | Linie | L = 4296 mm, hz = -90 |
| 4 | Bogen | 30 Grad links, R500 |
| 5 | Linie | L = 1466 mm, hz = -60 |
**Gemeinsame Eingaben:** AS-Element ja, 90 Grad, links. ES-Element ja,
30 Grad, rechts. Lauf beginnen mit "Umlenkstation mit GF1 + Separator",
GF-Verteilung "alles am Einlauf", keine zusaetzlichen Separatoren.
| | Variante A | Variante B |
|---|---|---|
| Segment 2 | **Vario-Kurve** (aussen) | **GF-Bogen** |
| Segment 3 | VF (automatisch nach Kurve) | GF |
| Segment 4 | GF-Bogen | GF-Bogen |
| Segment 5 | GF | GF |
| VF-Lauf | Segment 1..3 | Segment 1..1 |
**Soll-Ergebnis fuer BEIDE Varianten:**
- `Quer zur Achse` **~0** (gemessen 0.2 mm - das ist die Aufloesung der
Blockmessung, kein Restfehler)
- `dZ` **0**
- `Laengs KS_AUS-Achse` darf abweichen (~104 mm) - das ist die Ausladung des
ES-Elements und ausdruecklich zulaessig.
Die Regel dahinter: **quer zur KS_AUS-Achse MUSS 0 sein, laengs darf
abweichen, dZ MUSS 0 sein.** Beides zugleich geht nicht - entweder liegt die
letzte Gerade auf der gezeichneten Linie und der ES-`KS_AUS` landet seitlich
daneben, oder umgekehrt. Entschieden ist: der Hauptstrang bleibt gerade, der
seitliche Versatz des ES-Elements ist dessen Bauform und kein Fehler.
**`laengs` wird trotzdem geprueft** - nicht als Genauigkeits-, sondern als
FORMkriterium (`erwartung_laengs_mm` in den Testdaten, Toleranz 5 mm). Der Wert
ist die Ausladung des ES-Elements und damit je Fall eine Konstante: 104.68 mm
bei `ES_Element_30`, 637.58 mm bei `ES_Element_90`.
Grund: am 2026-10-29 loeste ein Experiment den Schluss-Fueller gegen Richtung
UND Laenge und traf den Zielpunkt dadurch in X und Y exakt - um den Preis, dass
es die letzte Gerade um 6.15 Grad verdrehte. `quer` und `dZ` waren dabei NULL,
der Test meldete brav OK, und der schiefe Schenkel fiel nur beim Blick in die
Zeichnung auf. Ein verdrehter Hauptstrang zielt auf den Endpunkt und drueckt
`laengs` von ~638 mm auf ~0 - genau daran ist er zu erkennen.
Die Pruefung selbst ist gegengeprueft: mit einer kuenstlich auf 0.01 mm
gesetzten Toleranz kippen alle fuenf Faelle auf ABWEICHUNG.
Im Protokoll muessen die Zuschlags-Zeilen erscheinen: `AS-Fussabdruck`,
`Eck-Korrektur` je Ecke, und bei Variante A zusaetzlich
`Abschluss-Fussabdruck`. **Eine FEHLENDE Zeile ist das Warnsignal** - sie
bedeutet, dass ein Eck-Bauteil nicht messbar war und die Ecke unkorrigiert
blieb (so wurde der 2.4-mm-Rest bei Variante B gefunden).
> **Automatisiert seit 2026-10-27** als `c:TEST_LINIENZUG_MODUS2` (Menue:
> Tests -> Foerderer-Linienzug). Der Pfad muss dafuer NICHT gezeichnet werden:
> ein Modus-2-Journal traegt einen `SEGS`-Eintrag mit der kompletten
> Segment-Essenz und ist damit von den Original-Objekten unabhaengig - der
> Test spielt schlicht das mit `lib/vf_journal_export.py` ausgelesene Journal
> ab. Die reinen Rechenkerne sind zusaetzlich file-frei abgedeckt
> (`tu-tests-vfl-parallel` in `test_unit.lsp`: `vfl-eck-zerlegen`,
> `vfl-es-achs-reserve`, `vfl-projiziere-neigung` - jeweils mit den echten
> Messwerten aus diesen beiden Laeufen).
### Dritter bis fuenfter Fall: gefalteter Lauf (U-Form)
Aufgezeichnet 2026-10-29, Datendateien `tests/testdata/linienzug_modus2_uform_*.json`.
Der Pfad wechselt ueber zwei 90-Grad-Vario-Kurven **dreimal die
Fahrtrichtung**; die Kletterstrecke liegt dadurch in einem ANDEREN Schenkel als
der Lauf-Eingang. Genau diese Konstellation war bis 2026-10-29 falsch
bilanziert (gemessen 1424 mm quer), weil Posten dem falschen Schenkel
zugerechnet wurden.
| Segment | Art | Mass |
|---|---|---|
| 1 | Linie | L = 5855 mm, hz = 90 |
| 2 | Bogen | 90 Grad rechts, R500 -> **Vario-Kurve aussen** |
| 3 | Linie | L = 270 mm, hz = 0 (automatisch VF) |
| 4 | Bogen | 90 Grad rechts, R500 -> **Vario-Kurve aussen** |
| 5 | Linie | L = 7806 mm, hz = -90 (der Kletterer) |
| Fall | GF-Verteilung | Winkel-Option | Testdatei |
|---|---|---|---|
| U-Form 1 | alles am Einlauf (GF1) | 2 | `..._uform_gf1.json` |
| U-Form 2 | 1/2 GF1 + 1/2 GF2 | 2 (= 9 Grad) | `..._uform_halb.json` |
| U-Form 3 | 1/2 GF1 + 1/2 GF2 | 3 (steiler) | `..._uform_halb_steil.json` |
**Warum drei und nicht einer:** die GF-VERTEILUNG entscheidet, ob ueberhaupt
Gefaellestrecke im fremden Schenkel steht (und damit, ob Nachrechner und das
unterdrueckte Fueller-A greifen) - mit "alles am Einlauf" liegt das gesamte GF1
dort, mit 1/2+1/2 nur die Haelfte. Der WINKEL ist noetig, weil der Restfehler
der alten Bilanz mit `L_GF` skalierte: bei 6 Grad waren es 90 mm, bei 9 Grad
934 mm. Zwei Laeufe mit demselben Winkel haetten den Fehler also beinahe
verdeckt.
Soll-Ergebnis wie oben: `quer` und `dZ` jeweils ~0 (gemessen 0.56 mm bei
9 Grad und 0.7 mm bei der steileren Option), `laengs` ~638 mm - das ist die
Ausladung des `ES_Element_90_links` und in allen drei Faellen gleich.
## alltests.json — Testregistry
Die Datei `tests/alltests.json` ist die zentrale Registry aller Test-Module.
+14 -14
View File
@@ -1,15 +1,15 @@
Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details
1;"ILS 2.0 Strecke";"6220";"VF_13";20;1;;"0013";{"Anlagenhöhe in Meter": "-1.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.0", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.707", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.055", "Streckengruppe - Varioförderer 001-Richtung": "ab", "Streckengruppe - Varioförderer 001- Winkel": "39", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
2;"ILS 2.0 Strecke";"6220";"VF_12";20;1;;"0012";{"Anlagenhöhe in Meter": "0.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.084", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.0", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.478", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "21", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
3;"ILS 2.0 Strecke";"6220";"VF_11";20;1;;"0011";{"Anlagenhöhe in Meter": "1.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.166", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.166", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.207", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "51", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
4;"ILS 2.0 Strecke";"6220";"VF_10";20;1;;"0010";{"Anlagenhöhe in Meter": "-1", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.541", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.541", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "2.731", "Streckengruppe - Varioförderer 001-Richtung": "ab", "Streckengruppe - Varioförderer 001- Winkel": "27", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
5;"ILS 2.0 Strecke";"6220";"VF_9";20;1;;"0009";{"Anlagenhöhe in Meter": "1", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.206", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.206", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.07", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "39", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
6;"ILS 2.0 Strecke";"6220";"VF_8";20;1;;"0008";{"Anlagenhöhe in Meter": "-2", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.15", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.15", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "4.067", "Streckengruppe - Varioförderer 001-Richtung": "ab", "Streckengruppe - Varioförderer 001- Winkel": "45", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
7;"ILS 2.0 Strecke";"6220";"VF_7";20;1;;"0007";{"Anlagenhöhe in Meter": "-1.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.354", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.354", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.055", "Streckengruppe - Varioförderer 001-Richtung": "ab", "Streckengruppe - Varioförderer 001- Winkel": "39", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
8;"ILS 2.0 Strecke";"6220";"VF_6";20;1;;"0006";{"Anlagenhöhe in Meter": "-1", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.013", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.013", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.701", "Streckengruppe - Varioförderer 001-Richtung": "ab", "Streckengruppe - Varioförderer 001- Winkel": "21", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
9;"ILS 2.0 Strecke";"6220";"VF_5";20;1;;"0005";{"Anlagenhöhe in Meter": "-0.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.486", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.486", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.056", "Streckengruppe - Varioförderer 001-Richtung": "ab", "Streckengruppe - Varioförderer 001- Winkel": "9", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
10;"ILS 2.0 Strecke";"6220";"VF_4";20;1;;"0004";{"Anlagenhöhe in Meter": "1.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.166", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.166", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.207", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "51", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
11;"ILS 2.0 Strecke";"6220";"VF_3";20;1;;"0003";{"Anlagenhöhe in Meter": "1", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.206", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.206", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.07", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "39", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
12;"ILS 2.0 Strecke";"6220";"VF_2";20;1;;"0002";{"Anlagenhöhe in Meter": "0.5", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.042", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.042", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "3.478", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "21", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
13;"ILS 2.0 Strecke";"6220";"VF_1";20;1;;"0001";{"Anlagenhöhe in Meter": "0", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "0.615", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "0.615", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "2.74", "Streckengruppe - Varioförderer 001-Richtung": "auf", "Streckengruppe - Varioförderer 001- Winkel": "9", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
14;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"Automation": "Ja", "Anzahl der Kreisel": "0", "Anzahl der Separatoren - Kreisel ohne PINBAND": "0", "Anzahl der Kreisel mit PINBAND": "0", "Anzahl der Separatoren - Kreisel mit PINBAND": "0", "Anzahl der Verbindungskreisel": "0", "Längen aller Kreisel": "0.00", "Anzahl der Weichen": "0", "Anzahl der Eckräder": "0", "Anzahl der einzelnen Gefällestrecken": "0", "Anzahl der einzelnen Vario-Förderer": "0", "Anzahl der Streckengruppen": "13", "Längen aller Gefällestrecken": "0.00", "Anzahl der Motoren in Vario - Förderer": "13", "Längen aller Vario - Förderer": "41.915000000000006", "Anzahl der ETFs": "0", "Längen aller ETFS und Zusatzstücke (Gefällestrecken)": "0.0", "Anzahl der Separatoren in der Anlage": "26", "Anzahl der Scanner in der Anlage": "0", "Zusatzmodul - Anzahl der BT-Beladung": "0", "Zusatzmodul - Anzahl der Abwurfstation": "0", "Pneumatik": "Ja"}
1;"ILS 2.0 Strecke";"6220";"VF_13";20;1;;"0013";{"2950": "-1.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.0", "4391": "3", "4314": "Ja", "4319": "0.707", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.055", "4354": "ab", "4386": "39", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
2;"ILS 2.0 Strecke";"6220";"VF_12";20;1;;"0012";{"2950": "0.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.084", "4391": "3", "4314": "Ja", "4319": "0.0", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.478", "4354": "auf", "4386": "21", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
3;"ILS 2.0 Strecke";"6220";"VF_11";20;1;;"0011";{"2950": "1.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.166", "4391": "3", "4314": "Ja", "4319": "0.166", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.207", "4354": "auf", "4386": "51", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
4;"ILS 2.0 Strecke";"6220";"VF_10";20;1;;"0010";{"2950": "-1", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.541", "4391": "3", "4314": "Ja", "4319": "0.541", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "2.731", "4354": "ab", "4386": "27", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
5;"ILS 2.0 Strecke";"6220";"VF_9";20;1;;"0009";{"2950": "1", "4431": "Ja", "4427": "90 °", "4428": "rechts", "4432": "Ja", "4429": "90 °", "4430": "rechts", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.206", "4391": "3", "4314": "Ja", "4319": "0.206", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.07", "4354": "auf", "4386": "39", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
6;"ILS 2.0 Strecke";"6220";"VF_8";20;1;;"0008";{"2950": "-2", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.15", "4391": "3", "4314": "Ja", "4319": "0.15", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "4.067", "4354": "ab", "4386": "45", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
7;"ILS 2.0 Strecke";"6220";"VF_7";20;1;;"0007";{"2950": "-1.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.354", "4391": "3", "4314": "Ja", "4319": "0.354", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.055", "4354": "ab", "4386": "39", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
8;"ILS 2.0 Strecke";"6220";"VF_6";20;1;;"0006";{"2950": "-1", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.013", "4391": "3", "4314": "Ja", "4319": "0.013", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.701", "4354": "ab", "4386": "21", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
9;"ILS 2.0 Strecke";"6220";"VF_5";20;1;;"0005";{"2950": "-0.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.486", "4391": "3", "4314": "Ja", "4319": "0.486", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.056", "4354": "ab", "4386": "9", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488", "4437": "-0.512"}
10;"ILS 2.0 Strecke";"6220";"VF_4";20;1;;"0004";{"2950": "1.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.166", "4391": "3", "4314": "Ja", "4319": "0.166", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.207", "4354": "auf", "4386": "51", "4433": "-0.012", "4434": "0.488", "4435": "0.988", "4436": "1.488"}
11;"ILS 2.0 Strecke";"6220";"VF_3";20;1;;"0003";{"2950": "1", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.206", "4391": "3", "4314": "Ja", "4319": "0.206", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.07", "4354": "auf", "4386": "39", "4433": "-0.012", "4434": "0.488", "4435": "0.988"}
12;"ILS 2.0 Strecke";"6220";"VF_2";20;1;;"0002";{"2950": "0.5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.042", "4391": "3", "4314": "Ja", "4319": "0.042", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "3.478", "4354": "auf", "4386": "21", "4433": "-0.012", "4434": "0.488"}
13;"ILS 2.0 Strecke";"6220";"VF_1";20;1;;"0001";{"2950": "0", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "0", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.615", "4391": "3", "4314": "Ja", "4319": "0.615", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "2.74", "4354": "auf", "4386": "9", "4433": "-0.012"}
14;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"4000": "Ja", "4400": "0", "4413": "0", "4401": "0", "4414": "0", "4402": "0", "4419": "0.00", "4403": "0", "4404": "0", "4425": "0", "4426": "0", "4407": "13", "4418": "0.00", "4408": "13", "4420": "41.915000000000006", "4409": "0", "4417": "0.0", "4410": "26", "4411": "0", "4421": "0", "4422": "0", "4100": "Ja"}
Can't render this file because it contains an unexpected character in line 2 and column 50.
@@ -1,6 +1,6 @@
Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details
1;"ILS 2.0 Gefaellestrecke";"6220";"GF_8";20;1;;"0008";{"Anlagenhöhe in Meter": "5", "Streckengruppe": "ein Objekt", "Gefällestrecke oder Vario-Förderer": "Gefällestrecke", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "9.261", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "1", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
2;"ILS 2.0 Gefaellestrecke";"6220";"GF_7";20;1;;"0007";{"Anlagenhöhe in Meter": "2", "Streckengruppe": "mehrere Objekte", "Gefällestrecke oder Vario-Förderer": "Gefällestrecke", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "7.274,5.264", "Streckengruppe - Gefällestrecke 001 -Winkel": "0.2,0.2", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "2", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
3;"ILS 2.0 Gefaellestrecke";"6220";"GF_6";20;1;;"0006";{"Anlagenhöhe in Meter": "5", "Streckengruppe": "ein Objekt", "Gefällestrecke oder Vario-Förderer": "Gefällestrecke", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "8.838", "Streckengruppe - Gefällestrecke 001 -Winkel": "2.8", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "1", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
4;"ILS 2.0 Gefaellestrecke";"6220";"GF_5, GF_4, GF_3, GF_2, GF_1";20;1;;"0005, 0004, 0003, 0002, 0001";{"Anlagenhöhe in Meter": "5", "Streckengruppe": "ein Objekt", "Gefällestrecke oder Vario-Förderer": "Gefällestrecke", "Strecken- zu fertigende Menge": "5", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "8.851", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "1", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Gerüst für Einzelmodul": "Nein", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
5;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"Automation": "Ja", "Anzahl der Kreisel": "0", "Anzahl der Separatoren - Kreisel ohne PINBAND": "0", "Anzahl der Kreisel mit PINBAND": "0", "Anzahl der Separatoren - Kreisel mit PINBAND": "0", "Anzahl der Verbindungskreisel": "0", "Längen aller Kreisel": "0.00", "Anzahl der Weichen": "0", "Anzahl der Eckräder": "0", "Anzahl der einzelnen Gefällestrecken": "8", "Anzahl der einzelnen Vario-Förderer": "0", "Anzahl der Streckengruppen": "0", "Längen aller Gefällestrecken": "62.35", "Anzahl der Motoren in Vario - Förderer": "0", "Längen aller Vario - Förderer": "0.0", "Anzahl der ETFs": "0", "Längen aller ETFS und Zusatzstücke (Gefällestrecken)": "0.0", "Anzahl der Separatoren in der Anlage": "9", "Anzahl der Scanner in der Anlage": "0", "Zusatzmodul - Anzahl der BT-Beladung": "0", "Zusatzmodul - Anzahl der Abwurfstation": "0", "Pneumatik": "Ja"}
1;"ILS 2.0 Gefaellestrecke";"6220";"GF_8";20;1;;"0008";{"2950": "5", "4431": "Ja", "4427": "30 °", "4428": "links", "4432": "Ja", "4429": "30 °", "4430": "links", "4384": "Gefällestrecke", "4318": "9.261", "4391": "3", "4337": "1", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "ein Objekt", "4311": "1"}
2;"ILS 2.0 Gefaellestrecke";"6220";"GF_7";20;1;;"0007";{"2950": "2", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4384": "Gefällestrecke", "4318": "7.274,5.264", "4391": "0.2,0.2", "4337": "2", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1"}
3;"ILS 2.0 Gefaellestrecke";"6220";"GF_6";20;1;;"0006";{"2950": "5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4384": "Gefällestrecke", "4318": "8.838", "4391": "2.8", "4337": "1", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "ein Objekt", "4311": "1"}
4;"ILS 2.0 Gefaellestrecke";"6220";"GF_5, GF_4, GF_3, GF_2, GF_1";20;1;;"0005, 0004, 0003, 0002, 0001";{"2950": "5", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4384": "Gefällestrecke", "4318": "8.851", "4391": "3", "4337": "1", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "3992": "Nein", "3993": "Schönenberger-Gerüst", "4300": "ein Objekt", "4311": "5"}
5;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"4000": "Ja", "4400": "0", "4413": "0", "4401": "0", "4414": "0", "4402": "0", "4419": "0.00", "4403": "0", "4404": "0", "4425": "8", "4426": "0", "4407": "0", "4418": "62.35", "4408": "0", "4420": "0.0", "4409": "0", "4417": "0.0", "4410": "9", "4411": "0", "4421": "0", "4422": "0", "4100": "Ja"}
Can't render this file because it contains an unexpected character in line 2 and column 57.
+6 -6
View File
@@ -5,20 +5,20 @@ Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingb
4;"ILS 2.0 Strecke";"0004";"VF_4";"H/1-J/4";1;"18465.07, 4300.26, 2119.66";"2518.90, 6404.92, 848.78";"f///EdR0IN4QAAAAAAAAAAAA";"AqAYAC2kAFQk";"AwJzAC2kAFQk";"";"";"0006-L";"0038, 0039, 0040, 0041";"nur ein Partner";"";{"Typ": "Streckengruppe", "Seite_AS": "links", "Seite_ES": "links", "Winkel": "3,3", "VF_Winkel": "0,0,18", "DeltaH_mm": "0", "DeltaL_mm": "1907", "L_VF_m": "0.269,0.458,1.663", "L_GF_m": "4.166,1.658", "Montagehoehe_m": "2.154", "Hoehe_Von_mm": "2154", "Hoehe_Bis_mm": "2154", "Antriebfahrtrichtung": "horizontal,horizontal,Auf", "Anzahl_Separator": "2", "Anzahl_Scanner": "0"}
5;"ILS 2.0 Strecke";"0005";"VF_5";"J/1-K/4";1;"22239.27, 4299.16, 2119.66";"2518.90, 6404.92, 848.78";"f///EdAoIN4QAAAAAAAAAAAA";"AzOGAC2ZAFQk";"A5XhAC2ZAFQk";"";"";"0006-L";"0042, 0043, 0044, 0045";"nur ein Partner";"";{"Typ": "Streckengruppe", "Seite_AS": "links", "Seite_ES": "links", "Winkel": "3,3", "VF_Winkel": "0,0,18", "DeltaH_mm": "0", "DeltaL_mm": "1907", "L_VF_m": "0.269,0.458,1.663", "L_GF_m": "4.166,1.658", "Montagehoehe_m": "2.154", "Hoehe_Von_mm": "2154", "Hoehe_Bis_mm": "2154", "Antriebfahrtrichtung": "horizontal,horizontal,Auf", "Anzahl_Separator": "4", "Anzahl_Scanner": "1"}
6;"ILS 2.0 Kreisel";"0006";"Kreisel1";"A/1-M/1";1;"13594.00, 767.00, 2154.00";"24100.00, 800.00, 1.00";"F49AC7QYIN4QAAAAAAAAAAAA";"";"";"";"";"0005, 0004, 0003, 0002, 0001";"0021, 0022, 0007, 0008, 0024, 0029, 0010, 0030, 0033, 0012, 0034, 0037, 0014, 0038, 0041, 0016, 0042, 0045, 0018, 0020, 0023";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "23.3", "Anzahl der Separatoren": "4", "Kreiselart": "STANDARD", "Anzahl der Scanner": "4", "Anzahl der Rampen": "0", "Höhe in m": "2.15", "Drehrichtung": "UZS", "Drehung": 0, "Name": "Kreisel1", "Geruest fuer Einzelmodul": true}
7;"ILS 2.0 Separator";"0007";"Separator :20";"A/1";1;"2414.95, 365.00, 2155.50";"209.90, 150.00, 3.00";"I+84BZHIIN4QAAAAAAAAAAAA";"AFv+AA5CAFQk";"";"";"";"0022, 0008";"";"";"";{"Zuordnung": "0006-R", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 0, "Typ": ""}
7;"ILS 2.0 Separator";"0007";"Separator :20";"A/1";1;"2414.95, 365.00, 2155.50";"209.90, 150.00, 3.00";"I+84BZHIIN4QAAAAAAAAAAAA";"AFv+AA5CAFQk";"";"";"";"0022, 0008";"";"";"";{"Zuordnung": "0001", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 0, "Typ": ""}
8;"ILS 2.0 Separator";"0008";"Separator :19";"B/1";1;"4056.38, 1165.90, 2155.50";"209.90, 150.00, 3.00";"Ps9qEcpMIN4QAAAAAAAAf///";"AKDLAC2LAFQk";"";"";"";"0007, 0024";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
9;"ILS 2.0 Scanner";"0009";"Scanner :6";"B/1";1;"4095.50, 804.10, 2154.00";"150.00, 280.00, 1.00";"Pn4MEcNEIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0008"}
10;"ILS 2.0 Separator";"0010";"Separator :18";"D/1";1;"8555.49, 1169.50, 2155.50";"209.90, 150.00, 3.00";"f///EdhcIN4QAAAAAAAAf///";"AVCKAC2vAFQk";"";"";"";"0029, 0030";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
11;"ILS 2.0 Scanner";"0011";"Scanner :5";"D/1";1;"8598.69, 807.70, 2154.00";"150.00, 280.00, 1.00";"f///EdFUIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0010"}
10;"ILS 2.0 Separator";"0010";"Separator :18";"D/1";1;"8555.49, 1169.50, 2155.50";"209.90, 150.00, 3.00";"f///EdhcIN4QAAAAAAAAf///";"AVCKAC2vAFQk";"";"";"";"0029, 0030";"";"";"";{"Zuordnung": "0002", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
11;"ILS 2.0 Scanner";"0011";"Scanner :5";"D/1";1;"8598.69, 807.70, 2154.00";"150.00, 280.00, 1.00";"f///EdFUIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0002", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0010"}
12;"ILS 2.0 Separator";"0012";"Separator :17";"F/1";1;"12631.71, 1168.20, 2155.50";"209.90, 150.00, 3.00";"f///EdNIIN4QAAAAAAAAf///";"Ae/EAC2iAFQk";"";"";"";"0033, 0034";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
13;"ILS 2.0 Scanner";"0013";"Scanner :4";"F/1";1;"12669.10, 806.40, 2154.00";"150.00, 280.00, 1.00";"f///EcxAIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0012"}
14;"ILS 2.0 Separator";"0014";"Separator :16";"H/1";1;"16799.72, 1171.70, 2155.50";"209.90, 150.00, 3.00";"f///EeD0IN4QAAAAAAAAf///";"ApKUAC3FAFQk";"";"";"";"0037, 0038";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
15;"ILS 2.0 Scanner";"0015";"Scanner :3";"H/1";1;"16839.52, 809.80, 2154.00";"150.00, 280.00, 1.00";"f///EdmIIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"Distanz-Zuordnung unsicher: 0006 (3270mm) vs. 0004 (3527mm)";{"Zuordnung": "0006-L", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0014"}
16;"ILS 2.0 Separator";"0016";"Separator :15";"J/1";1;"20577.16, 1166.20, 2155.50";"209.90, 150.00, 3.00";"f///Ect4IN4QAAAAAAAAf///";"AyYjAC2OAFQk";"";"";"";"0041, 0042";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
17;"ILS 2.0 Scanner";"0017";"Scanner :2";"J/1";1;"20807.70, 804.30, 2154.00";"150.00, 280.00, 1.00";"f///EcQMIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0005", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0016"}
17;"ILS 2.0 Scanner";"0017";"Scanner :2";"J/1";1;"20807.70, 804.30, 2154.00";"150.00, 280.00, 1.00";"f///EcQMIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0016"}
18;"ILS 2.0 Separator";"0018";"Separator :14";"L/1";1;"23678.05, 1170.60, 2155.50";"209.90, 150.00, 3.00";"f///EdyoIN4QAAAAAAAAf///";"A59EAC26AFQk";"";"";"";"0045, 0020";"";"";"";{"Zuordnung": "0005", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
19;"ILS 2.0 Scanner";"0019";"Scanner :1";"L/1";1;"23780.80, 808.80, 2154.00";"150.00, 280.00, 1.00";"f///EdWgIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0018"}
20;"ILS 2.0 Separator";"0020";"Separator :13";"L/1";1;"24570.15, 1167.20, 2155.50";"209.90, 150.00, 3.00";"f///Ec9gIN4QAAAAAAAAf///";"A8IdAC2YAFQk";"";"";"";"0018, 0023";"";"";"";{"Zuordnung": "0006-L", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
19;"ILS 2.0 Scanner";"0019";"Scanner :1";"L/1";1;"23780.80, 808.80, 2154.00";"150.00, 280.00, 1.00";"f///EdWgIN4QAAAAAAAApX2I";"";"";"";"";"";"";"";"";{"Zuordnung": "0005", "ARTINR": "829534306", "Höhe": "2154", "Drehung": 270, "Typ": "", "Naechster Separator": "0018"}
20;"ILS 2.0 Separator";"0020";"Separator :13";"L/1";1;"24570.15, 1167.20, 2155.50";"209.90, 150.00, 3.00";"f///Ec9gIN4QAAAAAAAAf///";"A8IdAC2YAFQk";"";"";"";"0018, 0023";"";"";"";{"Zuordnung": "0005", "ARTINR": "200000077", "Höhe": "2154", "Drehung": 180, "Typ": ""}
21;"ILS 2.0 BTMT Beladung";"0021";"BTMT Beladung :2";"B/1-C/1";1;"5532.67, 265.14, 2109.31";"652.35, 408.38, 316.02";"ULuUBaYYIN4QAAAAAAAAf/7S";"AON9AANLAFSv";"AMu/AA6CAFQk";"";"";"0023, 0022";"";"";"";{"ARTINR": "829662012", "Höhe": "2154", "Drehung": 179}
22;"ILS 2.0 BTMT Beladung";"0022";"BTMT Beladung :1";"B/1";1;"4503.25, 269.77, 2109.31";"651.33, 406.70, 316.02";"QQVQBbW4IN4QAAAAAAAAf/8o";"ALtMAAOBAFSv";"AKOGAA6oAFQk";"";"";"0021, 0007";"";"";"";{"ARTINR": "829662012", "Höhe": "2154", "Drehung": 179}
23;"ILS 2.0 BTMT Entladung";"0023";"BTMT Entladung :1";"L/1-M/1";1;"25014.37, 1545.51, 2001.09";"1475.51, 961.98, 467.01";"f///Edt8IN4QAAAAAAAAARVf";"A7q4AC1/AFQk";"A+0BAE7eAEX5";"";"";"0020, 0021";"";"";"";{"ARTINR": "400100156", "Höhe": "2154", "Drehung": 1}
Can't render this file because it contains an unexpected character in line 2 and column 233.
+6 -6
View File
@@ -1,9 +1,9 @@
Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details
1;"ILS 2.0 Kreisel";"6200";"Kreisel12";20;1;;"0006";{"2952": "2.154", "3510": "Kreisel", "3511": "1", "3512": "23.3", "3515": "4", "3517": "4", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
1;"ILS 2.0 Kreisel";"6200";"Kreisel1";20;1;;"0006";{"2952": "2.154", "3511": "1", "3515": "4", "3517": "4", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel", "3512": "23.3"}
2;"ILS 2.0 Zusatzmodul";"6215";"";20;1;;"0022, 0021, 0023";{"3501": "Ja", "3503": "2", "3502": "Ja", "3504": "1"}
3;"ILS 2.0 Strecke";"6220";"VF_9";20;1;;"0005";{"2950": "2.154", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "4", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "1", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
4;"ILS 2.0 Strecke";"6220";"VF_8";20;1;;"0004";{"2950": "2.154", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
5;"ILS 2.0 Strecke";"6220";"VF_7";20;1;;"0003";{"2950": "2.154", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
6;"ILS 2.0 Strecke";"6220";"VF_6";20;1;;"0002";{"2950": "2.154", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "3", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "1", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
7;"ILS 2.0 Strecke";"6220";"VF_5";20;1;;"0001";{"2950": "2.154", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.727", "4391": "3", "4314": "Ja", "4319": "0.201", "4392": "3", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "2", "4353": "3.704", "4354": "horizontal", "4386": "0", "4373": "0", "4374": "0", "4375": "1", "4376": "2", "4377": "0", "4378": "1", "4381": "5", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
3;"ILS 2.0 Strecke";"6220";"VF_5";20;1;;"0005";{"2950": "2.154", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "4", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "1", "3992": "Ja", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4433": "1.800", "4434": "1.800", "4435": "2.071"}
4;"ILS 2.0 Strecke";"6220";"VF_4";20;1;;"0004";{"2950": "2.154", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4433": "1.800", "4434": "1.800", "4435": "2.071"}
5;"ILS 2.0 Strecke";"6220";"VF_3";20;1;;"0003";{"2950": "2.154", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4433": "1.800", "4434": "1.800", "4435": "2.071"}
6;"ILS 2.0 Strecke";"6220";"VF_2";20;1;;"0002";{"2950": "2.154", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "3", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "1", "3992": "Ja", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4433": "1.800", "4434": "1.800", "4435": "2.071"}
7;"ILS 2.0 Strecke";"6220";"VF_1";20;1;;"0001";{"2950": "2.154", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "1", "4376": "2", "4377": "0", "4378": "1", "4381": "5", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "0.727", "4391": "3", "4314": "Ja", "4319": "0.201", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "2", "4353": "3.704", "4354": "horizontal", "4386": "0", "4433": "1.980", "4434": "1.980", "4435": "1.875", "4436": "2.076", "4437": "2.282"}
8;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"4000": "Ja", "4400": "1", "4413": "4", "4401": "0", "4414": "0", "4402": "0", "4419": "23.30", "4403": "0", "4404": "0", "4425": "0", "4426": "0", "4407": "5", "4418": "0.00", "4408": "17", "4420": "0.0", "4409": "0", "4417": "0.0", "4410": "20", "4411": "6", "4421": "2", "4422": "1", "4100": "Ja"}
Can't render this file because it contains an unexpected character in line 2 and column 54.
+8 -8
View File
@@ -3,7 +3,7 @@
"test_id": "KR_Kreuz_Q1_0Grad",
"status": "executed",
"block_name": "KREISEL_1_STANDARD_2000",
"block_handle": "13A",
"block_handle": "186",
"insert_point": [500, 500, 2500],
"actual_attributes": {
"ID": "0001",
@@ -28,7 +28,7 @@
"test_id": "KR_Kreuz_Q2_90Grad",
"status": "executed",
"block_name": "KREISEL_2_STANDARD_3000",
"block_handle": "187",
"block_handle": "1D7",
"insert_point": [-500, 500, 2500],
"actual_attributes": {
"ID": "0002",
@@ -53,7 +53,7 @@
"test_id": "KR_Kreuz_Q3_180Grad",
"status": "executed",
"block_name": "KREISEL_3_STANDARD_4000",
"block_handle": "1D3",
"block_handle": "227",
"insert_point": [-500, -500, 2500],
"actual_attributes": {
"ID": "0003",
@@ -78,7 +78,7 @@
"test_id": "KR_Kreuz_Q4_270Grad",
"status": "executed",
"block_name": "KREISEL_4_STANDARD_5000",
"block_handle": "21F",
"block_handle": "277",
"insert_point": [500, -500, 2500],
"actual_attributes": {
"ID": "0004",
@@ -103,7 +103,7 @@
"test_id": "KR_Schraeg_Q1_30Grad",
"status": "executed",
"block_name": "KREISEL_5_STANDARD_3000",
"block_handle": "26B",
"block_handle": "2C7",
"insert_point": [3000, 3000, 3000],
"actual_attributes": {
"ID": "0005",
@@ -128,7 +128,7 @@
"test_id": "KR_Pin_Q1_0Grad",
"status": "executed",
"block_name": "KREISEL_6_PIN_3000",
"block_handle": "2BC",
"block_handle": "31C",
"insert_point": [500, 6000, 1500],
"actual_attributes": {
"ID": "0006",
@@ -153,7 +153,7 @@
"test_id": "KR_Pin_Q1_90Grad",
"status": "executed",
"block_name": "KREISEL_7_PIN_4000",
"block_handle": "30C",
"block_handle": "370",
"insert_point": [-500, 6500, 1500],
"actual_attributes": {
"ID": "0007",
@@ -178,7 +178,7 @@
"test_id": "KR_Pin_Q1_30Grad_Schraeg",
"status": "executed",
"block_name": "KREISEL_8_PIN_3000",
"block_handle": "35C",
"block_handle": "3C4",
"insert_point": [3000, 8000, 1500],
"actual_attributes": {
"ID": "0008",
+8 -7
View File
@@ -1,8 +1,9 @@
Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details
1;"ILS 2.0 Kreisel";"6200";"Kreisel8, Kreisel6";20;2;;"0008, 0006";{"2952": "1.5", "3510": "Kreisel mit PINBAND", "3511": "1", "3512": "3.0", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
2;"ILS 2.0 Kreisel";"6200";"Kreisel7";20;1;;"0007";{"2952": "1.5", "3510": "Kreisel mit PINBAND", "3511": "1", "3512": "4.0", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
3;"ILS 2.0 Kreisel";"6200";"Kreisel5, Kreisel2";20;2;;"0005, 0002";{"2952": "3", "3510": "Kreisel", "3511": "1", "3512": "3.0", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
4;"ILS 2.0 Kreisel";"6200";"Kreisel4";20;1;;"0004";{"2952": "2.5", "3510": "Kreisel", "3511": "1", "3512": "5.0", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
5;"ILS 2.0 Kreisel";"6200";"Kreisel3";20;1;;"0003";{"2952": "2.5", "3510": "Kreisel", "3511": "1", "3512": "4.0", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
6;"ILS 2.0 Kreisel";"6200";"Kreisel1";20;1;;"0001";{"2952": "2.5", "3510": "Kreisel", "3511": "1", "3512": "2.0", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst"}
7;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"4000": "Ja", "4400": "8", "4413": "0", "4401": "3", "4414": "0", "4402": "0", "4419": "27.00", "4403": "0", "4404": "0", "4425": "0", "4426": "0", "4407": "0", "4418": "0.00", "4408": "0", "4420": "0.0", "4409": "0", "4417": "0.0", "4410": "0", "4411": "0", "4421": "0", "4422": "0", "4100": "Ja"}
1;"ILS 2.0 Kreisel";"6200";"Kreisel8, Kreisel6";20;2;;"0008, 0006";{"2952": "1.5", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel mit PINBAND", "3512": "3.0"}
2;"ILS 2.0 Kreisel";"6200";"Kreisel7";20;1;;"0007";{"2952": "1.5", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel mit PINBAND", "3512": "4.0"}
3;"ILS 2.0 Kreisel";"6200";"Kreisel5";20;1;;"0005";{"2952": "3", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel", "3512": "3.0"}
4;"ILS 2.0 Kreisel";"6200";"Kreisel4";20;1;;"0004";{"2952": "2.5", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel", "3512": "5.0"}
5;"ILS 2.0 Kreisel";"6200";"Kreisel3";20;1;;"0003";{"2952": "2.5", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel", "3512": "4.0"}
6;"ILS 2.0 Kreisel";"6200";"Kreisel2";20;1;;"0002";{"2952": "2.5", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel", "3512": "3.0"}
7;"ILS 2.0 Kreisel";"6200";"Kreisel1";20;1;;"0001";{"2952": "2.5", "3511": "1", "3515": "0", "3517": "0", "3519": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "3510": "Kreisel", "3512": "2.0"}
8;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"4000": "Ja", "4400": "8", "4413": "0", "4401": "3", "4414": "0", "4402": "0", "4419": "27.00", "4403": "0", "4404": "0", "4425": "0", "4426": "0", "4407": "0", "4418": "0.00", "4408": "0", "4420": "0.0", "4409": "0", "4417": "0.0", "4410": "0", "4411": "0", "4421": "0", "4422": "0", "4100": "Ja"}
Can't render this file because it contains an unexpected character in line 2 and column 69.
+1 -1
View File
@@ -2,7 +2,7 @@
{
"test_id": "LZ_Standard",
"status": "OK",
"schritte_gesamt": 37,
"schritte_gesamt": 34,
"schritte_offen": 0
}
]
+2 -2
View File
@@ -1,3 +1,3 @@
Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details
1;"ILS 2.0 Strecke";"6220";"VF_1";20;1;;"0001";{"Anlagenhöhe in Meter": "2.154", "Streckengruppe": "mehrere Objekte", "Strecken- zu fertigende Menge": "1", "Streckengruppe - Gefällestrecke": "Ja", "Streckengruppe - Gefällestrecke 001-Länge in Meter": "4.166", "Streckengruppe - Gefällestrecke 001 -Winkel": "3", "Streckengruppe - Gefällestrecke 002": "Ja", "Streckengruppe - Gefällestrecke 002-Länge in Meter": "1.658", "Streckengruppe - Gefällestrecke 002- Winkel": "3", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke links 30°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 90°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 60°": "0", "Streckengruppe - Anzahl der Kurven - Gefällestrecke rechts 30°": "0", "Streckengruppe - Anzahl der Separatoren - Gefällestrecke": "0", "Streckengruppe - Bearbeitung Gefällestreckenteilstück für Separator (829516050)": "ohne HARTCOAT HRC 50 ± 5", "Streckengruppe - Anzahl der Scanner": "0", "Streckengruppe - Varioförderer": "Ja", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (links)": "0", "Streckengruppe - Anzahl der Motoren für Vario-Förderer (rechts)": "1", "Streckengruppe - Varioförderer 001-Länge in Meter": "0.269", "Streckengruppe - Varioförderer 001-Richtung": "horizontal", "Streckengruppe - Varioförderer 001- Winkel": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 90°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Außenbogen 30°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 90°": "2", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 60°": "0", "Streckengruppe - Anzahl der Kurven - Varioförderer Innenbogen 30°": "0", "Streckengruppe - Anzahl der Separatoren - Varioförderer": "2", "Gerüst für Einzelmodul": "Ja", "Gerüstoption für Einzelmodul": "Schönenberger-Gerüst"}
2;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"Automation": "Ja", "Anzahl der Kreisel": "0", "Anzahl der Separatoren - Kreisel ohne PINBAND": "0", "Anzahl der Kreisel mit PINBAND": "0", "Anzahl der Separatoren - Kreisel mit PINBAND": "0", "Anzahl der Verbindungskreisel": "0", "Längen aller Kreisel": "0.00", "Anzahl der Weichen": "0", "Anzahl der Eckräder": "0", "Anzahl der einzelnen Gefällestrecken": "0", "Anzahl der einzelnen Vario-Förderer": "0", "Anzahl der Streckengruppen": "1", "Längen aller Gefällestrecken": "0.00", "Anzahl der Motoren in Vario - Förderer": "3", "Längen aller Vario - Förderer": "0.0", "Anzahl der ETFs": "0", "Längen aller ETFS und Zusatzstücke (Gefällestrecken)": "0.0", "Anzahl der Separatoren in der Anlage": "2", "Anzahl der Scanner in der Anlage": "0", "Zusatzmodul - Anzahl der BT-Beladung": "0", "Zusatzmodul - Anzahl der Abwurfstation": "0", "Pneumatik": "Ja"}
1;"ILS 2.0 Strecke";"6220";"VF_1";20;1;;"0001";{"2950": "2.154", "4431": "Ja", "4427": "90 °", "4428": "links", "4432": "Ja", "4429": "90 °", "4430": "links", "4329": "0", "4330": "0", "4331": "0", "4332": "0", "4333": "0", "4334": "0", "4373": "0", "4374": "0", "4375": "0", "4376": "2", "4377": "0", "4378": "0", "4381": "2", "4382": "ohne HARTCOAT HRC 50 ± 5", "4383": "0", "3992": "Ja", "3993": "Schönenberger-Gerüst", "4300": "mehrere Objekte", "4311": "1", "4312": "Ja", "4318": "4.166", "4391": "3", "4314": "Ja", "4319": "1.658", "4392": "3", "4337": "0", "4338": "ohne HARTCOAT HRC 50 ± 5", "4339": "0", "4340": "Ja", "4341": "0", "4342": "1", "4353": "0.269", "4354": "horizontal", "4386": "0", "4433": "1.800", "4434": "1.800", "4435": "2.071"}
2;"ILS 2.0 Automation und Pneumatik - Gesamtanlage";"6269";"";20;1;;"";{"4000": "Ja", "4400": "0", "4413": "0", "4401": "0", "4414": "0", "4402": "0", "4419": "0.00", "4403": "0", "4404": "0", "4425": "0", "4426": "0", "4407": "1", "4418": "0.00", "4408": "3", "4420": "0.0", "4409": "0", "4417": "0.0", "4410": "2", "4411": "0", "4421": "0", "4422": "0", "4100": "Ja"}
Can't render this file because it contains an unexpected character in line 2 and column 49.
+1
View File
@@ -183,6 +183,7 @@
(if (findfile csv-pfad) (vl-file-delete csv-pfad))
(if (findfile sivas-pfad) (vl-file-delete sivas-pfad))
(setq *csv-hoehencheck-fragen* nil) ;; keine Rueckfrage im Testlauf
(princ (strcat "\n[TEST_EXPORT_ALL] CSV-Export -> " csv-name))
(c:EXPORTCSV)
(setq csv-ok (export_all:wait-for-file csv-pfad 30.0))
+174
View File
@@ -0,0 +1,174 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
test_export_freie_separatoren.py - freie Separatoren in der Kette einer Strecke.
Laeuft komplett ohne BricsCAD (reine Python-Logik, siehe lib/export_neighbors.py).
Szenario nach einem realen Mubea-Befund (VF_3 = 0015): die sepliste aus dem
Bau kennt nur AS 0061, SEP 0062, SEP 0063, ES 0064. Die eigenstaendigen
Separatoren 0037/0038 liegen auf der Strecke, ihre Zuordnung nennt 0015 - sie
fehlten aber in TrackIds und Nachbarn. einsortieren_freie_separatoren nimmt
sie nach Lage auf.
Alle Daten sind hier fest eingetragen (Stand des Mubea-Exports 2026-10-28) und
werden aus keiner Datei gelesen - aendert sich die Mubea-Zeichnung, bleibt
dieser Test unberuehrt. Er prueft den Algorithmus, nicht die Szene.
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from export_neighbors import ( # noqa: E402
compute_sep_kette,
einsortieren_freie_separatoren,
sepliste_einsortier_positionen,
)
from export_csv import ( # noqa: E402
map_sepliste_kette_items,
resolve_umlauf_und_sepliste_nachbarn,
write_separatorliste_merkmale,
)
TOL_MM = 100.0
def _sep(teileid, x, y, zuordnung):
return {
"teileart": "ILS 2.0 Separator",
"teileid": teileid,
"merkmale": {"Zuordnung": zuordnung},
"nachbarn": "",
"_bbox": {"cx": x, "cy": y, "cz": 0.0, "dx": 150.0, "dy": 210.0},
}
def _ases(teileart, teileid, x, y, zuordnung):
return {
"teileart": teileart,
"teileid": teileid,
"_zuordnung": zuordnung,
"merkmale": {},
"nachbarn": "",
"_bbox": {"cx": x, "cy": y, "cz": 0.0, "dx": 200.0, "dy": 200.0},
}
def _mubea_vf3():
strecke = {
"teileart": "ILS 2.0 Strecke",
"teileid": "0015",
"nachbarn": "0002-L",
"merkmale": {},
"k1": "", "k2": "",
"_bbox": {"cx": -631.28, "cy": 6543.11, "cz": 1624.70,
"dx": 1018.09, "dy": 12791.0},
"sepliste": [
{"typ": "AS", "lfdnr": 1, "id": "0061"},
{"typ": "SEP", "lfdnr": 2, "id": "0062"},
{"typ": "SEP", "lfdnr": 3, "id": "0063"},
{"typ": "ES", "lfdnr": 4, "id": "0064"},
],
}
return [
strecke,
_ases("ILS Ausschleuselement", "0061", -400.00, 270.54, "0015"),
_sep("0062", -898.87, 1134.60, "0015"),
_sep("0063", -702.98, 12307.81, "0015"),
_ases("ILS Einschleuselement", "0064", -400.00, 12832.58, "0015"),
_sep("0037", -1026.00, 10723.05, "0015"),
_sep("0038", -1026.00, 5250.05, "0015"),
]
def _by_id(items, teileid):
return next(it for it in items if it.get("teileid") == teileid)
def _pipeline(items):
einsortieren_freie_separatoren(items, TOL_MM)
sep_kette = compute_sep_kette(items)
sep_kette_by_key = map_sepliste_kette_items(items, sep_kette)
write_separatorliste_merkmale(items, sep_kette_by_key)
resolve_umlauf_und_sepliste_nachbarn(items, {}, sep_kette, sep_kette_by_key, {})
return items
class TestEinsortierPositionen:
"""Reiner Rechenkern, ohne Items."""
KETTE = [(0.0, 0.0), (0.0, 1000.0), (0.0, 5000.0), (0.0, 6000.0)]
def test_zwei_kandidaten_im_selben_abschnitt_sortiert(self):
einfuegen, verworfen = sepliste_einsortier_positionen(
self.KETTE, [("B", 50.0, 4000.0), ("A", -50.0, 2000.0)])
assert einfuegen == {1: ["A", "B"]}
assert verworfen == []
def test_vor_as_und_hinter_es_verworfen(self):
einfuegen, verworfen = sepliste_einsortier_positionen(
self.KETTE, [("vor", 0.0, -500.0), ("hinter", 0.0, 6500.0)])
assert einfuegen == {}
assert sorted(verworfen) == ["hinter", "vor"]
def test_kette_um_eine_kurve(self):
"""Polygonzug statt Gerade AS->ES: ein Separator auf dem zweiten
Schenkel einer L-Kette gehoert in DEN Abschnitt, nicht nach
seiner Projektion auf die Diagonale."""
kette = [(0.0, 0.0), (0.0, 3000.0), (3000.0, 3000.0)]
einfuegen, _ = sepliste_einsortier_positionen(kette, [("S", 1500.0, 3050.0)])
assert einfuegen == {1: ["S"]}
def test_entartete_kette(self):
einfuegen, verworfen = sepliste_einsortier_positionen(
[(0.0, 0.0), (0.0, 0.0)], [("S", 10.0, 10.0)])
assert einfuegen == {}
assert verworfen == ["S"]
class TestMubeaVf3:
def test_trackids_mit_freien_separatoren(self):
items = _pipeline(_mubea_vf3())
assert _by_id(items, "0015").get("trackids") == \
"0061, 0062, 0038, 0037, 0063, 0064"
def test_nachbarn_der_kette(self):
items = _pipeline(_mubea_vf3())
assert _by_id(items, "0062")["nachbarn"] == "0061, 0038"
assert _by_id(items, "0038")["nachbarn"] == "0062, 0037"
assert _by_id(items, "0037")["nachbarn"] == "0038, 0063"
assert _by_id(items, "0063")["nachbarn"] == "0037, 0064"
def test_hinweis_am_freien_separator(self):
items = _pipeline(_mubea_vf3())
assert "0015" in _by_id(items, "0037").get("warnung", "")
assert _by_id(items, "0062").get("warnung", "") == ""
def test_merkmal_einsortiert_in(self):
items = _pipeline(_mubea_vf3())
assert _by_id(items, "0037")["merkmale"].get("Einsortiert in") == "0015"
assert _by_id(items, "0038")["merkmale"].get("Einsortiert in") == "0015"
assert "Einsortiert in" not in _by_id(items, "0062")["merkmale"]
def test_fremde_zuordnung_bleibt_draussen(self):
items = _mubea_vf3()
_by_id(items, "0037")["merkmale"]["Zuordnung"] = "0002-L"
_pipeline(items)
assert _by_id(items, "0015").get("trackids") == "0061, 0062, 0038, 0063, 0064"
def test_ausserhalb_der_strecken_bbox_bleibt_draussen(self):
items = _mubea_vf3()
_by_id(items, "0038")["_bbox"]["cx"] = -3000.0
_pipeline(items)
assert _by_id(items, "0015").get("trackids") == "0061, 0062, 0037, 0063, 0064"
def test_ohne_ids_kein_einsortieren(self):
"""Altbestand ohne aufgeloeste IDs: Glieder nicht lokalisierbar ->
sepliste bleibt wie gebaut."""
items = _mubea_vf3()
for e in _by_id(items, "0015")["sepliste"]:
e["id"] = ""
einsortieren_freie_separatoren(items, TOL_MM)
assert len(_by_id(items, "0015")["sepliste"]) == 4
+181
View File
@@ -0,0 +1,181 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
test_export_sivas_as_es.py - Sivas-Merkmale 4427-4432 (AS-/ES-Element) fuer
Gefaellestrecke (GF_N) und Streckengruppe (VF_N).
Pruefpunkte: Vorhandensein haengt am Winkel (nicht an der Seite, die immer
einen Vorgabewert traegt), der Winkel wird in die Sivas-Schreibweise der
Auswahlliste uebersetzt, ohne Element bleiben Winkel UND Seite leer, die
Zuordnung steht vollstaendig in cfg/sivas.cfg, und die GF-Gruppierung trennt
Bloecke mit unterschiedlichem AS-/ES-Element.
Laeuft komplett ohne BricsCAD (reine Python-Logik).
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
import export_sivas # noqa: E402
import sivas_mapping # noqa: E402
# Sivas-Schreibweise der Winkel-Auswahlliste (cfg/sivas.cfg
# [as_es_winkel_anzeige]) - die Tests vergleichen gegen die Config, damit ein
# Nachziehen der Schreibweise dort nicht die halbe Testdatei bricht.
W30 = export_sivas.as_es_winkel("30")
W90 = export_sivas.as_es_winkel("90")
def _strecke(nr, typ="Gefaellestrecke", **attr):
"""GF_N-/VF_N-Block mit dem gemeinsamen Strecken-Attributschema."""
attribs = {"ID": f"000{nr}", "Bezeichnung": f"GF_{nr}", "ARTINR": "6220",
"MONTAGEHOEHE_m": "2.000", "HOEHE_VON_mm": "2000",
"HOEHE_BIS_mm": "1000", "TYP": typ,
"L_GF_m": "3.000", "GF_WINKEL": "3",
"SEITE_AS": "links", "WINKEL_AS": "90",
"SEITE_ES": "links", "WINKEL_ES": "90"}
attribs.update(attr)
return {"block_name": f"GF_{nr}", "x": 0.0, "y": 0.0, "z": 2000.0,
"rotation": 0.0, "attribs": attribs}
def test_as_es_vorhanden_mit_winkel_und_seite():
details = export_sivas.build_gefaellestrecke_details(_strecke(1))
assert details["4431"] == "Ja"
assert details["4427"] == W90
assert details["4428"] == "links"
assert details["4432"] == "Ja"
assert details["4429"] == W90
assert details["4430"] == "links"
def test_zuordnung_steht_in_der_config():
"""Die sechs Merkmale muessen in BEIDEN Strecken-Abschnitten von
sivas.cfg stehen (GF_N und VF_N lesen dieselben Attribute)."""
for abschnitt in ("gefaellestrecke", "variofoerderer"):
mapping = sivas_mapping.load_section_mapping(abschnitt)
for merkmal, attribut, transform in (
("4431", "WINKEL_AS", "as_es_vorhanden"),
("4427", "WINKEL_AS", "as_es_winkel"),
("4428", "SEITE_AS", "as_seite"),
("4432", "WINKEL_ES", "as_es_vorhanden"),
("4429", "WINKEL_ES", "as_es_winkel"),
("4430", "SEITE_ES", "es_seite")):
assert merkmal in mapping, f"{merkmal} fehlt in [{abschnitt}]"
ist_attribut, _alt, _default, ist_transform = mapping[merkmal]
assert ist_attribut == attribut, f"[{abschnitt}] {merkmal}"
assert ist_transform == transform, f"[{abschnitt}] {merkmal}"
assert ist_transform in export_sivas.TRANSFORMS
def test_winkel_in_sivas_schreibweise():
"""4427/4429 tragen den Optionswert der Auswahlliste, nicht die nackte
Attributzahl (Vorgabe aus cfg/sivas.cfg [as_es_winkel_anzeige])."""
details = export_sivas.build_gefaellestrecke_details(
_strecke(1, WINKEL_AS="30", WINKEL_ES="90.0"))
assert details["4427"] == W30
assert details["4429"] == W90
# Unbekannter Winkel faellt auf die ganzzahlige Rohzahl zurueck
assert export_sivas.as_es_winkel("60.0") in (W30, W90, "60")
def test_ohne_winkel_kein_element_und_keine_seite():
"""Leerer WINKEL_AS = kein AS-Element; die Seite darf dann NICHT
durchgereicht werden (SEITE_AS traegt mit "rechts" immer einen
Schema-Vorgabewert)."""
details = export_sivas.build_gefaellestrecke_details(
_strecke(1, WINKEL_AS="", SEITE_AS="rechts"))
assert details["4431"] == "Nein"
assert details["4427"] == ""
assert details["4428"] == ""
# ES bleibt davon unberuehrt
assert details["4432"] == "Ja"
assert details["4430"] == "links"
def test_seite_rechts():
details = export_sivas.build_gefaellestrecke_details(
_strecke(1, SEITE_AS="rechts", SEITE_ES="rechts"))
assert details["4428"] == "rechts"
assert details["4430"] == "rechts"
def test_variofoerderer_hat_dieselben_merkmale():
block = _strecke(1, typ="Streckengruppe", L_VF_m="2.000", VF_WINKEL="0",
ANTRIEBFAHRTRICHTUNG="Auf", MOTORSEITE="rechts",
WINKEL_AS="30", SEITE_AS="rechts")
details = export_sivas.build_variofoerderer_details(block)
assert details["4431"] == "Ja"
assert details["4427"] == W30
assert details["4428"] == "rechts"
assert details["4429"] == W90
def test_gruppierung_trennt_nach_as_seite():
"""Sonst baugleiche Gefaellestrecken mit AS links bzw. rechts duerfen
nicht in einer Sivas-Zeile landen (die Zeile wuerde nur eine der beiden
Seiten zeigen)."""
links = export_sivas.gefaellestrecke_signature(_strecke(1, SEITE_AS="links"))
rechts = export_sivas.gefaellestrecke_signature(_strecke(2, SEITE_AS="rechts"))
assert links != rechts
assert links == export_sivas.gefaellestrecke_signature(_strecke(3, SEITE_AS="links"))
def test_gruppierung_trennt_nach_as_winkel():
assert (export_sivas.gefaellestrecke_signature(_strecke(1, WINKEL_AS="30"))
!= export_sivas.gefaellestrecke_signature(_strecke(2, WINKEL_AS="90")))
def test_gruppierung_ohne_element_ignoriert_die_seite():
"""Ohne AS-Element ist die Seite bedeutungslos und steht auch nicht in der
Zeile - sie darf die Gruppierung dann nicht aufspalten."""
assert (export_sivas.gefaellestrecke_signature(
_strecke(1, WINKEL_AS="", SEITE_AS="links"))
== export_sivas.gefaellestrecke_signature(
_strecke(2, WINKEL_AS="", SEITE_AS="rechts")))
def test_reihenfolge_im_details_json():
"""Die sechs Merkmale stehen im details-JSON direkt HINTER 2950
(Anlagenhoehe) - so vorgegeben, und so steht es in beiden Abschnitten von
sivas.cfg. Die Reihenfolge der JSON-Keys folgt der Zeilenreihenfolge der
Config (configparser und dict erhalten beide die Einfuegereihenfolge)."""
erwartet = ["2950", "4431", "4427", "4428", "4432", "4429", "4430"]
gf = list(export_sivas.build_gefaellestrecke_details(_strecke(1)))
vf = list(export_sivas.build_variofoerderer_details(
_strecke(2, typ="Streckengruppe", L_VF_m="2.000")))
assert gf[:len(erwartet)] == erwartet
assert vf[:len(erwartet)] == erwartet
def test_altbestand_ohne_die_attribute():
"""Bloecke aus Zeichnungen, die vor der Einfuehrung von WINKEL_AS gebaut
wurden, haben die Attribute gar nicht - dann greift der leere Default und
es wird "Nein" gemeldet (statt KeyError). Das ist die einzig moegliche
Aussage: Sivas kennt nur Ja/Nein, kein "unbekannt"."""
block = _strecke(1)
for tag in ("WINKEL_AS", "SEITE_AS", "WINKEL_ES", "SEITE_ES"):
del block["attribs"][tag]
details = export_sivas.build_gefaellestrecke_details(block)
assert details["4431"] == "Nein"
assert details["4432"] == "Nein"
assert details["4427"] == details["4428"] == ""
assert details["4429"] == details["4430"] == ""
def test_transform_mit_attribs_kontext():
"""Der @braucht_attribs-Transform muss das komplette Attribut-Dict sehen -
sonst koennte die Seite ihre Abhaengigkeit vom Winkel nicht pruefen."""
assert getattr(export_sivas.as_seite, "braucht_attribs", False)
assert getattr(export_sivas.es_seite, "braucht_attribs", False)
assert not getattr(export_sivas.ja_nein, "braucht_attribs", False)
mapping = {"4428": ("SEITE_AS", None, "", "as_seite")}
attribs = {"SEITE_AS": "links", "WINKEL_AS": "90"}
assert sivas_mapping.anwenden(mapping, attribs, export_sivas.TRANSFORMS) \
== {"4428": "links"}
attribs_ohne = {"SEITE_AS": "links", "WINKEL_AS": ""}
assert sivas_mapping.anwenden(mapping, attribs_ohne, export_sivas.TRANSFORMS) \
== {"4428": ""}
+1 -1
View File
@@ -100,7 +100,7 @@ def test_geruest_unveraendert():
assert zeilen["825002022"]["anzahl"] == 2
assert zeilen["825002022"]["teileart"] == "Geruest Saeule 2 Zoll"
assert zeilen["825002022"]["ids"] == ["0060"]
assert zeilen["825002022"]["dispgruppe"] == 20
assert zeilen["825002022"]["dispgruppe"] == 30
# Ohne TEILEFARBE kein Farb-Merkmal
assert zeilen["825002022"]["details"] == {}
+13 -3
View File
@@ -26,12 +26,14 @@
;; also genau die Werte, mit denen die Ketten in BricsCAD gebaut wurden.
;;
;; JSON-Aufbau (FLACH, weil ssg-load-json zeilenweise liest - Details in
;; tests/testdata/object_data.md Abschnitt 8):
;; doc/json-input-lisp.md Abschnitt 6):
;; Kopf-Objekt (traegt "test_id"): test_id, anlagetyp, modus,
;; anzahl_eingaben, block, dxf_handle, startpunkt_mm,
;; rotation_grad, beschreibung, sivas_* , erwartung_hinweis
;; Eingabe-Objekt (traegt "typ"): point_abs | point_rel | real | int |
;; string | step - in exakter Frage-Reihenfolge
;; string | step | nil - in exakter Frage-Reihenfolge
;; ("nil" = Frage gestellt und bewusst uebergangen, z.B.
;; keine Zufuehrungsachse gewaehlt)
;; Ein Kopf-Objekt beginnt eine Kette, die folgenden Eingabe-Objekte gehoeren
;; dazu (hmrec:gruppiere).
;;
@@ -291,6 +293,13 @@
(list (cons "STR" (hmrec:als-string (ssg-val e "wert")))))
((= typ "step")
(list (cons "STEP" (hmrec:als-string (ssg-val e "wert")))))
;; Eine Frage, die gestellt und bewusst uebergangen wurde (bisher nur die
;; Zufuehrungsachse des AS-Elements, siehe ProtokollSink.as_achse in
;; lib/vf_journal_export.py) - im Journal ein wertloser "NIL"-Eintrag.
;; Er MUSS mitlaufen: beim Replay poppt ihn vfl-in-point, sonst zoege
;; dieser Aufruf den naechsten Wert aus der Queue (Desync).
((= typ "nil")
(list (cons "NIL" nil)))
(T nil)
)
)
@@ -468,6 +477,7 @@
;; aufgehen und warten).
(setq *hmrec-alt-wizard* (if (boundp '*vfl-wizard-mode*) *vfl-wizard-mode*))
(setq *vfl-wizard-mode* nil)
(setq *hmrec-alt-gui* (if (boundp '*ssg-gui-aus*) *ssg-gui-aus*))
(if (car (atoms-family 1 '("SSG-GUI-AUS"))) (ssg-gui-aus))
;; Headless-Riegel der Produktion einschalten: eine erschoepfte Replay-Queue
;; ist dann ein harter, lokalisierter Abbruch statt eines stillen Rueckfalls
@@ -488,7 +498,7 @@
alert *hmrec-alt-alert*)
(setq *vfl-wizard-mode* *hmrec-alt-wizard*)
(setq *vfl-headless* *hmrec-alt-headless*)
(if (car (atoms-family 1 '("SSG-GUI-AN"))) (ssg-gui-an))
(setq *ssg-gui-aus* *hmrec-alt-gui*) ; Vorzustand, nicht pauschal an
(princ)
)
+1 -1
View File
@@ -12,7 +12,7 @@ Zwei Ebenen:
Die Testdaten stammen aus lib/vf_journal_export.py (Journale der VF_n-Bloecke
aus data/polylines.dxf, XDATA-App SSG_VF_EDIT) und nicht aus Handarbeit -
Schema siehe tests/testdata/object_data.md Abschnitt 8.
Schema siehe doc/json-input-lisp.md Abschnitt 6.
"""
import json
+3 -3
View File
@@ -53,7 +53,7 @@
;; hundm05.json auch andere Objekte der Anlage stehen - erkennbar an
;; "function". Format wie in tests/testdata/kreisel_tests.json, damit die
;; Felder nicht zweimal beschrieben werden muessen (Schema: siehe
;; tests/testdata/object_data.md Abschnitt 1).
;; doc/json-input-lisp.md Abschnitt 1).
;; vsp-gruppieren ignoriert diese Objekte, sie stoeren die Ketten also nicht.
;; lib/vf_spec_export.py uebernimmt sie beim Neuerzeugen der Spec-Daten
;; unveraendert ans Dateiende (sonst waeren sie beim naechsten Lauf weg).
@@ -61,7 +61,7 @@
;; Unterstuetzt: Kreisel (function "insert", wie test_kreisel.lsp) und
;; beliebige eigenstaendige Bloecke ueber "block" (Separator/Scanner sowie
;; BTMT-Beladung/SC_Entladung, wie in mubea.json - Schema tests/testdata/
;; object_data.md Abschnitt 5). Unterscheidung ueber das Feld "block": nur
;; json-input-lisp.md Abschnitt 2). Unterscheidung ueber das Feld "block": nur
;; Bloecke haben es, Kreisel-Eintraege nicht. hundm05:bau-sensor ist dabei
;; blockname-agnostisch (reiner _.INSERT), der "kind"-Wert "sensor" bleibt
;; als Sammelbegriff fuer "kein Kreisel" bestehen (siehe dort).
@@ -125,7 +125,7 @@
"kreisel-insert-script lieferte nil"))))))
;; Separator/Scanner/BTMT-Beladung/SC_Entladung bauen ("block"-Eintraege,
;; siehe object_data.md Abschnitt 5). ils-insert-sensor/ils-insert-station
;; siehe json-input-lisp.md Abschnitt 2). ils-insert-sensor/ils-insert-station
;; (SSG_LIB_Commands.lsp) sind dafuer NICHT scriptbar (fragen 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
+6 -2
View File
@@ -59,7 +59,11 @@ def spec_ergebnisse(alle_ergebnisse):
@pytest.fixture(scope="module")
def kreisel_ergebnisse(alle_ergebnisse):
raus = [r for r in alle_ergebnisse if r.get("kind") == "kreisel"]
"""Ergebnisse ALLER nachgetragenen Anlagenteile (Gegenstueck zu
kreisel_objekte) - nicht nur kind "kreisel": Separatoren, Scanner und
BTMT kommen als kind "sensor" zurueck. Der Name ist historisch."""
raus = [r for r in alle_ergebnisse
if r.get("kind", "linienzug") != "linienzug"]
if not raus:
pytest.skip("keine Kreisel-Ergebnisse (Lauf vor dem Nachtragen "
"weiterer Anlagenteile?)")
@@ -180,7 +184,7 @@ class TestSpecBau:
# ============================================================
# tests/testdata/hundm05.json enthaelt neben den Ketten auch andere Objekte
# der Anlage - Format wie tests/testdata/kreisel_tests.json (Schema in
# tests/testdata/object_data.md Abschnitt 1). Gebaut werden sie von
# doc/json-input-lisp.md Abschnitt 1). Gebaut werden sie von
# hundm05:bau-zusatzobjekte in tests/test_hundm05.lsp.
class TestZusatzobjekte:
+239 -6
View File
@@ -13,6 +13,7 @@
;; "typ" ist ein Eingabe-Schritt in exakter Aufruf-Reihenfolge:
;; {"typ":"point_abs","wert":[x,y,z]} absoluter Punkt (getpoint)
;; {"typ":"point_rel","dL":..,"hz":..} Basispunkt + dL entlang Richtung hz
;; {"typ":"point_none"} getpoint ohne Punkt (Enter -> nil)
;; {"typ":"real","wert":..} getreal
;; {"typ":"int","wert":..} getint
;; {"typ":"string","wert":".."} getstring
@@ -53,17 +54,23 @@
;; Skript-Eintrag (P dL hz) -> Basispunkt + dL entlang Richtung hz (Grad),
;; sodass die Projektion in vfl-neue-linie-messen
;; exakt dL ergibt.
;; Skript-Eintrag KEIN -> nil (Enter ohne Punkt, z.B. optionale
;; AS-Zufuehrungsachse nicht gesetzt)
(defun tlz-getpoint (a b / spec base rad)
(setq spec (tlz-pop))
(setq base (if (and a (listp a)) a '(0.0 0.0 0.0)))
(if (and (listp spec) (= (car spec) 'A))
(list (float (cadr spec)) (float (caddr spec)) (float (cadddr spec)))
(cond
((= spec 'KEIN) nil)
((and (listp spec) (= (car spec) 'A))
(list (float (cadr spec)) (float (caddr spec)) (float (cadddr spec))))
(T
(progn
(setq rad (* (float (caddr spec)) (/ pi 180.0)))
(list (+ (car base) (* (float (cadr spec)) (cos rad)))
(+ (cadr base) (* (float (cadr spec)) (sin rad)))
(caddr base))
)
)
)
)
(defun tlz-getstring (a) (tlz-pop))
@@ -84,6 +91,8 @@
(setq q (cons (cons 'A (ssg-val schritt "wert")) q)))
((= typ "point_rel")
(setq q (cons (list 'P (ssg-val schritt "dL") (ssg-val schritt "hz")) q)))
((= typ "point_none")
(setq q (cons 'KEIN q)))
((= typ "real")
(setq q (cons (float (ssg-val schritt "wert")) q)))
((= typ "int")
@@ -139,7 +148,7 @@
;; ebenfalls nur einen einzigen Testfall pro Lauf kennt).
(defun tlz-run-datei (json-datei test-id befehl-anzeige /
daten meta schritte-anz rest-anz status
old-vgp old-gs old-gi old-gr err)
old-vgp old-gs old-gi old-gr err old-gui)
(if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek))
(if (null (car (atoms-family 1 '("VF-LINIENZUG-MODUS"))))
(progn
@@ -176,6 +185,7 @@
;; GUI aus: keine Wizard-DCL-Dialoge waehrend des automatischen Replays -
;; die Eingaben kommen aus der Mock-Queue (getstring/getint/getreal), siehe
;; ssg-gui-aus/ssg-gui-p in ssg_core.lsp und vfl-wizard-mode-p.
(setq old-gui (if (boundp '*ssg-gui-aus*) *ssg-gui-aus*))
(if (car (atoms-family 1 '("SSG-GUI-AUS"))) (ssg-gui-aus))
;; --- Eingabe-Funktionen sichern und durch Mocks ersetzen ---
@@ -192,9 +202,11 @@
;; --- Eingabe-Funktionen wiederherstellen (IMMER) ---
(setq vfl-getpoint old-vgp getstring old-gs getint old-gi getreal old-gr)
;; GUI wieder einschalten (auch nach Fehler), damit eine folgende interaktive
;; Sitzung nicht headless bleibt.
(if (car (atoms-family 1 '("SSG-GUI-AN"))) (ssg-gui-an))
;; GUI-Zustand von VOR dem Test wiederherstellen (auch nach Fehler) - NICHT
;; pauschal einschalten: unter SSG_RUN_ALL_TESTS ist sie fuer den ganzen
;; Batch aus, und ein pauschales ssg-gui-an liess den anschliessenden
;; EXPORTSIVAS nach Hoehen-Check/Bereinigen fragen (Lauf hing).
(setq *ssg-gui-aus* old-gui)
(setq rest-anz (length *tlz-q*))
@@ -255,3 +267,224 @@
(tlz-run-datei json-datei "LZ_Stufe2_Kettenende" "TEST_LINIENZUG_STUFE2")
(princ)
)
;; ============================================================
;; MODUS 2 (aus 3D-Linie mit Zielhoehe) - Replay echter Laeufe
;; ============================================================
;; Anders als die Modus-1-Faelle oben braucht Modus 2 KEINE Mocks und KEINEN
;; gezeichneten Pfad: sein Journal traegt einen SEGS-Eintrag mit der kompletten
;; Segment-Essenz (Typ, Richtung, Laenge, Eckwinkel, Seite, Start/Ende), ist
;; also von den Original-Objekten unabhaengig - dieselbe Eigenschaft, auf der
;; schon vfl-konvertiere-ent beruht (vfl-journal-hat-segs-p). Der Test spielt
;; daher das echte, aus der Zeichnung ausgelesene Journal ab.
;;
;; Die Faelle sind zwei BEWUSST gebildete Paare, kein Sammelsurium:
;;
;; A/B (Ecke als Vario-Kurve bzw. als GF-Bogen) - derselbe Pfad, nur die
;; 90-Grad-Ecke einmal waagerecht und einmal geneigt eingebaut. Sie laufen
;; durch verschiedene Zweige (mit und ohne flache Zone), und genau der
;; VERGLEICH hat am 2026-10-26/27 Fehler aufgedeckt, die ein einzelner
;; Lauf nicht gezeigt haette (ES-Fussabdruck am falschen Segment: 878 mm
;; nur in der GF-Bogen-Variante).
;;
;; U-Form 1..3 (gefalteter Lauf) - der Pfad wechselt ueber zwei 90-Grad-
;; Vario-Kurven dreimal die Fahrtrichtung, die Kletterstrecke liegt
;; dadurch in einem ANDEREN Schenkel als der Lauf-Eingang. Hier variieren
;; GF-VERTEILUNG (alles am Einlauf vs. 1/2+1/2) und WINKEL. Beides ist
;; noetig: die Verteilung entscheidet, ob ueberhaupt GF im fremden
;; Schenkel steht (Nachrechner, Fueller-A), und der Restfehler der alten
;; Bilanz skalierte mit L_GF, also mit dem Winkel (6 Grad 90 mm, 9 Grad
;; 934 mm) - zwei Laeufe mit demselben Winkel haetten das verdeckt.
;;
;; Einen Fall zu loeschen nimmt dem Test den jeweiligen Vergleich und damit
;; seinen Wert.
;;
;; Aufgezeichnet mit lib/vf_journal_export.py aus echten BricsCAD-Laeufen
;; (A/B am 2026-10-27, U-Form am 2026-10-29).
;; Pruefkriterium (Nutzer-Vorgabe 2026-10-26): quer zur ES-KS_AUS-Achse und dZ
;; MUESSEN ~0 sein, laengs DARF abweichen (Ausladung des ES-Elements).
(setq *tlz-m2-toleranz* 1.0) ; mm; 0.2 ist die Messaufloesung der Blockmasse
;; Toleranz fuer den LAENGS-Wert gegen "erwartung_laengs_mm" aus den Testdaten.
;; Der Wert ist die Ausladung des ES-Elements und damit je Fall eine Konstante
;; (gemessen: 104.68 mm bei ES_Element_30, 637.58 mm bei ES_Element_90) - 5 mm
;; reichen also fuer Rundung, ohne echte Abweichungen durchzulassen.
;;
;; Warum ueberhaupt geprueft, wo laengs doch ausdruecklich abweichen DARF:
;; Am 2026-10-29 loeste ein Experiment den Schluss-Fueller gegen Richtung UND
;; Laenge und traf den Zielpunkt dadurch in X und Y exakt - um den Preis, dass
;; es die letzte Gerade um 6.15 Grad verdrehte (sichtbar schiefer Schenkel im
;; U-Form-Fall). quer und dZ waren dabei NULL, der Test meldete OK; gefunden
;; wurde der Fehler nur mit dem Auge in der Zeichnung.
;; laengs ist der Wert, der das verraet: ein verdrehter Hauptstrang zielt auf
;; den Endpunkt und drueckt laengs von ~638 mm auf ~0. Die Pruefung ist also
;; kein zweites Genauigkeitskriterium, sondern ein Formkriterium - sie stellt
;; sicher, dass der ES-Versatz noch da ist, wo er hingehoert.
(setq *tlz-m2-laengs-toleranz* 5.0)
;; Wert als String - eigene Kopie statt hmrec:als-string aus
;; test_hm_recformat.lsp: diese Datei soll fuer sich allein ladbar bleiben.
(defun tlz-m2-str (v)
(cond ((null v) "")
((= (type v) 'STR) v)
((= (type v) 'INT) (itoa v))
((= (type v) 'REAL) (rtos v 2 6))
(T (vl-princ-to-string v))))
;; Ein JSON-Record -> Journal-Eintrag (kind . wert), nil bei Metadaten-Zeile.
(defun tlz-m2-eintrag->journal (e / art)
(setq art (ssg-val e "art"))
(cond
((null art) nil)
((= art "PT") (cons "PT" (list (float (ssg-val e "x"))
(float (ssg-val e "y"))
(float (ssg-val e "z")))))
((= art "REAL") (cons "REAL" (float (ssg-val e "wert"))))
((= art "INT") (cons "INT" (fix (ssg-val e "wert"))))
;; SEGS traegt im Journal eine LISTE von Segment-Records, nicht den
;; String - genau diese Umwandlung macht auch der XDATA-Decoder
;; (vfl-journal-string->entry). Ohne sie bekommt vfl-in-segmente den
;; Rohstring und der erste mapcar darauf stirbt (real 2026-10-27).
((= art "SEGS") (cons "SEGS" (vfl-string->segs (tlz-m2-str (ssg-val e "wert")))))
(T (cons art (tlz-m2-str (ssg-val e "wert"))))))
;; Einen Modus-2-Fall abspielen. Rueckgabe: (status laengs quer dz offen).
(defun tlz-m2-run (json-datei test-id anzeige /
daten journal meta offen err status abw j
old-headless old-gui quer dz laengs
soll-laengs laengs-ok)
(if (or (not *lib-initialized*) (null bogen-auf)) (init-bibliothek))
(princ (strcat "\n\n--- " anzeige " ---"))
;; Vorbelegen, damit der Ergebnis-Record auch im Fehlerzweig Zahlen hat -
;; sonst stirbt das abschliessende rtos an nil (real passiert 2026-10-27).
(setq laengs 0.0 quer 999.0 dz 999.0 offen 0 status "FEHLER")
(setq daten (ssg-load-json json-datei))
(if (null daten)
(progn (princ (strcat "\n FEHLER: Testdaten fehlen: " json-datei))
(setq status "FEHLER"))
(progn
(setq meta (car daten))
(setq journal '())
(foreach e daten
(setq j (tlz-m2-eintrag->journal e))
(if j (setq journal (cons j journal))))
(setq journal (reverse journal))
(princ (strcat "\n Journal-Eintraege: " (itoa (length journal))))
(if meta (princ (strcat "\n Szenario: " (ssg-val meta "kurz"))))
(ssg-start anzeige '(("OSMODE") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0) (setvar "ATTREQ" 0) (setvar "ATTDIA" 0)
;; GUI aus (keine Wizard-Dialoge) UND headless: eine erschoepfte
;; Replay-Queue ist damit ein harter Abbruch MIT Fundstelle statt eines
;; stillen Rueckfalls auf eine Live-Abfrage, die im Batch haengen wuerde.
(setq old-gui *ssg-gui-aus* old-headless *vfl-headless*)
(if (car (atoms-family 1 '("SSG-GUI-AUS"))) (ssg-gui-aus))
(setq *vfl-headless* T *vfl-m2-abweichung* nil)
(vfl-journal-replay-start journal)
(setq err (vl-catch-all-apply 'vf-linienzug-modus2 '()))
(setq *vfl-headless* old-headless *ssg-gui-aus* old-gui)
(if (car (atoms-family 1 '("SSG-GUI-AN"))) (if (null old-gui) (ssg-gui-an)))
(setq offen (length *vfl-replay-queue*))
(setq abw (if (boundp '*vfl-m2-abweichung*) *vfl-m2-abweichung* nil))
(setq laengs (if abw (car abw) 0.0)
quer (if abw (cadr abw) 999.0)
dz (if abw (caddr abw) 999.0))
(cond
((vl-catch-all-error-p err)
(setq status "FEHLER")
(princ (strcat "\n FEHLER: " (vl-catch-all-error-message err))))
((null abw)
(setq status "FEHLER")
(princ "\n FEHLER: keine Abweichung gemessen (Bau nicht beendet)."))
(T
(princ (strcat "\n laengs=" (rtos laengs 2 1)
" quer=" (rtos quer 2 1)
" dZ=" (rtos dz 2 1) " mm"))
(if (> offen 0)
(princ (strcat "\n WARNUNG: " (itoa offen)
" Journal-Eintraege NICHT verbraucht (Ablauf weicht ab).")))
;; laengs gegen den erwarteten ES-Versatz pruefen, sofern die
;; Testdaten einen nennen (siehe *tlz-m2-laengs-toleranz*).
(setq soll-laengs (if meta (ssg-val meta "erwartung_laengs_mm") nil))
(setq laengs-ok
(if (numberp soll-laengs)
(<= (abs (- laengs (float soll-laengs))) *tlz-m2-laengs-toleranz*)
T))
(if (not laengs-ok)
(princ (strcat "\n WARNUNG: laengs " (rtos laengs 2 1)
" statt erwarteter " (rtos (float soll-laengs) 2 1)
" mm - der Hauptstrang zeigt nicht mehr in die"
" gezeichnete Richtung (ES-Versatz verschwunden?).")))
(setq status
(if (and (<= (abs quer) *tlz-m2-toleranz*)
(<= (abs dz) *tlz-m2-toleranz*)
laengs-ok
(= offen 0))
"OK" "ABWEICHUNG"))
(princ (strcat "\n -> " status
" (Soll: |quer| und |dZ| <= " (rtos *tlz-m2-toleranz* 2 1)
" mm, laengs = "
(if (numberp soll-laengs)
(strcat (rtos (float soll-laengs) 2 0) " +/- "
(rtos *tlz-m2-laengs-toleranz* 2 0) " mm")
"frei")
")"))))
(ssg-end)))
(list status laengs quer dz offen))
;; Testfall-Tabelle: (Dateiname test-id Anzeigename). Ein weiterer Fall ist
;; damit EINE Zeile - der Ablauf darunter ist generisch. Reihenfolge =
;; Ausgabereihenfolge; die beiden Paare stehen bewusst beieinander.
(setq *tlz-m2-faelle*
(list
(list "linienzug_modus2_variokurve.json" "LZ_M2_variokurve"
"Variante A: Ecke = Vario-Kurve")
(list "linienzug_modus2_gfbogen.json" "LZ_M2_gfbogen"
"Variante B: Ecke = GF-Bogen")
(list "linienzug_modus2_uform_gf1.json" "LZ_M2_uform_gf1"
"U-Form 1: GF alles am Einlauf")
(list "linienzug_modus2_uform_halb.json" "LZ_M2_uform_halb"
"U-Form 2: GF 1/2 + 1/2")
(list "linienzug_modus2_uform_halb_steil.json" "LZ_M2_uform_halb_steil"
"U-Form 3: GF 1/2 + 1/2, steilere Winkel-Option")))
(defun c:TEST_LINIENZUG_MODUS2 ( / basis fall r erg zeilen anzahl-ok)
;; Doppelte Backslashes: "\t" waere in AutoLISP ein TABULATOR, der Pfad
;; wuerde zu "...dxfmakros<TAB>ests<TAB>estdata" (real passiert 2026-10-27).
(setq basis (strcat (getenv "DXFMAKRO") "\\tests\\testdata\\"))
(princ "\n================================================================")
(princ (strcat "\n TEST_LINIENZUG_MODUS2 - " (itoa (length *tlz-m2-faelle*))
" Ketten aus echten BricsCAD-Laeufen"))
(princ "\n================================================================")
(setq erg '() zeilen '() anzahl-ok 0)
(foreach fall *tlz-m2-faelle*
(setq r (tlz-m2-run (strcat basis (car fall)) (cadr fall) (caddr fall)))
(if (= (car r) "OK") (setq anzahl-ok (1+ anzahl-ok)))
(setq erg (cons (list (caddr fall) (car r)) erg))
(setq zeilen
(cons (strcat " { \"test_id\": \"" (cadr fall)
"\", \"status\": \"" (car r)
"\", \"quer_mm\": " (rtos (caddr r) 2 2)
", \"dz_mm\": " (rtos (cadddr r) 2 2)
", \"laengs_mm\": " (rtos (cadr r) 2 2) " }")
zeilen)))
(setq erg (reverse erg) zeilen (reverse zeilen))
(princ "\n\n================================================================")
(princ "\n ERGEBNIS")
(princ "\n----------------------------------------------------------------")
(foreach e erg
(princ (strcat "\n " (car e) ": " (cadr e))))
(princ (strcat "\n----------------------------------------------------------------"
"\n " (itoa anzahl-ok) " von " (itoa (length *tlz-m2-faelle*))
" OK"))
(princ "\n================================================================")
;; Ergebnis fuer run-all (Konvention wie linienzug:export-results).
;; ssg-join aus ssg_core - die Zeilen sind bereits fertige JSON-Objekte.
(setq *linienzug-m2-test-results* (ssg-join zeilen ",\n"))
(princ)
)
+2 -2
View File
@@ -140,7 +140,7 @@
;; --- Vario (VF_*): L_GF/L_VF fuer gegebenes deltaL+deltaH+winkel loesen, dann bauen ---
;; deltaL ist (wie bei der Gefaellestrecke) die horizontale PROJIZIERTE
;; Gesamtlaenge des VF (Vorlauf L_GF1 + Foerderer L_VF + Nachlauf L_GF2 +
;; Boegen/AS-ES-Elemente), analog foerderer_tests.json/object_data.md 3.1 -
;; Boegen/AS-ES-Elemente), analog foerderer_tests.json/json-input-lisp.md 3 -
;; KEIN abgeleiteter Wert. "winkel" erzwingt einen bestimmten Bogenwinkel aus
;; der Kandidatenliste von berechne-alle-winkel (wie foerderer:winkel-
;; erzwingen in test_foerderer.lsp), statt den automatisch kleinsten
@@ -295,7 +295,7 @@
;; --- Eine einzelne Gefaellestrecke bauen (Modus 1) ---
;; Aufbau AUSSCHLIESSLICH aus Anfangspunkt (start-mm) und horizontaler
;; Gesamtlaenge deltaL - KEIN Endpunkt (wie Produktion/gefaellestrecke.dcl
;; Modus 1, siehe object_data.md 2.1). L_stau wird aus deltaL abgeleitet
;; Modus 1, siehe json-input-lisp.md 4.1). L_stau wird aus deltaL abgeleitet
;; (identische Formel wie test_gefaellestrecke.lsp):
;; L_stau = (deltaL - aus-dx - ein-dx - sep_x) / cos(v)
;; sep_x = 300 * cos(v), v = Element-Winkel (winkel_grad, Default 3 Grad)
+119 -8
View File
@@ -69,7 +69,56 @@
;; --- Hilfsfunktion: String-Wert aus JSON-Objekt-Zeile lesen ---
;; Sucht "key": "value" in obj-str und gibt value zurueck.
;; Rueckgabe: String (nicht leer) oder nil (key fehlt, null, leer).
(defun alltests:get-str (obj-str key / pat pos val-start val-end val)
;; ------------------------------------------------------------
;; Laufprotokoll je Test (Debug-Schalter "testlauf", Standard EIN)
;; ------------------------------------------------------------
;; DXFM_LOG/testlauf_<name>.dbg - eine Datei je Test, bei jedem Lauf neu.
;; Bewusst NICHT ueber dbgopen/*dbg-path*: die getesteten Module oeffnen und
;; schliessen dort ihre eigenen .dbg-Dateien (vfl_modus1.dbg ...) und wuerden
;; das Protokoll mitten im Test umlenken. Jede Zeile wird SOFORT angehaengt
;; (kein Puffer) - haengt ein Test, steht der letzte erreichte Schritt drin.
(if (not (boundp '*testrun-log*)) (setq *testrun-log* nil))
(defun testrun:log-start (name / dir fh)
(setq *testrun-log* nil)
(if (and (car (atoms-family 1 '("DBG-SCHALTER-P"))) (dbg-schalter-p "testlauf"))
(progn
(setq dir (cond ((getenv "DXFM_LOG")) ((strcat (getenv "DXFMAKRO") "/logs"))))
(vl-mkdir dir)
(setq *testrun-log* (strcat dir "/testlauf_" name ".dbg"))
(if (setq fh (open *testrun-log* "w"))
(progn (write-line (strcat "=== TESTLAUF " name " ===") fh) (close fh))
(setq *testrun-log* nil))))
*testrun-log*)
(defun testrun:log (text / fh)
(if (and *testrun-log* (setq fh (open *testrun-log* "a")))
(progn
(write-line (strcat (if (car (atoms-family 1 '("DBG-TIMESTAMP"))) (dbg-timestamp) "")
" " text)
fh)
(close fh)))
(princ))
;; Schalter, die in einem Testlauf eine Rueckfrage ausloesen koennen.
(defun testrun:zustand ()
(strcat "GUI=" (if (and (boundp '*ssg-gui-aus*) *ssg-gui-aus*) "aus" "AN")
" hoehencheck-fragen=" (vl-princ-to-string (if (boundp '*csv-hoehencheck-fragen*) *csv-hoehencheck-fragen*))
" bereinigen=" (vl-princ-to-string (if (boundp '*csv-bereinigen-vor-export*) *csv-bereinigen-vor-export*))
" wizard=" (vl-princ-to-string (if (boundp '*vfl-wizard-mode*) *vfl-wizard-mode*))
" DWGNAME=" (getvar "DWGNAME")))
;; Dateiname ohne fuehrenden Praefix (sonst unveraendert). Gegenstueck zu
;; export:dwg-praefix, den der Export selbst vor den Namen setzt.
(defun testrun:ohne-praefix (dateiname praefix)
(if (and praefix
(/= praefix "")
(> (strlen dateiname) (strlen praefix))
(= (strcase (substr dateiname 1 (strlen praefix))) (strcase praefix)))
(substr dateiname (1+ (strlen praefix)))
dateiname))
(defun alltests:get-str(obj-str key / pat pos val-start val-end val)
(setq pat (strcat "\"" key "\": \""))
(setq pos (vl-string-search pat obj-str))
(if pos
@@ -151,7 +200,8 @@
namen befehl datei export-fn new-doc
out-path dwg-pfad dxf-pfad old-json test-result
old-filenames csv-name sivas-name csv-pfad
sivas-pfad csv-ok sivas-ok old-filedia)
sivas-pfad csv-ok sivas-ok old-filedia
praefix old-hoehencheck old-bereinigen)
(setq tests-pfad (strcat (getenv "DXFMAKRO") "/tests"))
(setq tests-out-dir (strcat tests-pfad "/output"))
@@ -209,6 +259,13 @@
;; oeffnet DCL-/Wizard-Dialoge, die den automatischen Lauf blockieren wuerden.
;; Am Ende wieder einschalten. Siehe ssg-gui-aus/-an in ssg_core.lsp.
(if (car (atoms-family 1 '("SSG-GUI-AUS"))) (ssg-gui-aus))
;; Rueckfragen des Exports (export.lsp) fuer den ganzen Lauf abschalten -
;; zusaetzlich zur GUI-Sperre, damit auch ein Test, der die GUI wieder
;; einschaltet, den Export nicht anhalten kann.
(setq old-hoehencheck (if (boundp '*csv-hoehencheck-fragen*) *csv-hoehencheck-fragen*)
old-bereinigen (if (boundp '*csv-bereinigen-vor-export*) *csv-bereinigen-vor-export*))
(setq *csv-hoehencheck-fragen* nil
*csv-bereinigen-vor-export* 'aus)
;; Tests laden und ausfuehren
;; Jeder Test bekommt eine eigene neue Zeichnung (statt die aktuelle
@@ -261,11 +318,25 @@
(setq modelspace (vla-get-modelspace new-doc))
;; Block-Library-Flag zuruecksetzen (Bloecke sind pro Zeichnung neu zu laden)
(setq *lib-initialized* nil)
;; Nummernzaehler zuruecksetzen: der Lauf bleibt im LISP-Namensraum des
;; Startdokuments, die Zaehler (max aus Zeichnung UND Zaehler, +1) liefen
;; sonst ueber alle Tests weiter - VF_5/Kreisel12 statt VF_1/Kreisel1 in
;; einer frischen Zeichnung, die Namen hingen damit von der
;; Testreihenfolge ab und jeder Referenz-Diff wurde unruhig.
(setq #VF_LetzteNr 0 #GF_LetzteNr 0 #Kreisel_LetzteNr 0 #Eckrad_LetzteNr 0)
(testrun:log-start name)
(testrun:log (strcat "Test " (itoa idx) "/" (itoa anz) ": " befehl
" Modul=" (if module module "-")
" save=" (if save-fmt save-fmt "-")
" Modus=" (if auto-export "Automatik" "Kontrolle")))
(testrun:log (strcat "Vor Test: " (testrun:zustand)))
(if (findfile datei)
(progn
(load datei)
;; Test mit Fehlerbehandlung ausfuehren
(testrun:log (strcat "Starte " befehl))
(setq test-result
(vl-catch-all-apply
'(lambda ()
@@ -275,12 +346,18 @@
)
)
(if (vl-catch-all-error-p test-result)
(princ (strcat "\n FEHLER in " befehl ": "
(vl-catch-all-error-message test-result)))
)
(progn
(princ (strcat "\n FEHLER in " befehl ": "
(vl-catch-all-error-message test-result)))
(testrun:log (strcat "FEHLER in " befehl ": "
(vl-catch-all-error-message test-result))))
(testrun:log (strcat befehl " beendet")))
(testrun:log (strcat "Nach Test: " (testrun:zustand)))
;; JSON-Export (immer)
(apply export-fn (list tests-out-dir))
(testrun:log (strcat "Ergebnis-JSON " name "_results.json: "
(if (findfile old-json) "vorhanden" "FEHLT")))
(setq out-path (strcat tests-out-dir "/" name "_tests"))
@@ -328,31 +405,59 @@
;; Nur die beiden CSV-Namen ersetzen, alle uebrigen Keys
;; (z.B. kreisel_weichen_datei) unveraendert uebernehmen -
;; eine hart nachgebaute Liste verliert sonst neue Keys.
;; Nach vla-saveas (save "dwg") ist die Zeichnung benannt
;; (DWGTITLED=1, DWGNAME=<name>_tests.dwg), und der Export
;; setzt selbst "<name>_tests_" davor (export:dwg-praefix).
;; Diesen Praefix hier abziehen, sonst entsteht
;; "<name>_tests_<name>_tests_export.csv" und das Warten auf
;; csv-pfad laeuft ins Timeout. DXFOUT benennt die Zeichnung
;; nicht um -> Praefix leer, Name bleibt vollstaendig.
(setq praefix (export:dwg-praefix))
(setq old-filenames *export-filenames*)
(setq *export-filenames*
(mapcar
'(lambda (p)
(cond ((= (car p) "sivas_csv") (cons "sivas_csv" sivas-name))
((= (car p) "csv_csv") (cons "csv_csv" csv-name))
(cond ((= (car p) "sivas_csv")
(cons "sivas_csv" (testrun:ohne-praefix sivas-name praefix)))
((= (car p) "csv_csv")
(cons "csv_csv" (testrun:ohne-praefix csv-name praefix)))
(T p)))
old-filenames))
;; Unmittelbar vor dem Export erneut erzwingen: export.lsp setzt
;; *csv-hoehencheck-fragen* beim (Nach-)Laden von nil auf T, und
;; ein Test kann die GUI wieder eingeschaltet haben.
(if (not (and (boundp '*ssg-gui-aus*) *ssg-gui-aus*))
(progn
(testrun:log "WARNUNG: GUI war nach dem Test wieder AN - fuer den Export abgeschaltet")
(princ "\n WARNUNG: GUI war nach dem Test wieder an - abgeschaltet.")
(ssg-gui-aus)))
(setq *csv-hoehencheck-fragen* nil
*csv-bereinigen-vor-export* 'aus)
(testrun:log (strcat "Vor Export: " (testrun:zustand)))
(princ (strcat "\n CSV-Export -> " csv-name))
(testrun:log (strcat "EXPORTCSV -> " csv-pfad))
(c:EXPORTCSV)
(setq csv-ok (testrun:wait-for-file csv-pfad 30.0))
(princ (if csv-ok "\n CSV OK" "\n CSV TIMEOUT/FEHLER"))
(testrun:log (if csv-ok "EXPORTCSV OK" "EXPORTCSV TIMEOUT/FEHLER - Datei nicht entstanden"))
(princ (strcat "\n Sivas-Export -> " sivas-name))
(testrun:log (strcat "EXPORTSIVAS -> " sivas-pfad))
(c:EXPORTSIVAS)
(setq sivas-ok (testrun:wait-for-file sivas-pfad 30.0))
(princ (if sivas-ok "\n Sivas OK" "\n Sivas TIMEOUT/FEHLER"))
(testrun:log (if sivas-ok "EXPORTSIVAS OK" "EXPORTSIVAS TIMEOUT/FEHLER - Datei nicht entstanden"))
(setq *export-filenames* old-filenames)
;; Zeichnung schliessen: der urspruenglich schon offene Tab
;; bleibt unangetastet, BricsCAD erzeugt daher kein neues
;; Blank-Dokument samt Modul-/Menue-Reload.
(testrun:log "Zeichnung schliessen")
(vla-close new-doc :vlax-false)
(testrun:log "Test fertig")
)
;; ==========================================================
@@ -414,7 +519,9 @@
)
)
)
(princ (strcat "\n WARNUNG: " datei " nicht gefunden - uebersprungen"))
(progn
(princ (strcat "\n WARNUNG: " datei " nicht gefunden - uebersprungen"))
(testrun:log (strcat "WARNUNG: " datei " nicht gefunden - uebersprungen")))
)
) ;; end (progn ...) des aktiven Zweigs
) ;; end (if (cdr (assoc "disabled" entry)) ...)
@@ -422,6 +529,10 @@
;; GUI wieder einschalten (Batch fertig).
(if (car (atoms-family 1 '("SSG-GUI-AN"))) (ssg-gui-an))
;; nil = "nie gesetzt" (export.lsp belegt dann mit der Vorgabe vor)
(setq *csv-hoehencheck-fragen* (if old-hoehencheck old-hoehencheck T)
*csv-bereinigen-vor-export* (if old-bereinigen old-bereinigen 'an))
(setq *testrun-log* nil)
(setq *export-test-override* nil)
+762 -2
View File
@@ -399,6 +399,342 @@
)
;; ------------------------------------------------------------
;; TESTS: vf_linienzug.lsp - "Parallel zum Kreisel" (Rechenkerne)
;; ------------------------------------------------------------
;; Die Bau-Funktion vfl-gf-parallel-kreisel braucht eine Zeichnung (sie misst
;; AS und Bogen an echten Bloecken); ihre beiden Rechenkerne sind davon frei
;; und stehen deshalb hier:
;; vfl-par-bogen-waehlen - welcher Bogen hebt den AS-Schwenk auf?
;; vfl-par-gf-laenge - wie lang wird das GF-Stueck dazwischen?
;; Die Plan-Turn-Werte unten sind die Vorzeichen-Konvention aus
;; vf-element-plan-turn (KS_EIN -> KS_AUS in der XY-Ebene, links positiv).
(defun tu-tests-vfl-parallel ( / _b30 _b60 _b90 _kand _l _plan _plan3 _g _p _w _ez _plan2)
(princ "\n[vf_linienzug Parallel zum Kreisel]")
;; --- Bogenwahl: der Bogen muss den AS-Schwenk GENAU aufheben ---
;; Rechts-Boegen schwenken negativ, Links-Boegen positiv.
(setq _b30 '(30 . -30.0) _b60 '(60 . -60.0) _b90 '(90 . -90.0))
(setq _kand (list _b30 _b60 _b90))
;; AS links 30 Grad (Schwenk +30) -> 30-Grad-Bogen nach rechts
(tu-eq "vfl-par-bogen/as30-rechts" 30 (vfl-par-bogen-waehlen 30.0 _kand 2.0))
;; AS links 90 Grad (Schwenk +90) -> 90-Grad-Bogen nach rechts
(tu-eq "vfl-par-bogen/as90-rechts" 90 (vfl-par-bogen-waehlen 90.0 _kand 2.0))
;; Generisch: auch ein 60-Grad-Schwenk findet seinen Bogen - die Zuordnung
;; folgt den gemessenen Bloecken, nicht einer gepflegten Tabelle.
(tu-eq "vfl-par-bogen/as60-rechts" 60 (vfl-par-bogen-waehlen 60.0 _kand 2.0))
;; kleine Messabweichung bleibt in der Toleranz
(tu-eq "vfl-par-bogen/toleranz-ok" 30 (vfl-par-bogen-waehlen 31.2 _kand 2.0))
;; ausserhalb der Toleranz: lieber nil als ein schiefer Bogen
(tu-nil "vfl-par-bogen/zu-weit-weg" (vfl-par-bogen-waehlen 45.0 _kand 2.0))
(tu-nil "vfl-par-bogen/leere-liste" (vfl-par-bogen-waehlen 30.0 '() 2.0))
;; Gegenseite: Links-Boegen heben einen negativen AS-Schwenk auf
(setq _kand (list '(30 . 30.0) '(60 . 60.0) '(90 . 90.0)))
(tu-eq "vfl-par-bogen/as-rechts30-links" 30 (vfl-par-bogen-waehlen -30.0 _kand 2.0))
;; --- GF-Laenge: abstand = perp-as + L*k + perp-bogen ---
;; Glatter Fall: k = 1 (AS schwenkt 90 Grad aus der Achse), feste Anteile
;; zusammen 500 -> fuer 2000 mm Abstand bleiben 1500 mm GF.
(tu-eqf "vfl-par-laenge/k1" 1500.0 (vfl-par-gf-laenge 2000.0 200.0 300.0 1.0))
;; Gegenseite: k negativ -> der Abstand zaehlt auf der anderen Seite, der
;; Betrag der Eingabe bleibt derselbe (Seite kommt aus der AS-Variante).
(tu-eqf "vfl-par-laenge/k-negativ" 1500.0
(vfl-par-gf-laenge 2000.0 -200.0 -300.0 -1.0))
;; Schraege Ausschleusung: k = sin(60 Grad)
(setq _l (vfl-par-gf-laenge 2000.0 0.0 0.0 (sin (/ (* 60.0 pi) 180.0))))
(tu-eqf "vfl-par-laenge/k-sin60" (/ 2000.0 (sin (/ (* 60.0 pi) 180.0))) _l)
;; Abstand kleiner als der feste Anteil -> negative Laenge (der Aufrufer
;; meldet das als "Abstand zu klein", die Rechnung selbst raet nicht).
(tu-true "vfl-par-laenge/zu-klein-negativ"
(< (vfl-par-gf-laenge 100.0 200.0 300.0 1.0) 0.0))
;; AS schwenkt gar nicht aus der Achse -> keine Loesung
(tu-nil "vfl-par-laenge/kein-versatz" (vfl-par-gf-laenge 2000.0 0.0 0.0 0.0))
;; --- Grenzen einer VF-Einheit (Modus 2) ---
;; Zwischen Umlenk- und Motorstation: hoechstens 2 Vario-Kurven und 25 m.
;; Plan-Eintraege: ("Linie" hz laenge ...) / ("Bogen" hz chord ...) - nur
;; Typ und Laenge (3. Feld) zaehlen hier.
(setq _plan (list '("Linie" 0.0 9000.0 "VF") '("Bogen" 0.0 500.0)
'("Linie" 0.0 8000.0 "VF") '("Bogen" 0.0 500.0)
'("Linie" 0.0 6000.0 "VF")))
;; 24000 mm, 2 Kurven -> alles im Rahmen
(setq _g (vfl-m2-lauf-grenzen _plan 0 4 25000.0 2))
(tu-eqf "vfl-m2-grenzen/laenge" 24000.0 (nth 0 _g))
(tu-eq "vfl-m2-grenzen/kurven" 2 (nth 1 _g))
(tu-nil "vfl-m2-grenzen/ok" (nth 2 _g))
;; Dritte Kurve -> an ihr (Index 5) teilen, obwohl die Laenge noch passt
(setq _plan3 (append _plan (list '("Bogen" 0.0 400.0) '("Linie" 0.0 300.0 "VF"))))
(tu-eq "vfl-m2-grenzen/dritte-kurve" 5 (nth 2 (vfl-m2-lauf-grenzen _plan3 0 6 25000.0 2)))
;; Zu lang -> am ersten Bogen teilen, nach dem die Grenze reisst (Index 3:
;; bis dahin sind 9000+500+8000 = 17500 drin, die Grenze liegt bei 15000).
(tu-eq "vfl-m2-grenzen/zu-lang" 3 (nth 2 (vfl-m2-lauf-grenzen _plan 0 4 15000.0 2)))
;; Eine einzige lange Gerade: zu lang, aber kein Bogen zum Teilen -> -1
(tu-eq "vfl-m2-grenzen/unteilbar" -1
(nth 2 (vfl-m2-lauf-grenzen (list '("Linie" 0.0 30000.0 "VF")) 0 0 25000.0 2)))
;; --- Vorgabewert aus einem Prompt ziehen (Dialog-Feld vorbelegen) ---
;; Die Konsolen-Prompts tragen ihre Vorgabe in Klammern; der Zahlen-Dialog
;; liest sie daraus. Gesucht ist die LETZTE Klammergruppe MIT Zahl - die
;; echten Texte enthalten davor "<" ohne Partner ("0 < Winkel <= 3") und
;; runde Klammern mit Fliesstext, beides darf nicht stoeren.
(tu-eq "vflw-vorgabe/neigungswinkel" "3"
(vflw-vorgabe-aus-prompt "\nNeigungswinkel (Grad, 0 < Winkel <= 3) [3]: "))
(tu-eq "vflw-vorgabe/neigungswinkel-berechnet" "3"
(vflw-vorgabe-aus-prompt
"\nNeigungswinkel (Grad, 0 < Winkel <= 3) [3] (deltaL wird berechnet und eingefuegt): "))
(tu-eq "vflw-vorgabe/spitze-klammer" "2154.0"
(vflw-vorgabe-aus-prompt "\nGewuenschte Hoehe am Kettenanfang (mm) <2154.0>: "))
(tu-eq "vflw-vorgabe/negativ" "-12.5"
(vflw-vorgabe-aus-prompt "Hoehendifferenz <-12.5>: "))
;; Ohne Klammergruppe bleibt das Feld leer (nil), nicht geraten.
(tu-nil "vflw-vorgabe/ohne-vorgabe"
(vflw-vorgabe-aus-prompt "\nAbstand zum Kreisel (mm, senkrecht zur Achse): "))
(tu-nil "vflw-vorgabe/keine-zahl"
(vflw-vorgabe-aus-prompt "Bitte Namen eingeben [frei]: "))
;; --- Modus-2-Lauf-Anfang: Journal-Wert normieren ---
;; Die Antwort wird als selbstbeschreibender Wert gefuehrt, damit ein
;; Umsortieren/Umnummerieren der Optionen bestehende Ketten nicht
;; umdeutet. Alte Ketten tragen dort noch die Ziffern der ALTEN Folge -
;; die Zuordnung dafuer steht als Tabelle in *vfl-m2-anfang-alt* und wird
;; hier komplett durchlaufen, statt einzelne Faelle abzuschreiben.
(foreach _p *vfl-m2-anfang-alt*
(tu-eq (strcat "vfl-m2-anfang/alt-" (car _p))
(cdr _p) (vfl-m2-anfang-norm (car _p))))
;; Jeder Tabellenwert muss auch ein gueltiger heutiger Wert sein - sonst
;; laeuft eine Alt-Kette in den Unbekannt-Abbruch.
(foreach _p *vfl-m2-anfang-alt*
(tu-true (strcat "vfl-m2-anfang/alt-ziel-gueltig-" (car _p))
(and (member (cdr _p) *vfl-m2-anfang-werte*) t)))
;; Neue Werte gehen unveraendert durch.
(foreach _w *vfl-m2-anfang-werte*
(tu-eq (strcat "vfl-m2-anfang/neu-" _w) _w (vfl-m2-anfang-norm _w)))
;; Unbekanntes wird NICHT geraten - nil heisst fuer den Aufrufer Abbruch.
(tu-nil "vfl-m2-anfang/unbekannte-ziffer" (vfl-m2-anfang-norm "4"))
(tu-nil "vfl-m2-anfang/leer" (vfl-m2-anfang-norm ""))
(tu-nil "vfl-m2-anfang/tippfehler" (vfl-m2-anfang-norm "mit_gf1"))
(tu-nil "vfl-m2-anfang/kein-string" (vfl-m2-anfang-norm 3))
(tu-nil "vfl-m2-anfang/nil" (vfl-m2-anfang-norm nil))
;; --- Eck-Korrektur: gezeichneter Bogen gegen Eck-Bauteil ---
;; Die Ecke des Pfads wird durch ein reales Bauteil ersetzt, dessen
;; Fussabdruck abweichen darf. Die Differenz wird auf die Richtungen der
;; beiden angrenzenden Geraden zerlegt. Werte aus dem echten Lauf vom
;; 2026-10-26: 90-Grad-Ecke, Pfad R500 (Sehne 707.1 -> 500/-500), gebaute
;; Vario-Kurve wirkt wie R406.2 -> je 93.78 mm auf beide Nachbargeraden.
(setq _ez (vfl-eck-zerlegen 500.0 -500.0 406.22 -406.22 (- (/ pi 2.0))))
(tu-eqf "vfl-eck-zerlegen/90-grad-davor" 93.78 (car _ez))
(tu-eqf "vfl-eck-zerlegen/90-grad-danach" 93.78 (cadr _ez))
;; 30-Grad-Ecke links, Gefaellebogen R500 trifft den Pfad fast exakt:
;; nur 0.85 mm, und zwar ausschliesslich auf der Geraden DAVOR.
(setq _ez (vfl-eck-zerlegen 250.0 66.99 249.15 66.99 (/ pi 6.0)))
(tu-eqf "vfl-eck-zerlegen/30-grad-davor" 0.85 (car _ez))
(tu-eqf "vfl-eck-zerlegen/30-grad-danach" 0.0 (cadr _ez))
;; Deckungsgleiches Bauteil -> kein Zuschlag auf keiner Seite.
(setq _ez (vfl-eck-zerlegen 500.0 -500.0 500.0 -500.0 (- (/ pi 2.0))))
(tu-eqf "vfl-eck-zerlegen/gleich-davor" 0.0 (car _ez))
(tu-eqf "vfl-eck-zerlegen/gleich-danach" 0.0 (cadr _ez))
;; Ohne Schwenk ist die Zerlegung nicht eindeutig - nil statt Division durch 0.
(tu-nil "vfl-eck-zerlegen/ohne-schwenk"
(vfl-eck-zerlegen 100.0 0.0 90.0 0.0 0.0))
;; GF-Boegen werden GENEIGT eingebaut: ihr Grundriss-Fussabdruck ist kuerzer
;; als flach gemessen, und genau diese Differenz muss in die Eck-Korrektur.
;; Werte aus dem echten Lauf 2026-10-26: Gefaellebogen_rechts_90_R500 flach
;; dx=500 dz=-28.6, bei 3 Grad eingebaut 497.8 - die 2.2 mm blieben vorher
;; als Rest am Kettenende stehen. Negatives dz muss dabei VERKUERZEN.
(tu-eqf "vfl-projiziere-neigung/gf-bogen-3-grad"
(- (* 500.0 (cos (* 3.0 (/ pi 180.0))))
(* 28.6 (sin (* 3.0 (/ pi 180.0)))))
(car (vfl-projiziere-neigung 500.0 -28.6 3.0)))
(tu-true "vfl-projiziere-neigung/gf-bogen-kuerzer-als-flach"
(< (car (vfl-projiziere-neigung 500.0 -28.6 3.0)) 500.0))
;; Waagerecht eingebaut (Vario-Kurve) bleibt der Fussabdruck unveraendert.
(tu-eqf "vfl-projiziere-neigung/waagerecht" 500.0
(car (vfl-projiziere-neigung 500.0 -28.6 0.0)))
;; --- Bau-Funktion aus dem Journal ableiten (vf_spec.lsp) ---
;; vsp-bau-journal waehlt die Modus-Funktion anhand des Journals, statt sie
;; als zusaetzliches Argument zu bekommen (exakte Argumentzahl, siehe
;; CLAUDE.md). Kein SEGS = Modus 1; SEGS mit der Formatmarke "m2v2" =
;; Modus 2 (nur vf-linienzug-modus2 schreibt sie); SEGS ohne = Modus 3.
(tu-true "vsp-bau-fn/ohne-segs-ist-modus1"
(eq (vsp-bau-fn-fuer-journal
(list (cons "PT" '(0.0 0.0 0.0)) (cons "STR" "1")))
'vf-linienzug-modus))
(tu-true "vsp-bau-fn/segs-mit-marke-ist-modus2"
(eq (vsp-bau-fn-fuer-journal
(list (cons "PT" '(0.0 0.0 0.0)) (cons "SEGS" '(("Linie")))
(cons "STR" "m2v2") (cons "STR" "2")))
'vf-linienzug-modus2))
(tu-true "vsp-bau-fn/segs-ohne-marke-ist-modus3"
(eq (vsp-bau-fn-fuer-journal
(list (cons "PT" '(0.0 0.0 0.0)) (cons "SEGS" '(("Linie")))
(cons "STR" "2")))
'vf-linienzug-modus3))
;; Die Marke zaehlt nur als STR-Eintrag - ein gleichlautender Wert in einem
;; anderen Eintragstyp darf nicht faelschlich auf Modus 2 schliessen lassen.
(tu-true "vsp-bau-fn/marke-nur-als-str"
(eq (vsp-bau-fn-fuer-journal
(list (cons "SEGS" '(("Linie"))) (cons "INT" "m2v2")))
'vf-linienzug-modus3))
;; --- Segment-Klassifizierung: Wert statt Menue-Ziffer ---
;; Gemeinsamer Normalisierer fuer alle selbstbeschreibenden Antworten.
;; Bestandsketten tragen die Alt-Ziffer, neue Ketten den Wert; beide Mengen
;; sind disjunkt. Unbekanntes gibt nil - der Aufrufer bricht dann ab.
(foreach _p *vfl-m2-linie-alt*
(tu-eq (strcat "vfl-wert-norm/linie-alt-" (car _p)) (cdr _p)
(vfl-wert-norm (car _p) *vfl-m2-linie-werte* *vfl-m2-linie-alt*)))
(foreach _p *vfl-m2-bogen-alt*
(tu-eq (strcat "vfl-wert-norm/bogen-alt-" (car _p)) (cdr _p)
(vfl-wert-norm (car _p) *vfl-m2-bogen-werte* *vfl-m2-bogen-alt*)))
(foreach _p *vfl-m2-variante-alt*
(tu-eq (strcat "vfl-wert-norm/variante-alt-" (car _p)) (cdr _p)
(vfl-wert-norm (car _p) *vfl-m2-variante-werte* *vfl-m2-variante-alt*)))
;; Neue Werte gehen unveraendert durch.
(foreach _w *vfl-m2-bogen-werte*
(tu-eq (strcat "vfl-wert-norm/bogen-neu-" _w) _w
(vfl-wert-norm _w *vfl-m2-bogen-werte* *vfl-m2-bogen-alt*)))
;; Jeder Alt-Zielwert muss ein gueltiger heutiger Wert sein, sonst laeuft
;; eine Bestandskette in den Unbekannt-Abbruch.
(foreach _p *vfl-m2-linie-alt*
(tu-true (strcat "vfl-wert-norm/linie-ziel-gueltig-" (car _p))
(and (member (cdr _p) *vfl-m2-linie-werte*) t)))
;; Typ und Variante benutzten frueher BEIDE "1"/"2" und waren im Journal
;; nicht zu unterscheiden - die neuen Wertevorraete muessen disjunkt sein.
(tu-nil "vfl-wert-norm/bogen-und-variante-disjunkt"
(vl-some (function (lambda (w) (if (member w *vfl-m2-variante-werte*) w)))
*vfl-m2-bogen-werte*))
(tu-nil "vfl-wert-norm/unbekannt-gibt-nil"
(vfl-wert-norm "3" *vfl-m2-linie-werte* *vfl-m2-linie-alt*))
(tu-nil "vfl-wert-norm/kein-string"
(vfl-wert-norm 1 *vfl-m2-linie-werte* *vfl-m2-linie-alt*))
;; --- Gefalteter VF-Lauf erkennen (Schenkel = Fahrtrichtungen) ---
;; Der Modus-2-Solver bilanziert skalar ueber EINE Achse. Liegt der Lauf
;; gefaltet (U-Form), sitzen die festen Teile in einem anderen Schenkel als
;; die Kletterstrecke und die Kette wird sichtbar falsch gebaut. Bis die
;; Bilanz achsenweise rechnet, wird so ein Lauf abgewiesen - diese
;; Erkennung entscheidet darueber.
;; Plan-Eintraege: Linie = ("Linie" hz laenge typ ...), Bogen = ("Bogen" hz ...)
(setq _plan2 (list (list "Linie" 0.0 9700.0 "VF" nil)
(list "Bogen" 0.0 707.1 90 "rechts" "Vario-Kurve" "aussen")
(list "Linie" -90.0 4296.0 "VF" nil)))
(tu-eq "vfl-m2-schenkel/u-form-zwei-richtungen" 2
(length (vfl-m2-schenkel _plan2 0 2)))
(tu-true "vfl-m2-gefaltet/u-form" (vfl-m2-gefaltet-p _plan2 0 2))
;; Gerader Lauf: eine Richtung, auch ueber mehrere Geraden hinweg.
(setq _plan2 (list (list "Linie" 0.0 9700.0 "VF" nil)
(list "Linie" 0.0 2000.0 "VF" nil)))
(tu-eq "vfl-m2-schenkel/gerade-eine-richtung" 1
(length (vfl-m2-schenkel _plan2 0 1)))
(tu-nil "vfl-m2-gefaltet/gerade" (vfl-m2-gefaltet-p _plan2 0 1))
;; Zurueck auf dieselbe Richtung zaehlt als NEUER Schenkel - die Kette ist
;; dann seitlich versetzt, die Laengen liegen nicht mehr auf einer Linie.
(setq _plan2 (list (list "Linie" 0.0 3000.0 "VF" nil)
(list "Bogen" 0.0 707.1 90 "rechts" "Vario-Kurve" "aussen")
(list "Linie" -90.0 1000.0 "VF" nil)
(list "Bogen" -90.0 707.1 90 "links" "Vario-Kurve" "aussen")
(list "Linie" 0.0 3000.0 "VF" nil)))
(tu-eq "vfl-m2-schenkel/u-form-drei" 3
(length (vfl-m2-schenkel _plan2 0 4)))
;; Winkel werden normalisiert: 270 und -90 sind dieselbe Richtung.
(setq _plan2 (list (list "Linie" -90.0 1000.0 "VF" nil)
(list "Linie" 270.0 1000.0 "VF" nil)))
(tu-eq "vfl-m2-schenkel/270-gleich-minus90" 1
(length (vfl-m2-schenkel _plan2 0 1)))
;; --- Eingangs-Hardware auf einem Fueller-Segment ---
;; Steht der Lauf-Eingang (GF1 + Separator + Umlenkstation + Bogen) auf
;; einem FUELLER, muss dessen Laenge abgezogen werden - sonst bekommt der
;; Fueller die volle Restlaenge, als staende dort nichts (real 2026-10-27:
;; 5855 mm Plan, 10668 mm belegt, Kette 8005 mm daneben).
;; Ist das Eingangs-Segment selbst der Kletterer, steckt dieselbe Laenge
;; schon in feste-vf - dann MUSS der Abzug 0 sein, sonst doppelt.
(tu-eqf "vfl-m2-eingang-fp/kletterer-kein-abzug" 0.0
(vfl-m2-eingang-fp 0 0 '(0) 3726.34 (* 3.0 (/ pi 180.0))))
;; Anderes Segment als der Eingang: ebenfalls nichts.
(tu-eqf "vfl-m2-eingang-fp/fremdes-segment" 0.0
(vfl-m2-eingang-fp 2 0 '(2) 3726.34 (* 3.0 (/ pi 180.0))))
;; Eingang ist Fueller (Kletterer liegt woanders): GF1 + 300 + 500,
;; projiziert auf 3 Grad, plus der Uebergangsbogen aus der Tabelle.
;; Die DIFFERENZ zweier Aufrufe prueft den GF-Anteil exakt und kommt ohne
;; die Bogen-Tabelle aus - die ist im file-freien Unit-Test leer
;; (init-bibliothek laeuft hier nicht), der Bogenanteil faellt also weg.
;; Eine absolute Schranke waere dadurch umgebungsabhaengig gewesen.
(tu-eqf "vfl-m2-eingang-fp/gf-anteil-exakt"
(* 3726.34 (cos (* 3.0 (/ pi 180.0))))
(- (vfl-m2-eingang-fp 0 0 '(2) 3726.34 (* 3.0 (/ pi 180.0)))
(vfl-m2-eingang-fp 0 0 '(2) 0.0 (* 3.0 (/ pi 180.0)))))
;; Separator + Umlenkstation sind IMMER dabei, auch ohne GF und ohne Tabelle.
(setq _l (vfl-m2-eingang-fp 0 0 '(2) 0.0 (* 3.0 (/ pi 180.0))))
(tu-true "vfl-m2-eingang-fp/stationen-immer-dabei"
(>= _l (* (+ *vfk-separator-laenge* *vfk-stations-laenge*)
(cos (* 3.0 (/ pi 180.0))))))
;; --- Fremdanteil der Gefaellestrecke (fuer den stillen Nachrechner) ---
;; Wieviel der vom Solver berechneten GF liegt NICHT auf dem Schenkel des
;; Kletterers? Nur das darf dessen Spanne wieder zugeschlagen werden.
;; Liegt der Eingang auf dem Kletterer selbst (gerader Normalfall), ist
;; nichts fremd - dann MUSS 0 herauskommen, sonst wuerde der funktionierende
;; Fall veraendert.
(tu-eqf "vfl-m2-gf-fremd/eingang-ist-kletterer" 0.0
(vfl-m2-gf-fremdanteil 3726.34 1 T))
(tu-eqf "vfl-m2-gf-fremd/alles-einlauf" 3726.34
(vfl-m2-gf-fremdanteil 3726.34 1 nil))
(tu-eqf "vfl-m2-gf-fremd/halb-halb" 1863.17
(vfl-m2-gf-fremdanteil 3726.34 2 nil))
;; Alles am Auslauf (Modus 3, erzwungen bei offenem Anfang): die GF liegt
;; dann beim Kletterer, nichts ist fremd.
(tu-eqf "vfl-m2-gf-fremd/alles-auslauf" 0.0
(vfl-m2-gf-fremdanteil 3726.34 3 nil))
;; --- ES-Reservierung auf die KS_AUS-Achse ---
;; Vorgabe: quer zur KS_AUS-Achse MUSS 0 sein, laengs darf abweichen.
;; Der reine Laengsanteil reicht dafuer NICHT - er laesst den bauteileigenen
;; Querversatz stehen. Werte aus dem echten Lauf 2026-10-26:
;; ES_Element_30_rechts an einer Geraden mit hz=-60, Schwenk -30 Grad,
;; Fussabdruck (laengs 575.84 | quer -52.54). Reserve 484.8 statt 575.8 -
;; die Gerade wird also rund 91 mm laenger und hebt den Querversatz auf.
(tu-eqf "vfl-es-achs-reserve/echt-30-grad" 484.838050570331
(vfl-es-achs-reserve 575.84 -52.54 -60.0 -30.0))
;; Ohne Querversatz bleibt es beim reinen Laengsanteil.
(tu-eqf "vfl-es-achs-reserve/ohne-quer" 500.0
(vfl-es-achs-reserve 500.0 0.0 -60.0 -30.0))
;; Ohne Schwenk faellt die Achse mit der Fahrtrichtung zusammen - dann gibt
;; es keinen aufhebbaren Querversatz und der Laengsanteil ist richtig
;; (Nenner 0, Rueckfall statt Division durch null).
(tu-eqf "vfl-es-achs-reserve/ohne-schwenk" 575.84
(vfl-es-achs-reserve 575.84 -52.54 -60.0 0.0))
;; Richtungsunabhaengig: dieselbe Geometrie um 90 Grad gedreht gibt
;; denselben Wert - die Reserve haengt an den Winkeln zueinander, nicht
;; an der Lage im Welt-KS.
(tu-eqf "vfl-es-achs-reserve/gedreht" 484.838050570331
(vfl-es-achs-reserve 575.84 -52.54 30.0 -30.0))
;; --- Rueckwaerts bauen: Punkt entgegen der Fahrtrichtung zuruecksetzen ---
;; vfl-rueck-punkt ist der Rechenkern des Rueckwaerts-Baus: zu einem
;; BEKANNTEN Endpunkt den Startpunkt eines Bausteins finden. Vorwaerts gilt
;; P_next = P + (L*cos hz, L*sin hz, -L*tan w) - hier also mit umgekehrtem
;; Vorzeichen. Die Hoehe muss STEIGEN (der Vorgaenger liegt hoeher).
(tu-eqf "vfl-rueck-punkt/ost-flach"
(list 0.0 0.0 0.0) (vfl-rueck-punkt '(1000.0 0.0 0.0) 0.0 1000.0 0.0))
(tu-eqf "vfl-rueck-punkt/nord-flach"
(list 0.0 0.0 0.0) (vfl-rueck-punkt '(0.0 1000.0 0.0) 90.0 1000.0 0.0))
;; 45 Grad Gefaelle: 1000 mm horizontal zurueck = 1000 mm hoeher
(tu-eqf "vfl-rueck-punkt/45-grad"
(list 0.0 0.0 1000.0) (vfl-rueck-punkt '(1000.0 0.0 0.0) 0.0 1000.0 45.0))
;; Rundlauf: vorwaerts wieder auf den Ausgangspunkt (3 Grad, schraeg)
(setq _l (vfl-rueck-punkt '(5000.0 3000.0 1800.0) 30.0 2000.0 3.0))
(tu-eqf "vfl-rueck-punkt/rundlauf-x" 5000.0
(+ (car _l) (* 2000.0 (cos (/ (* 30.0 pi) 180.0)))))
(tu-eqf "vfl-rueck-punkt/rundlauf-y" 3000.0
(+ (cadr _l) (* 2000.0 (sin (/ (* 30.0 pi) 180.0)))))
(tu-eqf "vfl-rueck-punkt/rundlauf-z" 1800.0
(- (caddr _l) (* 2000.0 (/ (sin (/ (* 3.0 pi) 180.0)) (cos (/ (* 3.0 pi) 180.0))))))
)
;; ------------------------------------------------------------
;; TESTS: vf_linienzug.lsp - Laenge aus einer Ziellinie (X/Y)
;; ------------------------------------------------------------
@@ -446,6 +782,86 @@
(+ (cadr _ks) (sin (/ pi 6.0))) 0.0)))
(tu-true "vfl-laenge-bis-ziellinie/realfall-plausibel"
(and _l (> _l 1430.0) (< _l 1431.0)))
;; --- AS-Seite aus der Lage des naechsten Punkts zur Basislinie ---
;; Basislinie zeigt nach +X; ein Ziel mit +Y liegt links davon, mit -Y rechts.
(tu-eq "vfl-seite-aus-lage/links"
"links" (vfl-seite-aus-lage '(0.0 0.0 0.0) '(1000.0 0.0 0.0) '(500.0 800.0 0.0)))
(tu-eq "vfl-seite-aus-lage/rechts"
"rechts" (vfl-seite-aus-lage '(0.0 0.0 0.0) '(1000.0 0.0 0.0) '(500.0 -800.0 0.0)))
;; Richtung der Basislinie umdrehen -> Seite dreht mit
(tu-eq "vfl-seite-aus-lage/basislinie-umgedreht"
"rechts" (vfl-seite-aus-lage '(1000.0 0.0 0.0) '(0.0 0.0 0.0) '(500.0 800.0 0.0)))
;; schraege Basislinie (45 Grad): Ziel oberhalb davon liegt links
(tu-eq "vfl-seite-aus-lage/schraeg"
"links" (vfl-seite-aus-lage '(0.0 0.0 0.0) '(1000.0 1000.0 0.0) '(0.0 1000.0 0.0)))
;; Z spielt keine Rolle (rein planare Entscheidung)
(tu-eq "vfl-seite-aus-lage/z-ignoriert"
"rechts" (vfl-seite-aus-lage '(0.0 0.0 5000.0) '(1000.0 0.0 -200.0) '(500.0 -800.0 999.0)))
;; --- VF-Hoehe je SEGMENT (Attribut VF_HOEHE_m, Sivas 4433-4437) ---
;; Ein Eintrag je GERADEM VF-Abschnitt: Mittelwert aus dessen KS_EIN und
;; KS_AUS, in METERN mit 3 Nachkommastellen. Zwischen Umlenk- und
;; Motorstation koennen mehrere Abschnitte liegen (auf/ab/horizontal), die
;; Liste laeuft darum parallel zu L_VF_m und VF_WINKEL.
(vf-vfhoehe-reset)
(tu-eq "vf-vfhoehe/leer-nach-reset" "" (vfl-join-komma *vf-acc-vfhoehe*))
;; 2000 mm und 3000 mm -> Mittel 2500 mm -> "2.500"
(vf-vfhoehe-segment 2000.0 3000.0)
(tu-eq "vf-vfhoehe/mittelwert-meter" "2.500" (vfl-join-komma *vf-acc-vfhoehe*))
;; Drei Abschnitte wie im realen Block (L_VF_m hatte dort 3 Eintraege):
;; horizontal, horizontal, steigend - alle drei bekommen einen Wert.
(vf-vfhoehe-reset)
(vf-vfhoehe-segment 2076.0 2076.0) ; horizontal
(vf-vfhoehe-segment 2076.0 2076.0) ; horizontal
(vf-vfhoehe-segment 2076.0 2600.0) ; steigend -> Mittel 2338
(tu-eq "vf-vfhoehe/drei-abschnitte"
"2.076,2.076,2.338" (vfl-join-komma *vf-acc-vfhoehe*))
;; Unvollstaendige Messung haengt NICHTS an - sonst verschoebe sich die
;; Liste gegen L_VF_m und eine Hoehe landete beim falschen Foerderer.
(vf-vfhoehe-reset)
(vf-vfhoehe-segment 1000.0 2000.0)
(vf-vfhoehe-segment nil 3000.0)
(vf-vfhoehe-segment 4000.0 nil)
(tu-eq "vf-vfhoehe/unvollstaendig-ignoriert" "1.500" (vfl-join-komma *vf-acc-vfhoehe*))
;; negative Hoehen (Kette unter Null) muessen durchgehen
(vf-vfhoehe-reset)
(vf-vfhoehe-segment -500.0 -1500.0)
(tu-eq "vf-vfhoehe/negativ" "-1.000" (vfl-join-komma *vf-acc-vfhoehe*))
(vf-vfhoehe-reset)
;; vf-meter-3: GENAU 3 Nachkommastellen, unabhaengig von DIMZIN.
;; (rtos x 2 3) allein kuerzt nachfolgende Nullen ("2.5", "-1") - real im
;; Testlauf aufgetreten, deshalb eigene Formatierung.
(tu-eq "vf-meter-3/glatt" "2.500" (vf-meter-3 2500.0))
(tu-eq "vf-meter-3/ganzzahlig" "3.000" (vf-meter-3 3000.0))
(tu-eq "vf-meter-3/negativ" "-1.000" (vf-meter-3 -1000.0))
(tu-eq "vf-meter-3/null" "0.000" (vf-meter-3 0.0))
(tu-eq "vf-meter-3/drei-stellen" "1.234" (vf-meter-3 1234.0))
;; --- SONDERFALL Standard/Etage: Hoehe ueber die GANZE Kette ---
;; Nur ein Motor und nur ein gerader VF-Abschnitt, darum zaehlt dort
;; AS-KS_EIN .. ES-KS_AUS statt des Segmentwerts (Nutzer-Vorgabe 2026-10-21).
(vf-vfhoehe-reset)
(vf-vfhoehe-kette 1000.0 3000.0)
(tu-eq "vf-vfhoehe-kette/mittelwert" "2.000" (vfl-join-komma *vf-acc-vfhoehe*))
;; ERSETZT den beim Bau gesammelten Segmentwert, haengt ihn NICHT an -
;; sonst stuenden fuer eine Standard-Anlage zwei Hoehen in der Liste.
(vf-vfhoehe-reset)
(vf-vfhoehe-segment 5000.0 5000.0) ; Segmentwert aus vfs-vf-koerper
(vf-vfhoehe-kette 1000.0 3000.0)
(tu-eq "vf-vfhoehe-kette/ersetzt-segmentwert" "2.000" (vfl-join-komma *vf-acc-vfhoehe*))
;; fehlender Endpunkt -> lieber leer als geraten
(vf-vfhoehe-reset)
(vf-vfhoehe-kette 1000.0 nil)
(tu-eq "vf-vfhoehe-kette/ohne-endpunkt-leer" "" (vfl-join-komma *vf-acc-vfhoehe*))
(vf-vfhoehe-reset)
)
@@ -2278,6 +2694,349 @@
)
)
;; ------------------------------------------------------------
;; TESTS: KettenFoerderer.lsp + ssg_ks_insert.lsp (KS-Orientierung)
;; ------------------------------------------------------------
;; Reine Rechenkerne des Kettenfoerderers: Hoehenbilanz, Massstab,
;; Grenzpruefung, KS-Winkel. Alles ohne Zeichnung und ohne Blockdateien -
;; die zeichnungsabhaengigen Teile (kf-geometrie-messen, kf-kette-bauen)
;; brauchen BricsCAD und bleiben dem Befehl KF_KS_PRUEFEN vorbehalten.
(defun tu-tests-kf ( / _l _s _defs)
(princ "\n[KettenFoerderer]")
(if (not (car (atoms-family 1 '("KF-LAENGE-BERECHNEN"))))
(tu-record nil "KettenFoerderer-Modul geladen"
"KettenFoerderer.lsp nicht geladen - siehe tests/test_unit.scr")
(progn
;; --- ks-winkel-normalisieren: auf -180..180 falten ---
(tu-eqf "ks-winkel-norm/190" -170.0 (ks-winkel-normalisieren 190.0))
(tu-eqf "ks-winkel-norm/-190" 170.0 (ks-winkel-normalisieren -190.0))
(tu-eqf "ks-winkel-norm/26" 26.0 (ks-winkel-normalisieren 26.0))
(tu-eqf "ks-winkel-norm/360" 0.0 (ks-winkel-normalisieren 360.0))
(tu-nil "ks-winkel-norm/nil" (ks-winkel-normalisieren nil))
;; --- ks-xy-winkel: X-Achse eines KS-Eintrags (origin x-end y-end z-end)
(tu-eqf "ks-xy-winkel/entlang-X" 0.0
(ks-xy-winkel '((0.0 0.0 0.0) (1.0 0.0 0.0) (0.0 2.0 0.0) (0.0 0.0 3.0))))
(tu-eqf "ks-xy-winkel/entlang-Y" 90.0
(ks-xy-winkel '((0.0 0.0 0.0) (0.0 1.0 0.0) (-2.0 0.0 0.0) (0.0 0.0 3.0))))
;; versetzter Ursprung: nur die RICHTUNG zaehlt, nicht die Lage
(tu-eqf "ks-xy-winkel/versetzt-45" 45.0
(ks-xy-winkel (list '(100.0 50.0 0.0) '(101.0 51.0 0.0) '(99.0 51.0 0.0) '(100.0 50.0 1.0))))
;; senkrechte X-Achse (keine XY-Laenge) -> nil statt Division durch 0
(tu-nil "ks-xy-winkel/senkrecht"
(ks-xy-winkel '((0.0 0.0 0.0) (0.0 0.0 1.0) (0.0 2.0 0.0) (0.0 0.0 3.0))))
;; --- kf-hz-folge: Folgebaustein an KS_AUS des Vorgaengers ausrichten ---
;; Vorgaenger zeigt 26 Grad, Folgebaustein ist waagerecht gezeichnet (0)
(tu-eqf "kf-hz-folge/26-auf-0" 26.0 (kf-hz-folge 26.0 0.0))
;; Folgebaustein ist selbst schon um 26 Grad gezeichnet -> keine Drehung
(tu-eqf "kf-hz-folge/26-auf-26" 0.0 (kf-hz-folge 26.0 26.0))
;; fehlende Eigenrichtung -> Baustein uebernimmt die Vorgaengerrichtung
(tu-eqf "kf-hz-folge/ohne-beta" 26.0 (kf-hz-folge 26.0 nil))
(tu-nil "kf-hz-folge/ohne-phi" (kf-hz-folge nil 0.0))
;; --- kf-dy-eingebaut: Hoehenbeitrag nach Rz(hz) und X-Massstab ---
;; waagerechter Baustein, waagerecht eingebaut -> kein Hoehengewinn
(tu-eqf "kf-dy/0-grad" 0.0 (kf-dy-eingebaut 1000.0 0.0 0.0 1.0))
;; 1000 mm unter 30 Grad -> 500 mm (sin 30 = 0.5)
(tu-eqf "kf-dy/30-grad" 500.0 (kf-dy-eingebaut 1000.0 0.0 30.0 1.0))
;; derselbe Baustein doppelt skaliert -> doppelter Hoehengewinn
(tu-eqf "kf-dy/30-grad-skaliert-2" 1000.0 (kf-dy-eingebaut 1000.0 0.0 30.0 2.0))
;; senkrecht eingebaut -> die volle Laenge als Hoehe
(tu-eqf "kf-dy/90-grad" 1000.0 (kf-dy-eingebaut 1000.0 0.0 90.0 1.0))
;; --- kf-laenge-berechnen: Hoehenbilanz nach der Laenge aufloesen ---
;; H=1000, Stationen tragen nichts bei, 30 Grad -> L = 1000/sin30 = 2000
(tu-eqf "kf-laenge/30-grad-glatt" 2000.0
(kf-laenge-berechnen 1000.0 0.0 0.0 0.0 30.0))
;; Stationen tragen 100+150 bei -> nur 750 mm bleiben fuer das Stueck
(tu-eqf "kf-laenge/mit-stationen" 1500.0
(kf-laenge-berechnen 1000.0 100.0 150.0 0.0 30.0))
;; Gegenprobe: die errechnete Laenge ergibt wieder genau H
(setq _l (kf-laenge-berechnen 1000.0 100.0 150.0 0.0 30.0))
(tu-eqf "kf-laenge/rundlauf-ergibt-H" 1000.0
(+ 100.0 150.0 (kf-dy-eingebaut _l 0.0 30.0 1.0)))
;; bereits geneigt gezeichnetes Zwischenstueck: dy-nativ wird abgezogen
;; (dy-nativ skaliert NICHT mit, nur X wird skaliert)
(tu-eqf "kf-laenge/mit-dy-nativ" 1800.0
(kf-laenge-berechnen 1000.0 0.0 0.0 (/ 100.0 (cos (/ pi 6.0))) 30.0))
;; waagerecht -> keine Hoehe erreichbar
(tu-nil "kf-laenge/0-grad-unloesbar"
(kf-laenge-berechnen 1000.0 0.0 0.0 0.0 0.0))
;; --- kf-skala-berechnen ---
(tu-eqf "kf-skala/2000-von-1000" 2.0 (kf-skala-berechnen 2000.0 1000.0))
(tu-nil "kf-skala/ohne-nativlaenge" (kf-skala-berechnen 2000.0 0.0))
(tu-nil "kf-skala/ohne-laenge" (kf-skala-berechnen nil 1000.0))
;; --- kf-laenge-pruefen: Grenzen aus der JSON ---
(tu-nil "kf-pruefen/in-ordnung" (kf-laenge-pruefen 2000.0 100.0 20000.0))
(tu-eq "kf-pruefen/zu-kurz" "kf-fehler-laenge-unter-min"
(kf-laenge-pruefen 50.0 100.0 20000.0))
(tu-eq "kf-pruefen/zu-lang" "kf-fehler-laenge-ueber-max"
(kf-laenge-pruefen 99999.0 100.0 20000.0))
;; negative Laenge = Stationen bringen mehr Hoehe mit als gefordert
(tu-eq "kf-pruefen/negativ" "kf-fehler-hoehe-zu-klein"
(kf-laenge-pruefen -10.0 100.0 20000.0))
(tu-eq "kf-pruefen/nil" "kf-fehler-winkel-null"
(kf-laenge-pruefen nil 100.0 20000.0))
;; --- kf-zahl: JSON-Wert als Zahl (Parser liefert Zahl ODER String) ---
(tu-eqf "kf-zahl/int" 26.0 (kf-zahl 26))
(tu-eqf "kf-zahl/real" 26.0 (kf-zahl 26.0))
(tu-eqf "kf-zahl/string" 26.0 (kf-zahl "26"))
(tu-nil "kf-zahl/nil" (kf-zahl nil))
;; --- kf-attrib-defs: VF-Schema + KF-Zusatz, KEIN Tag doppelt ---
(setq _defs (kf-attrib-defs))
(tu-true "kf-attrib-defs/hat-ID" (assoc "ID" _defs))
(tu-true "kf-attrib-defs/hat-FOERDERERTYP" (assoc "FOERDERERTYP" _defs))
(tu-true "kf-attrib-defs/hat-WINKEL" (assoc "WINKEL" _defs))
(tu-true "kf-attrib-defs/hat-STANDARD_STEUERUNG"
(assoc "STANDARD_STEUERUNG" _defs))
;; Reihenfolge wie im Sivas-Merkmalstamm: 361 folgt direkt auf den Typ,
;; STANDARD_STEUERUNG steht also unmittelbar hinter WINKEL
(tu-eq "kf-attrib-defs/361-folgt-auf-winkel" "STANDARD_STEUERUNG"
(car (nth (1+ (kf-tag-index "WINKEL" _defs)) _defs)))
;; FOERDERERTYP ist die BAUART im Klartext, der Winkel steht in WINKEL
(tu-eq "kf-attrib-defs/FOERDERERTYP-ist-bauart" "Schraegfoerderer Stahl"
(cadr (assoc "FOERDERERTYP" _defs)))
(tu-true "kf-attrib-defs/hat-MOVIMOT" (assoc "MOVIMOT" _defs))
;; Farbe und Antriebsmotor sind ZWEI Eigenschaften (Sivas 354 bzw. 355), nicht
;; ein kombiniertes AUSFUEHRUNG-Attribut
(tu-true "kf-attrib-defs/hat-FARBE" (assoc "FARBE" _defs))
(tu-true "kf-attrib-defs/hat-ANTRIEBSMOTOR" (assoc "ANTRIEBSMOTOR" _defs))
(tu-nil "kf-attrib-defs/kein-AUSFUEHRUNG" (assoc "AUSFUEHRUNG" _defs))
;; Der Kettenfoerderer traegt sich selbst - die Geruest-Tags aus dem
;; VF-Schema werden bewusst NICHT mitgefuehrt
(tu-nil "kf-attrib-defs/kein-GERUEST_EINZELMODUL"
(assoc "GERUEST_EINZELMODUL" _defs))
(tu-nil "kf-attrib-defs/kein-GERUEST_TYP" (assoc "GERUEST_TYP" _defs))
;; Jeder Tag darf nur EINMAL vorkommen (zwei ATTDEFs gleichen Tags waeren
;; im Block ungueltig, ssg-attrib-set-on traefe nur den ersten).
(setq _s 0)
(foreach _d _defs (if (= (car _d) "FOERDERERTYP") (setq _s (1+ _s))))
(tu-eq "kf-attrib-defs/FOERDERERTYP-nur-einmal" 1 _s)
(setq _s 0)
(foreach _d _defs (if (= (car _d) "ARTINR") (setq _s (1+ _s))))
(tu-eq "kf-attrib-defs/ARTINR-nur-einmal" 1 _s)
(setq _s 0)
(foreach _d _defs (if (= (car _d) "ARTINR") (setq _s (1+ _s))))
(tu-eq "kf-attrib-defs/ARTINR-nur-einmal" 1 _s)
;; Der Winkel steht ALLEIN in FOERDERERTYP - kein zweites Winkel-Tag
(tu-nil "kf-attrib-defs/kein-KF_WINKEL" (assoc "KF_WINKEL" _defs))
(tu-nil "kf-attrib-defs/kein-KF_TYP" (assoc "KF_TYP" _defs))
;; Das Schema ist EIGENSTAENDIG, nicht vom VF-Streckenschema geerbt -
;; keines der VF-Tags darf durchschlagen
(tu-nil "kf-attrib-defs/kein-SEITE_AS" (assoc "SEITE_AS" _defs))
(tu-nil "kf-attrib-defs/kein-ANZAHL_VF" (assoc "ANZAHL_VF" _defs))
(tu-nil "kf-attrib-defs/kein-TEILEART" (assoc "TEILEART" _defs))
(tu-eq "kf-attrib-defs/LAYER-ist-F-3" "F-3" (cadr (assoc "LAYER" _defs)))
;; --- kf-variante-finden: ueber den Winkel, auch als String ---
(tu-eq "kf-variante-finden/26" "A"
(cdr (assoc "name"
(kf-variante-finden 26
'((("winkel" . 26) ("name" . "A"))
(("winkel" . 30) ("name" . "B")))))))
(tu-eq "kf-variante-finden/30-als-string" "B"
(cdr (assoc "name"
(kf-variante-finden 30
'((("winkel" . "26") ("name" . "A"))
(("winkel" . "30") ("name" . "B")))))))
(tu-nil "kf-variante-finden/unbekannt"
(kf-variante-finden 45 '((("winkel" . 26) ("name" . "A")))))
;; --- kf-antriebsart (Merkmal 357): Dropdown mit EINER Option ---
;; Der Wert kommt aus dem ERSTEN Listeneintrag - nicht aus dem Code.
(tu-eq "kf-antriebsart/aus-daten" "1.1 kW"
(kf-antriebsart '(("antriebsart" (("name" . "1.1 kW") ("wert" . "1.1 kW"))))))
;; eine zweite Option aendert die Vorgabe NICHT (Index 0 bleibt massgebend)
(tu-eq "kf-antriebsart/erster-eintrag-gewinnt" "1.1 kW"
(kf-antriebsart '(("antriebsart" (("name" . "1.1 kW") ("wert" . "1.1 kW"))
(("name" . "0.55 kW") ("wert" . "0.55 kW"))))))
;; Liste fehlt -> Rueckfall, aber als STRING (nicht T/nil)
(tu-eq "kf-antriebsart/ohne-eintrag" "1.1 kW" (kf-antriebsart '(("titel" . "x"))))
(tu-true "kf-antriebsart/ist-string"
(= (type (kf-antriebsart '(("titel" . "x")))) 'STR))
;; Dezimalpunkt, kein Komma (Nutzervorgabe)
(tu-nil "kf-antriebsart/kein-komma"
(vl-string-search "," (kf-antriebsart '(("titel" . "x")))))
;; --- kf-drehung-gesamt: Drehwinkel fuer KF_EDIT ---
;; Regression: der Drehwinkel wird beim Bau in die Geometrie eingerechnet,
;; die Blockreferenz selbst hat IMMER Drehung 0 (ssg-block-wrap-welt).
;; KF_EDIT las nur Gruppencode 50 und baute eine mit 90 Grad gebaute
;; Kette ungedreht neu. Der gebaute Winkel steht jetzt als XDATA.
(tu-eqf "kf-drehung/nur-xdata" 90.0 (kf-drehung-gesamt 90.0 0.0))
;; Referenz nachtraeglich von Hand um 90 Grad gedreht (Gruppencode 50 in
;; Bogenmass) -> beides addiert sich
(tu-eqf "kf-drehung/xdata-plus-referenz" 180.0
(kf-drehung-gesamt 90.0 (/ pi 2.0)))
;; Altbestand ohne XDATA: nur die Referenzdrehung (bisheriges Verhalten)
(tu-eqf "kf-drehung/ohne-xdata" 45.0 (kf-drehung-gesamt nil (/ pi 4.0)))
;; nichts bekannt -> 0, kein Absturz und kein nil
(tu-eqf "kf-drehung/nichts" 0.0 (kf-drehung-gesamt nil nil))
(tu-true "kf-drehung/ist-zahl" (numberp (kf-drehung-gesamt nil nil)))
;; Summe ueber 180 Grad wird auf -180..180 gefaltet (270 = -90)
(tu-eqf "kf-drehung/normalisiert" -90.0
(kf-drehung-gesamt 180.0 (/ pi 2.0)))
;; ganze Zahl aus der XDATA (nicht real) darf nicht abstuerzen
(tu-eqf "kf-drehung/ganzzahl" 30.0 (kf-drehung-gesamt 30 0.0))
;; --- kf-neigung-aus-punkten: Kern der 3D-Aufrichtung ---
;; Liefert (Schraeglaenge Neigungswinkel) aus Ketten-Start und -Ende.
;; Die Kette wird AUFGERICHTET eingebaut, die Hoehe laeuft also in Z.
;; 3-4-5-Dreieck: 3000 waagerecht, 4000 hoch -> 5000 schraeg
(tu-eqf "kf-neigung/3-4-5-laenge" 5000.0
(car (kf-neigung-aus-punkten '(0.0 0.0 0.0) '(3000.0 0.0 4000.0) 0.0)))
;; 45 Grad: gleiche Betraege waagerecht und hoch
(tu-eqf "kf-neigung/45-grad" 45.0
(cadr (kf-neigung-aus-punkten '(0.0 0.0 0.0) '(1000.0 0.0 1000.0) 0.0)))
;; waagerecht -> Winkel 0, Laenge = Horizontalabstand
(tu-eqf "kf-neigung/waagerecht" '(2000.0 0.0)
(kf-neigung-aus-punkten '(0.0 0.0 0.0) '(2000.0 0.0 0.0) 0.0))
;; Der Horizontalanteil wird auf die KETTENRICHTUNG projiziert, nicht
;; auf die Welt-X-Achse: bei 90 Grad Basisdrehung laeuft die Kette in Y.
;; Ohne Projektion kaeme hier 0 heraus und der Winkel waere 90 statt 45.
(tu-eqf "kf-neigung/gedreht-90" '(1414.213562 45.0)
(kf-neigung-aus-punkten '(0.0 0.0 0.0) '(0.0 1000.0 1000.0) 90.0))
;; fallende Kette -> negativer Winkel
(tu-eqf "kf-neigung/fallend" -45.0
(cadr (kf-neigung-aus-punkten '(0.0 0.0 1000.0) '(1000.0 0.0 0.0) 0.0)))
;; Start = Ende -> nil statt Division durch 0
(tu-nil "kf-neigung/nulllaenge"
(kf-neigung-aus-punkten '(5.0 5.0 5.0) '(5.0 5.0 5.0) 0.0))
;; --- kf-matrix-aufrecht: Y_lokal wird zu Z_welt ---
;; Das ist die Kernaussage der Aufrichtung. Geprueft wird sie an den
;; Bildern der Einheitsvektoren, nicht an den Matrixeintraegen - so
;; bleibt der Test lesbar und unabhaengig von der Schreibweise.
(tu-eqf "kf-matrix/Y-lokal-wird-Z-welt" '(0.0 0.0 1.0)
(mat3-mul-vec3 (kf-matrix-aufrecht 0.0 0.0) '(0.0 1.0 0.0)))
;; Die Fahrtrichtung (X) bleibt bei Basisdrehung 0 die Welt-X-Achse
(tu-eqf "kf-matrix/X-bleibt-X" '(1.0 0.0 0.0)
(mat3-mul-vec3 (kf-matrix-aufrecht 0.0 0.0) '(1.0 0.0 0.0)))
;; Basisdrehung 90 Grad dreht die Fahrtrichtung in die Welt-Y-Achse,
;; die Hoehe bleibt dabei in Z
(tu-eqf "kf-matrix/basis-90-dreht-X-nach-Y" '(0.0 1.0 0.0)
(mat3-mul-vec3 (kf-matrix-aufrecht 90.0 0.0) '(1.0 0.0 0.0)))
(tu-eqf "kf-matrix/basis-90-haelt-Z" '(0.0 0.0 1.0)
(mat3-mul-vec3 (kf-matrix-aufrecht 90.0 0.0) '(0.0 1.0 0.0)))
;; --- Standard-Variante: steht in den DATEN, nicht im Code ---
(tu-true "kf-variante-standard-p/markiert"
(kf-variante-standard-p '(("winkel" . 26) ("standard" . T))))
(tu-nil "kf-variante-standard-p/ohne-feld"
(kf-variante-standard-p '(("winkel" . 30))))
;; Index fuer die Vorauswahl - auch wenn der Standard NICHT der erste ist
(tu-eq "kf-standard-index/zweiter" 1
(kf-standard-index '((("winkel" . 26))
(("winkel" . 30) ("standard" . T)))))
(tu-eq "kf-standard-index/erster" 0
(kf-standard-index '((("winkel" . 26) ("standard" . T))
(("winkel" . 30)))))
;; keine Variante markiert -> erste, statt nil (der Dialog braucht einen Index)
(tu-eq "kf-standard-index/keiner" 0
(kf-standard-index '((("winkel" . 26)) (("winkel" . 30)))))
;; --- kf-punkt-differenzen: zweite Hoehen-Eingabeart (2 Punkte) ---
;; Gemessen wird die Differenz in Z - die Baugruppe steht aufgerichtet im
;; Modell. Zurueckgegeben wird (dz dy): die HOEHE zuerst, dY nur zur
;; Kontrolle (wer in einer Draufsicht pickt, sieht dz = 0).
(tu-eqf "kf-punkt-diff/dz" '(1500.0 0.0)
(kf-punkt-differenzen '(0.0 0.0 0.0) '(2000.0 0.0 1500.0)))
;; Vorzeichen egal - die Reihenfolge der Punkte darf keine Rolle spielen
(tu-eqf "kf-punkt-diff/umgekehrt" '(1500.0 0.0)
(kf-punkt-differenzen '(2000.0 0.0 1500.0) '(0.0 0.0 0.0)))
;; in einer Draufsicht gepickt: dz = 0, dY gross
(tu-eqf "kf-punkt-diff/draufsicht" '(0.0 1200.0)
(kf-punkt-differenzen '(0.0 0.0 0.0) '(3000.0 1200.0 0.0)))
;; Punkte ohne Z (2D-Pick) duerfen nicht abstuerzen: dz ist dann 0
(tu-eqf "kf-punkt-diff/ohne-z" '(0.0 800.0)
(kf-punkt-differenzen '(0.0 0.0) '(100.0 800.0)))
(tu-nil "kf-punkt-diff/nil" (kf-punkt-differenzen nil '(1.0 2.0 3.0)))
;; --- kf-auswahl-wert: "wert" vor "name", Vorgabe bei leerem Index ---
(tu-eq "kf-auswahl-wert/wert" "Nein"
(kf-auswahl-wert '((("name" . "Nein") ("wert" . "Nein"))) 0 "X"))
(tu-eq "kf-auswahl-wert/ausserhalb" "X"
(kf-auswahl-wert '((("name" . "Nein") ("wert" . "Nein"))) 5 "X"))
)
)
)
;; ------------------------------------------------------------
;; TESTS: check_hoehen.lsp - Phase 3 (Buehnen-Familien), reine Kerne
;; ------------------------------------------------------------
(defun tu-tests-hoehen-fam ( / _els)
(princ "\n[check_hoehen/Phase 3 Familien]")
;; --- ch-familien: transitive Verbindung, Sortierung nach ID-Nummer ---
(tu-eq "ch-familien/einzeln-und-kette"
'(("b") ("c" "a" "d") ("e"))
(ch-familien '(("a" 3) ("b" 1) ("c" 2) ("d" 5) ("e" 4))
'(("a" "c") ("c" "d") ("x" "a"))))
(tu-eq "ch-familien/kette-ueber-mittleren"
'(("a" "b" "c"))
(ch-familien '(("a" 1) ("b" 2) ("c" 3)) '(("a" "b") ("b" "c"))))
(tu-eq "ch-familien/ohne-kanten"
'(("a") ("b"))
(ch-familien '(("a" 1) ("b" 2)) nil))
(tu-eq "ch-familien/ring"
'(("a" "b" "c"))
(ch-familien '(("a" 1) ("b" 2) ("c" 3)) '(("a" "b") ("b" "c") ("c" "a"))))
;; --- ch-kreuz-abzug ---
(tu-eq "ch-kreuz-abzug/kein" '("kein" . 0.0) (ch-kreuz-abzug 0.0 0.0 5000.0 5000.0 1500.0))
(tu-eq "ch-kreuz-abzug/konflikt" '("konflikt" . 0.0) (ch-kreuz-abzug 1.5 0.0 5000.0 5000.0 1500.0))
(tu-eq "ch-kreuz-abzug/konflikt2" '("konflikt" . 0.0) (ch-kreuz-abzug 1.5 2.0 5000.0 5000.0 1500.0))
(tu-eq "ch-kreuz-abzug/hoehe" '("hoehe" . 0.0) (ch-kreuz-abzug 1.5 1.5 5000.0 6600.0 1500.0))
(tu-eq "ch-kreuz-abzug/grenze" '("abzug" . 1.5) (ch-kreuz-abzug 1.5 1.5 5000.0 6500.0 1500.0))
(tu-eq "ch-kreuz-abzug/abzug" '("abzug" . 1.5) (ch-kreuz-abzug 1.5 1.5 5000.0 5200.0 1500.0))
;; --- ch-strecke-abzug (Familiensaetze: idx handles z b) ---
(tu-eq "ch-strecke-abzug/innen"
'("innen" . 1.5)
(ch-strecke-abzug '(1 ("a") 5000.0 1.5) '(1 ("a") 5000.0 1.5) 1500.0))
(tu-eq "ch-strecke-abzug/innen-ohne-buehne"
'("innen" . 0.0)
(ch-strecke-abzug '(1 ("a") 5000.0 0.0) '(1 ("a") 5000.0 0.0) 1500.0))
(tu-eq "ch-strecke-abzug/zwischen"
'("abzug" . 1.5)
(ch-strecke-abzug '(1 ("a") 5000.0 1.5) '(2 ("b") 5400.0 1.5) 1500.0))
;; --- ch-schleife-p: gleicher Kreisel + gleiche Hoehe ---
(tu-true "ch-schleife-p/gleicher-kreisel-flach" (ch-schleife-p "K1" "K1" 5000.0 5000.0 1.0))
(tu-true "ch-schleife-p/toleranz" (ch-schleife-p "K1" "K1" 5000.0 5000.8 1.0))
(tu-nil "ch-schleife-p/hoehenunterschied" (ch-schleife-p "K1" "K1" 5000.0 4800.0 1.0))
(tu-nil "ch-schleife-p/anderer-kreisel" (ch-schleife-p "K1" "K2" 5000.0 5000.0 1.0))
(tu-nil "ch-schleife-p/kein-kreisel" (ch-schleife-p nil nil 5000.0 5000.0 1.0))
;; --- ch-abzug-anwenden ---
(tu-eqf "ch-abzug-anwenden/normal" 2.5 (ch-abzug-anwenden 3.5 1.0))
(tu-nil "ch-abzug-anwenden/gleich" (ch-abzug-anwenden 3.5 3.5))
(tu-nil "ch-abzug-anwenden/groesser" (ch-abzug-anwenden 3.5 4.0))
(tu-nil "ch-abzug-anwenden/null" (ch-abzug-anwenden 3.5 0.0))
;; --- ch-kreisel-finden: Kreisel r=400, Achse (400,0)-(2400,0) bzw. (400,5000)-(2400,5000) ---
(setq _els (list (tu-bp-el "KREISEL" 0.0 0.0 5000.0 0.0 2000.0 "K1")
(tu-bp-el "KREISEL" 0.0 5000.0 5000.0 0.0 2000.0 "K2")))
(tu-eq "ch-kreisel-finden/auf-achse"
"K1" (ch-kreisel-finden '(1000.0 100.0 5000.0) 5000.0 _els 300.0 100.0))
(tu-eq "ch-kreisel-finden/zweiter"
"K2" (ch-kreisel-finden '(1000.0 4900.0 5000.0) 5000.0 _els 300.0 100.0))
(tu-eq "ch-kreisel-finden/hinter-dem-rad"
"K1" (ch-kreisel-finden '(-200.0 0.0 5000.0) 5000.0 _els 300.0 100.0))
(tu-nil "ch-kreisel-finden/zu-weit"
(ch-kreisel-finden '(1000.0 1000.0 5000.0) 5000.0 _els 300.0 100.0))
(tu-nil "ch-kreisel-finden/falsche-hoehe"
(ch-kreisel-finden '(1000.0 0.0 5300.0) 5300.0 _els 300.0 100.0))
)
;; ------------------------------------------------------------
;; TESTS: ssg_core.lsp - Polygon-Helfer (reine 2D-Berechnung)
;; ------------------------------------------------------------
@@ -2720,11 +3479,12 @@
(princ "\n================================================================")
(foreach fn '("tu-tests-core" "tu-tests-lang" "tu-tests-id" "tu-tests-vfcore"
"tu-tests-etage" "tu-tests-vfl-es" "tu-tests-vfl-ziellinie"
"tu-tests-etage" "tu-tests-vfl-es" "tu-tests-vfl-parallel"
"tu-tests-vfl-ziellinie"
"tu-tests-export" "tu-tests-hoehen" "tu-tests-gf" "tu-tests-omni" "tu-tests-kreisel" "tu-tests-kreisel-bp"
"tu-tests-sepliste" "tu-tests-json" "tu-tests-geruest"
"tu-tests-sepscan" "tu-tests-vfl-segs" "tu-tests-vfl-abbruch"
"tu-tests-werkzeuge" "tu-tests-poly" "tu-tests-lager")
"tu-tests-werkzeuge" "tu-tests-poly" "tu-tests-lager" "tu-tests-kf" "tu-tests-hoehen-fam")
(tu-run-block fn))
(princ "\n\n----------------------------------------------------------------")
+2
View File
@@ -10,6 +10,8 @@
; Modul, gehoert dessen load-Zeile HIER dazu (nicht in test_unit.lsp).
(load (strcat (getenv "DXFM_LISP") "/GeruestInsert.lsp") "GeruestInsert.lsp nicht gefunden")
(load (strcat (getenv "DXFM_LISP") "/count_sep_scan.lsp") "count_sep_scan.lsp nicht gefunden")
(load (strcat (getenv "DXFM_LISP") "/KettenFoerderer.lsp") "KettenFoerderer.lsp nicht gefunden")
(load (strcat (getenv "DXFM_LISP") "/check_hoehen.lsp") "check_hoehen.lsp nicht gefunden")
(load (strcat (getenv "DXFMAKRO") "/tests/test_unit.lsp"))
(c:TEST_UNIT)
(command "_.QUIT")
+2
View File
@@ -175,10 +175,12 @@ EINGABE_ERLAUBT = {
"vfl-in-selection": {"ssget": 1},
"vfl-in-segmente": {"ssget": 1}, # Modus-3-Wrapper: Live-Auswahl -> Segment-Essenz (SEGS), Replay aus Journal
"vfl-winkel-live": {"getint": 1}, # livefn fuer vfl-in-value
"vfl-menu-strwert": {"getstring": 1}, # livefn fuer vfl-in-value (Wert statt Index)
# --- Wizard-Schicht (DCL); bei ssg-gui-aus greift sie nicht ---
"vflw-zahl": {"getreal": 1}, # Fallback ohne Dialog
"vflw-zahl-impl": {"new_dialog": 1},
"vflw-wahl-impl": {"new_dialog": 1},
"vflw-radio-wahl-impl": {"new_dialog": 1},
"vflw-gruppe-as-impl": {"new_dialog": 1},
"vflw-gruppe-gefaelle-impl": {"new_dialog": 1},
"vflw-gruppe-punkt-hoehe-impl": {"new_dialog": 1},
+119
View File
@@ -0,0 +1,119 @@
[
{
"beschreibung": "Linienzug Modus 2, Variante B: 90-Grad-Ecke als GF-BOGEN (geneigt eingebaut). Deckt die Neigungs-Projektion der Eck-Korrektur ab (vfl-projiziere-neigung) und den Zweig OHNE flache Zone, in dem der ES-Fussabdruck frueher faelschlich vom VF-Lauf abgezogen wurde (878 mm). Aufgezeichnet 2026-10-27 aus einem echten BricsCAD-Lauf. Startpunkt fuer die Testreihe versetzt: alle Koordinaten (Start-/Zielpunkt und Pfadsegmente) um einen gemeinsamen Vektor verschoben, damit TEST_LINIENZUG_MODUS2 die Ketten nebeneinander auf einer Grundlinie baut statt verstreut. Reine Translation - Laengen, Winkel und die geprueften Abweichungen sind davon unabhaengig; Z bleibt unveraendert, weil die Starthoehe ein Eingabewert des Solvers ist.",
"test_id": "LZ_M2_gfbogen",
"kurz": "Ecke als GF-Bogen",
"erwartung_quer_mm": 0,
"erwartung_dz_mm": 0,
"erwartung_laengs_mm": 105,
"erwartung_hinweis": "quer zur ES-KS_AUS-Achse MUSS ~0 sein und dZ ~0; laengs darf abweichen - das ist die Ausladung des ES-Elements und kein Fehler. Beides zugleich geht nicht: entweder liegt die letzte Gerade auf der gezeichneten Linie und der KS_AUS landet seitlich daneben, oder umgekehrt. Entschieden ist - der Hauptstrang bleibt gerade."
},
{
"art": "PT",
"x": 60000.0,
"y": 0.0,
"z": 0.0
},
{
"art": "REAL",
"wert": 0.0
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "PT",
"x": 71000.0,
"y": -6315.123197,
"z": 184.3
},
{
"art": "REAL",
"wert": 184.3
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "30"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "SEGS",
"wert": "Linie|0|9700|0|links|60000|0|69700|0;Bogen|0|707.106781|90|rechts|69700|0|70200|-500;Linie|-90|4295.507955|0|links|70200|-500|70200|-4795.507955;Bogen|-90|258.819045|30|links|70200|-4795.507955|70266.987298|-5045.507955;Linie|-60|1466.025404|0|links|70266.987298|-5045.507955|71000|-6315.123197"
},
{
"art": "STR",
"wert": "m2v2"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "REAL",
"wert": 3.0
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "REAL",
"wert": 3.0
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "mit-gf1"
},
{
"art": "INT",
"wert": 1
},
{
"art": "STR",
"wert": "1"
}
]
+99
View File
@@ -0,0 +1,99 @@
[
{
"beschreibung": "Linienzug Modus 2, GEFALTETER Lauf (U-Form): der Pfad wechselt ueber zwei 90-Grad-Vario-Kurven dreimal die Fahrtrichtung, die Kletterstrecke liegt dadurch in einem ANDEREN Schenkel als der Lauf-Eingang. GF-Verteilung 1 (alles am Einlauf, GF1) - diese Verteilung war bis 2026-10-29 durch keinen Test abgedeckt. Aufgezeichnet 2026-10-29 aus einem echten BricsCAD-Lauf. Startpunkt fuer die Testreihe versetzt: alle Koordinaten (Start-/Zielpunkt und Pfadsegmente) um einen gemeinsamen Vektor verschoben, damit TEST_LINIENZUG_MODUS2 die Ketten nebeneinander auf einer Grundlinie baut statt verstreut. Reine Translation - Laengen, Winkel und die geprueften Abweichungen sind davon unabhaengig; Z bleibt unveraendert, weil die Starthoehe ein Eingabewert des Solvers ist.",
"test_id": "LZ_M2_uform_gf1",
"kurz": "U-Form, GF alles am Einlauf",
"erwartung_quer_mm": 0,
"erwartung_dz_mm": 0,
"erwartung_laengs_mm": 638,
"erwartung_hinweis": "quer zur ES-KS_AUS-Achse MUSS ~0 sein und dZ ~0; laengs darf abweichen - das ist die Ausladung des ES-Elements und kein Fehler. Der laengs-Wert von rund 638 mm ist die Ausladung des ES_Element_90_links und in allen drei U-Form-Faellen gleich; geprueft werden nur quer und dZ."
},
{
"art": "PT",
"x": 80000.0,
"y": 0.0,
"z": 355.289671
},
{
"art": "REAL",
"wert": 355.3
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "PT",
"x": 81269.916932,
"y": 0.0,
"z": 355.289671
},
{
"art": "REAL",
"wert": 355.3
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "SEGS",
"wert": "Linie|90|5854.769733|0|links|80000|0|80000|5854.769733;Bogen|90|707.106781|90|rechts|80000|5854.769733|80500|6354.769733;Linie|0|269.916931|0|links|80500|6354.769733|80769.916932|6354.769733;Bogen|0|707.106781|90|rechts|80769.916932|6354.769733|81269.916932|5854.769733;Linie|-90|5854.769733|0|links|81269.916932|5854.769733|81269.916932|0"
},
{
"art": "STR",
"wert": "m2v2"
},
{
"art": "STR",
"wert": "vf"
},
{
"art": "STR",
"wert": "vario-kurve"
},
{
"art": "STR",
"wert": "aussen"
},
{
"art": "STR",
"wert": "vario-kurve"
},
{
"art": "STR",
"wert": "aussen"
},
{
"art": "STR",
"wert": "mit-gf1"
},
{
"art": "STR",
"wert": "3"
},
{
"art": "INT",
"wert": 2
},
{
"art": "STR",
"wert": "1"
}
]
+99
View File
@@ -0,0 +1,99 @@
[
{
"beschreibung": "Linienzug Modus 2, GEFALTETER Lauf (U-Form), GF-Verteilung 2 (1/2 GF1 + 1/2 GF2). DAS ist der Lauf, an dem die Laengenbilanz des gefalteten Laufs entwickelt und gemessen wurde: 1424 -> 934 -> 402 -> 0.56 mm quer (9 Grad). Er deckt alle vier Teilstuecke zugleich ab - Eingangs-Hardware im fremden Schenkel, kletter-ende-fp, GF1-Fremdanteil (Nachrechner) und das unterdrueckte Fueller-A. Aufgezeichnet 2026-10-29 aus einem echten BricsCAD-Lauf. Startpunkt fuer die Testreihe versetzt: alle Koordinaten (Start-/Zielpunkt und Pfadsegmente) um einen gemeinsamen Vektor verschoben, damit TEST_LINIENZUG_MODUS2 die Ketten nebeneinander auf einer Grundlinie baut statt verstreut. Reine Translation - Laengen, Winkel und die geprueften Abweichungen sind davon unabhaengig; Z bleibt unveraendert, weil die Starthoehe ein Eingabewert des Solvers ist.",
"test_id": "LZ_M2_uform_halb",
"kurz": "U-Form, GF 1/2+1/2",
"erwartung_quer_mm": 0,
"erwartung_dz_mm": 0,
"erwartung_laengs_mm": 638,
"erwartung_hinweis": "quer zur ES-KS_AUS-Achse MUSS ~0 sein und dZ ~0; laengs darf abweichen - das ist die Ausladung des ES-Elements und kein Fehler. Der laengs-Wert von rund 638 mm ist die Ausladung des ES_Element_90_links und in allen drei U-Form-Faellen gleich; geprueft werden nur quer und dZ."
},
{
"art": "PT",
"x": 100000.0,
"y": 0.0,
"z": 710.579341
},
{
"art": "REAL",
"wert": 710.6
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "PT",
"x": 101269.916932,
"y": -1951.333591,
"z": 710.579341
},
{
"art": "REAL",
"wert": 710.6
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "SEGS",
"wert": "Linie|90|5854.769733|0|links|100000|0|100000|5854.769733;Bogen|90|707.106781|90|rechts|100000|5854.769733|100500|6354.769733;Linie|0|269.916931|0|links|100500|6354.769733|100769.916932|6354.769733;Bogen|0|707.106781|90|rechts|100769.916932|6354.769733|101269.916932|5854.769733;Linie|-90|7806.103325|0|links|101269.916932|5854.769733|101269.916932|-1951.333591"
},
{
"art": "STR",
"wert": "m2v2"
},
{
"art": "STR",
"wert": "vf"
},
{
"art": "STR",
"wert": "vario-kurve"
},
{
"art": "STR",
"wert": "aussen"
},
{
"art": "STR",
"wert": "vario-kurve"
},
{
"art": "STR",
"wert": "aussen"
},
{
"art": "STR",
"wert": "mit-gf1"
},
{
"art": "STR",
"wert": "3"
},
{
"art": "INT",
"wert": 2
},
{
"art": "STR",
"wert": "2"
}
]
+99
View File
@@ -0,0 +1,99 @@
[
{
"beschreibung": "Linienzug Modus 2, GEFALTETER Lauf (U-Form) wie LZ_M2_uform_halb, aber mit der naechststeileren Winkel-Option. Der Restfehler der alten Bilanz skalierte mit L_GF und damit mit dem Winkel (6 Grad: 90 mm, 9 Grad: 934 mm) - zwei Winkel auf derselben Pfadfamilie sichern deshalb mehr ab als zwei Laeufe mit demselben. Aufgezeichnet 2026-10-29 aus einem echten BricsCAD-Lauf. Startpunkt fuer die Testreihe versetzt: alle Koordinaten (Start-/Zielpunkt und Pfadsegmente) um einen gemeinsamen Vektor verschoben, damit TEST_LINIENZUG_MODUS2 die Ketten nebeneinander auf einer Grundlinie baut statt verstreut. Reine Translation - Laengen, Winkel und die geprueften Abweichungen sind davon unabhaengig; Z bleibt unveraendert, weil die Starthoehe ein Eingabewert des Solvers ist.",
"test_id": "LZ_M2_uform_halb_steil",
"kurz": "U-Form, GF 1/2+1/2, steilere Winkel-Option",
"erwartung_quer_mm": 0,
"erwartung_dz_mm": 0,
"erwartung_laengs_mm": 638,
"erwartung_hinweis": "quer zur ES-KS_AUS-Achse MUSS ~0 sein und dZ ~0; laengs darf abweichen - das ist die Ausladung des ES-Elements und kein Fehler. Der laengs-Wert von rund 638 mm ist die Ausladung des ES_Element_90_links und in allen drei U-Form-Faellen gleich; geprueft werden nur quer und dZ."
},
{
"art": "PT",
"x": 120000.0,
"y": 0.0,
"z": 709.285191
},
{
"art": "REAL",
"wert": 709.3
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "PT",
"x": 121269.916932,
"y": 0.077406,
"z": 709.275779
},
{
"art": "REAL",
"wert": 709.3
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "SEGS",
"wert": "Linie|90|5854.769733|0|links|120000|-21.403816|120000|5833.365917;Bogen|90|707.106781|90|rechts|120000|5833.365917|120500|6333.365917;Linie|0|269.916931|0|links|120500|6333.365917|120769.916932|6333.365917;Bogen|0|707.106781|90|rechts|120769.916932|6333.365917|121269.916932|5833.365917;Linie|-90|5854.769733|0|links|121269.916932|5833.365917|121269.916932|-21.403816"
},
{
"art": "STR",
"wert": "m2v2"
},
{
"art": "STR",
"wert": "vf"
},
{
"art": "STR",
"wert": "vario-kurve"
},
{
"art": "STR",
"wert": "aussen"
},
{
"art": "STR",
"wert": "vario-kurve"
},
{
"art": "STR",
"wert": "aussen"
},
{
"art": "STR",
"wert": "mit-gf1"
},
{
"art": "STR",
"wert": "3"
},
{
"art": "INT",
"wert": 3
},
{
"art": "STR",
"wert": "2"
}
]
+107
View File
@@ -0,0 +1,107 @@
[
{
"beschreibung": "Linienzug Modus 2, Variante A: 90-Grad-Ecke als VARIO-KURVE (waagerecht eingebaut), Segment 3 dadurch automatisch VF. Deckt die flache Zone ab (Abschluss-Fussabdruck Bogen+Motorstation) und die Eck-Korrektur von 93.8 mm je Nachbargerade. Aufgezeichnet 2026-10-27 aus einem echten BricsCAD-Lauf. Startpunkt fuer die Testreihe versetzt: alle Koordinaten (Start-/Zielpunkt und Pfadsegmente) um einen gemeinsamen Vektor verschoben, damit TEST_LINIENZUG_MODUS2 die Ketten nebeneinander auf einer Grundlinie baut statt verstreut. Reine Translation - Laengen, Winkel und die geprueften Abweichungen sind davon unabhaengig; Z bleibt unveraendert, weil die Starthoehe ein Eingabewert des Solvers ist.",
"test_id": "LZ_M2_variokurve",
"kurz": "Ecke als Vario-Kurve",
"erwartung_quer_mm": 0,
"erwartung_dz_mm": 0,
"erwartung_laengs_mm": 105,
"erwartung_hinweis": "quer zur ES-KS_AUS-Achse MUSS ~0 sein und dZ ~0; laengs darf abweichen - das ist die Ausladung des ES-Elements und kein Fehler. Beides zugleich geht nicht: entweder liegt die letzte Gerade auf der gezeichneten Linie und der KS_AUS landet seitlich daneben, oder umgekehrt. Entschieden ist - der Hauptstrang bleibt gerade."
},
{
"art": "PT",
"x": 40000.0,
"y": 0.0,
"z": 0.0
},
{
"art": "REAL",
"wert": 0.0
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "90"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "PT",
"x": 51000.0,
"y": -6315.123197,
"z": 184.3
},
{
"art": "REAL",
"wert": 184.3
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "30"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "SEGS",
"wert": "Linie|0|9700|0|links|40000|0|49700|0;Bogen|0|707.106781|90|rechts|49700|0|50200|-500;Linie|-90|4295.507955|0|links|50200|-500|50200|-4795.507955;Bogen|-90|258.819045|30|links|50200|-4795.507955|50266.987298|-5045.507955;Linie|-60|1466.025404|0|links|50266.987298|-5045.507955|51000|-6315.123197"
},
{
"art": "STR",
"wert": "m2v2"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "STR",
"wert": "1"
},
{
"art": "REAL",
"wert": 3.0
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "2"
},
{
"art": "STR",
"wert": "mit-gf1"
},
{
"art": "INT",
"wert": 1
},
{
"art": "STR",
"wert": "1"
}
]
+11 -2
View File
@@ -8,14 +8,19 @@
},
{
"typ": "point_abs",
"wert": [-1289.407125, 95.871332, 2154],
"kommentar": "getpoint Startpunkt der Kette"
"wert": [0.0, 0.0, 2154],
"kommentar": "getpoint Startpunkt der Kette - fuer die Testreihe auf X=0/Y=0 versetzt, damit die Ketten aller Linienzug-Tests nebeneinander auf einer Grundlinie entstehen statt verstreut. Unkritisch, weil dies der EINZIGE absolute Punkt des Skripts ist: alle weiteren Punkte sind relativ (point_rel mit dL/hz), die Geometrie also unveraendert. Z bleibt stehen - das ist die Starthoehe und ein echter Eingabewert."
},
{
"typ": "real",
"wert": 2154.0,
"kommentar": "getreal Hoehe (Z) Startpunkt"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Bau-Richtung (1 = vorwaerts) - seit 2026-10-25 (Commit fb56794, Rueckwaerts-Bau). Die Frage steht VOR der AS-Praeambel. Fuer JOURNALE ist sie abwaertskompatibel (fehlt der Eintrag, gilt das Journal als Alt-Format), fuer dieses MOCK-Skript aber nicht: der Mock beantwortet jede getstring-Abfrage aus der Queue, eine fehlende Antwort verschiebt also alles Folgende um eine Position. Sichtbar wurde das als Abbruch in cdr mit dem String 5, weil die Achsen-Punktabfrage dann diesen String zog statt eines Punktes."
},
{
"typ": "string",
"wert": "1",
@@ -31,6 +36,10 @@
"wert": "1",
"kommentar": "getstring AS-Seite (links)"
},
{
"typ": "point_none",
"kommentar": "getpoint AS-Zufuehrungsachse (2. Punkt, optional seit 2026-10-21) - Enter ohne Punkt, Kette laeuft wie frueher ueber den naechsten Klick"
},
{
"typ": "string",
"wert": "5",
+11 -2
View File
@@ -8,14 +8,19 @@
},
{
"typ": "point_abs",
"wert": [21377.904954, -10300, 2067],
"kommentar": "getpoint Startpunkt der Kette"
"wert": [20000.0, 0.0, 2067],
"kommentar": "getpoint Startpunkt der Kette - fuer die Testreihe auf X=20000/Y=0 versetzt, damit die Ketten aller Linienzug-Tests nebeneinander auf einer Grundlinie entstehen statt verstreut. Unkritisch, weil dies der EINZIGE absolute Punkt des Skripts ist: alle weiteren Punkte sind relativ (point_rel mit dL/hz), die Geometrie also unveraendert. Z bleibt stehen - das ist die Starthoehe und ein echter Eingabewert."
},
{
"typ": "real",
"wert": 2154.0,
"kommentar": "getreal Hoehe (Z) Startpunkt"
},
{
"typ": "string",
"wert": "1",
"kommentar": "getstring Bau-Richtung (1 = vorwaerts) - seit 2026-10-25 (Commit fb56794, Rueckwaerts-Bau). Siehe gleichlautenden Eintrag in linienzug_tests.json: fuer Journale abwaertskompatibel, fuer dieses Mock-Skript nicht."
},
{
"typ": "string",
"wert": "1",
@@ -31,6 +36,10 @@
"wert": "1",
"kommentar": "getstring AS-Seite (links)"
},
{
"typ": "point_none",
"kommentar": "getpoint AS-Zufuehrungsachse (2. Punkt, optional seit 2026-10-21) - Enter ohne Punkt"
},
{
"typ": "string",
"wert": "5",
+2 -1
View File
@@ -8,6 +8,7 @@
"abstand": 5000,
"rotation": 0.0,
"typ": "STANDARD",
"drehrichtung": "GUZ",
"expect_block_prefix": "KREISEL_",
"expect_hoehe": "1554",
"expect_kreiselart": "STANDARD",
@@ -22,7 +23,7 @@
"abstand": 20015,
"rotation": 90.0,
"typ": "STANDARD",
"drehrichtung": "GUZ",
"drehrichtung": "UZS",
"expect_block_prefix": "KREISEL_",
"expect_hoehe": "1554",
"expect_kreiselart": "STANDARD",