[MERGE] Lager branch in main
This commit is contained in:
+147
@@ -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.
|
||||
|
||||
@@ -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.
|
@@ -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.
|
@@ -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.
|
@@ -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",
|
||||
|
||||
@@ -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.
|
@@ -2,7 +2,7 @@
|
||||
{
|
||||
"test_id": "LZ_Standard",
|
||||
"status": "OK",
|
||||
"schritte_gesamt": 37,
|
||||
"schritte_gesamt": 34,
|
||||
"schritte_offen": 0
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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.
|
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -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": ""}
|
||||
@@ -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"] == {}
|
||||
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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
@@ -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
@@ -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----------------------------------------------------------------")
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
}
|
||||
]
|
||||
@@ -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
@@ -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"
|
||||
}
|
||||
]
|
||||
Vendored
+11
-2
@@ -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
@@ -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",
|
||||
|
||||
Vendored
+2
-1
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user