tro_flow.link_tros: Uebergang durch eine Weiche zwischen zwei Kreiseln
Der Weichenknoten-TRO leitet ueber jede seiner Weichen auf den Partnerkreisel um; dort faehrt der Traeger zum naechsten Halt nach der Weiche. Ohne diese Kante fehlte z. B. in der Testanlage test_system TRO(0011) -> TRO(0010), der Ausgang war vom Eingang aus unerreichbar. Test tests/test_tro_link.py mit Fixture test_system_sep22_export.csv; ID-Datei cfg/export_tro_ids.ini der Testanlage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
df24cf5adb
commit
77c5aac343
@@ -0,0 +1,67 @@
|
||||
; ============================================================
|
||||
; TRO-IDs zu export.csv - erzeugt von lib/tro_flow.py am 2026-10-14
|
||||
;
|
||||
; Je TRO: ID = x, y (mm) seines Anker-Separators im CSV-Koordinatensystem.
|
||||
; Die IDs duerfen umbenannt werden (eindeutig, gueltiger SCL-Bezeichner);
|
||||
; tro_flow findet jeden TRO ueber die Lage wieder. Neue TROs werden
|
||||
; unten angehaengt, weggefallene bleiben stehen und werden gemeldet.
|
||||
; Alles neu nummerieren: tro_flow --renumber (ueberschreibt diese Datei).
|
||||
; Siehe doc/Konzept_Layout_Hardware_SCL.md, Abschnitt TRO-IDs.
|
||||
; ============================================================
|
||||
|
||||
[tro]
|
||||
TRO01 = 6133.6, 302.6 ; 1Sep | Separator 0017 auf Kreisel4 Bahn L | Sep 0017
|
||||
TRO02 = 4540.0, -3169.7 ; 1Sep1Swi | Separator 0014 an ILS Weiche 0029 | Sep 0014
|
||||
TRO03 = 5340.0, -6534.2 ; 1Sep1Swi | Separator 0015 an ILS Weiche 0028 | Sep 0015
|
||||
TRO04 = 6933.6, -6618.2 ; 1Sep | Separator 0016 auf Kreisel4 Bahn R | Sep 0016
|
||||
TRO05 = 7149.2, 1886.0 ; 1Sep | Separator 0018 auf Kreisel6 Bahn R | Sep 0018
|
||||
TRO06 = 6933.6, 2908.5 ; 1Sep | Separator 0019 auf Kreisel6 Bahn R | Sep 0019
|
||||
TRO07 = 4540.6, -1493.5 ; 1Sep1Swi | Separator 0013 an ILS Weiche 0024 | Sep 0013
|
||||
TRO08 = 3699.4, 905.8 ; 1Sep | Separator 0012 auf Kreisel8 Bahn L | Sep 0012
|
||||
TRO09 = 1244.4, 105.8 ; 1Sep | Separator 0011 auf Kreisel8 Bahn R | Sep 0011
|
||||
TRO10 = -461.8, 1526.1 ; 1Sep | Separator 0010 auf Kreisel9 Bahn L | Sep 0010
|
||||
; neu aus export.csv am 2026-10-15
|
||||
TRO11 = 10310.0, -440.1 ; 1Sep | Separator 0042 auf Kreisel3 Bahn R | Sep 0042
|
||||
TRO12 = 10310.0, 159.9 ; 1Sep | Separator 0043 auf Kreisel3 Bahn R | Sep 0043
|
||||
TRO13 = 10310.0, -5013.1 ; 1Sep | Separator 0044 auf Kreisel3 Bahn R | Sep 0044
|
||||
TRO14 = 9510.0, 14217.0 ; 1Sep | Separator 0045 auf Kreisel3 Bahn L | Sep 0045
|
||||
TRO15 = 958.0, 12300.0 ; PinStore_Auto | Speicher (20 Schwerkraftlinien) | Sep 0066, 0069, 0072, 0075, 0078, 0081, 0084, 0087, 0090, 0093, 0096, 0099, 0102, 0105, 0108, 0111, 0114, 0117, 0120, 0123
|
||||
TRO16 = 3299.6, 13509.6 ; Vario | VF_1 | Sep 0054
|
||||
TRO17 = 8953.1, 13509.6 ; 1Sep | VF_1 | Sep 0055
|
||||
TRO18 = 400.0, -3978.1 ; 1Sep1Swi | Separator 0005 an Ausschleuselement 0053 (Strecke 0013, Anfang) | Sep 0005
|
||||
TRO19 = 3299.6, -4743.4 ; Vario | VF_2 | Sep 0058
|
||||
TRO20 = 8953.1, -4743.4 ; 1Sep | VF_2 | Sep 0059
|
||||
TRO21 = -400.0, -3554.9 ; 2Sep2Swi | Uebergabestelle Kreisel2: Ausschleuselement 0057 + ILS Weiche 0125 | Sep 0012, 0036
|
||||
TRO22 = 5355.1, -5878.0 ; 1Sep | Separator 0040 auf Kreisel1 Bahn R | Sep 0040
|
||||
TRO23 = -400.0, 13920.0 ; 1Sep | Separator 0003 auf Kreisel2 Bahn L | Sep 0003
|
||||
TRO24 = -400.0, -562.0 ; 1Sep | Separator 0011 auf Kreisel2 Bahn L | Sep 0011
|
||||
TRO25 = -898.9, 1134.6 ; Vario | VF_3 | Sep 0062
|
||||
TRO26 = -703.0, 12307.8 ; 1Sep | VF_3 | Sep 0063
|
||||
TRO27 = -1026.0, 10723.0 ; 1Sep | VF_3 | Sep 0037
|
||||
TRO28 = -1026.0, 5250.1 ; 1Sep | VF_3 | Sep 0038
|
||||
; neu aus export.csv am 2026-10-15
|
||||
TRO29 = 34716.5, 3406.7 ; Vario | VF_4 | Sep 0071
|
||||
TRO30 = 20161.7, 3406.7 ; 1Sep | VF_4 | Sep 0072
|
||||
TRO31 = 42164.0, 4329.5 ; 1Sep2Swi | Separator 0048 an Ausschleuselementen 0070, 0078 (Strecken 0008, 0010) | Sep 0048
|
||||
TRO32 = 40437.8, 2448.3 ; Vario | VF_6 | Sep 0079
|
||||
TRO33 = 33048.6, 2448.3 ; 1Sep | VF_6 | Sep 0080
|
||||
TRO34 = 26860.8, 2448.3 ; Vario | VF_6 | Sep 0081
|
||||
TRO35 = 20134.0, 2448.3 ; 1Sep | VF_6 | Sep 0082
|
||||
TRO36 = 20161.9, 6635.8 ; Vario | VF_5 | Sep 0075
|
||||
TRO37 = 20161.9, 11560.3 ; 1Sep | VF_5 | Sep 0076
|
||||
TRO38 = 19604.0, 4982.3 ; 1Sep1Swi | Separator 0043 an Ausschleuselement 0074 (Strecke 0009, Anfang) | Sep 0043
|
||||
TRO39 = 3098.7, 12119.7 ; 1Sep | Separator 0038 auf Kreisel2 Bahn L | Sep 0038
|
||||
TRO40 = 34990.4, 12919.7 ; 1Sep | Separator 0046 auf Kreisel2 Bahn R | Sep 0046
|
||||
TRO41 = 5034.1, 12919.7 ; PinStore_Auto | Speicher (10 Schwerkraftlinien) | Sep 0040, 0085, 0088, 0091, 0094, 0097, 0100, 0103, 0106, 0109, 0112
|
||||
TRO42 = 2703.7, 21969.7 ; Vario | VF_1 | Sep 0059
|
||||
TRO43 = 2703.7, 13476.7 ; 1Sep | VF_1 | Sep 0060
|
||||
TRO44 = 3542.3, 24478.8 ; 1Sep1Swi | Separator 0039 an Ausschleuselement 0058 (Strecke 0005, Anfang) | Sep 0039
|
||||
TRO45 = 14674.7, 21969.7 ; Vario | VF_2 | Sep 0063
|
||||
TRO46 = 14674.7, 13476.7 ; 1Sep | VF_2 | Sep 0064
|
||||
TRO47 = 15472.4, 24478.8 ; 1Sep1Swi | Separator 0041 an Ausschleuselement 0062 (Strecke 0006, Anfang) | Sep 0041
|
||||
TRO48 = 23232.7, 21969.7 ; Vario | VF_3 | Sep 0067
|
||||
TRO49 = 23232.7, 13476.7 ; 1Sep | VF_3 | Sep 0068
|
||||
TRO50 = 24062.0, 24478.8 ; 1Sep1Swi | Separator 0044 an Ausschleuselement 0066 (Strecke 0007, Anfang) | Sep 0044
|
||||
TRO51 = 15934.1, 12919.8 ; PinStore_Auto | Speicher (7 Schwerkraftlinien) | Sep 0042, 0115, 0118, 0121, 0124, 0127, 0130, 0133
|
||||
TRO52 = 24734.2, 12919.8 ; PinStore_Auto | Speicher (10 Schwerkraftlinien) | Sep 0045, 0136, 0139, 0142, 0145, 0148, 0151, 0154, 0157, 0160, 0163
|
||||
TRO53 = 35122.8, 25278.8 ; 1Sep | Separator 0047 auf Kreisel3 Bahn R | Sep 0047
|
||||
@@ -1957,6 +1957,44 @@ def link_tros(
|
||||
if nxt is not None and nxt != vario_id:
|
||||
_add_chain_pair(vario_id, nxt)
|
||||
|
||||
# 1b. Uebergang durch eine Weiche zwischen zwei Kreiseln: der Weichen-
|
||||
# knoten-TRO (derive_tros Schritt 3c) leitet ueber jede seiner Weichen auf
|
||||
# den Partnerkreisel um - dort faehrt der Traeger zum naechsten Halt NACH
|
||||
# der Weiche (wie beim Einschleuselement oben). Die Ketten der Kreisel
|
||||
# kennen Weichen nicht als Glied; ohne diese Kante fehlte der Uebergang,
|
||||
# sobald der TRO auf seinem eigenen Kreisel schon eine praezise Kette hat
|
||||
# (dxfmakros test_system: TRO09 auf Kreisel 0008 -> Weiche 0023 ->
|
||||
# Kreisel 0009 -> TRO10 fehlte, der Ausgang war unerreichbar). Nur in
|
||||
# Richtung eines Kreisels, auf dem der TRO NICHT allein steuert: ein
|
||||
# Separator auf dem Zielkreisel selbst leitet von dort weg, nicht dorthin.
|
||||
# Ausgangsstationen vor dem naechsten Halt bekommen ihren Ablaufpfeil.
|
||||
kreisel_by_id = {e.teile_id: e for e in elements
|
||||
if e.is_circle and len(e.track_ids) >= 2}
|
||||
for knoten in find_junctions(elements, []):
|
||||
knoten_tros = {ketten_owner[s] for s in knoten.separators if s in ketten_owner}
|
||||
if len(knoten_tros) != 1:
|
||||
continue
|
||||
tro_id = knoten_tros.pop()
|
||||
sep_kreisel = set(knoten.sep_kreisel.values())
|
||||
for contact in knoten.contacts:
|
||||
for ziel_id in contact.kreisel:
|
||||
ziel = kreisel_by_id.get(ziel_id)
|
||||
if (ziel is None or not sep_kreisel - {ziel_id}
|
||||
or contact.weiche_id not in ziel.track_ids):
|
||||
continue
|
||||
ids = list(ziel.track_ids)
|
||||
i = ids.index(contact.weiche_id)
|
||||
folge = ids[i + 1:]
|
||||
if ziel.rotation in (ROTATION_CW, ROTATION_CCW):
|
||||
folge += ids[:i]
|
||||
for tid in folge:
|
||||
station = station_hosts.get(tid)
|
||||
if station is not None and station.type_name == BOUNDARY_EXIT:
|
||||
_add_chain_pair(tro_id, station.tro_id)
|
||||
if tid in ketten_owner:
|
||||
_add_chain_pair(tro_id, ketten_owner[tid])
|
||||
break
|
||||
|
||||
# Nur TROs, fuer die die Umlaufkette tatsaechlich einen praezisen
|
||||
# Nachfolger gefunden hat (precise_sources) - ein TRO ohne brauchbare
|
||||
# TrackIds-Abdeckung behaelt seine bisherigen (ungenaueren, aber nicht
|
||||
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;Boundingbox;Insertpoint;K1;K2;K3;K4;Nachbarn;TrackIds;Fehler;Warnungen;Merkmale
|
||||
1;"ILS 2.0 Kreisel";"0001";"Kreisel37";"A/7-B/8";1;"-2011.74, 994.84, 2000.00";"3100.00, 800.00, 1.00";"yab0Dy4YHoSAAAAAAAAAAAAA";"";"";"";"";"0009-L";"0024, 0021";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "2.3", "Anzahl der Separatoren": "0", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "UZS", "Drehung": 0, "Name": "Kreisel37", "Geruest fuer Einzelmodul": true}
|
||||
2;"ILS 2.0 Kreisel";"0002";"Kreisel38";"E/3-E/6";1;"4940.03, -4953.25, 2000.00";"800.00, 5300.00, 1.00";"S2D+i/vOHoSAAAAAAAAAWoJ4";"";"";"";"";"0007-L, 0007-R, 0003-L";"0026, 0015, 0030, 0014";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "4.5", "Anzahl der Separatoren": "2", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "UZS", "Drehung": 90, "Name": "Kreisel38", "Geruest fuer Einzelmodul": true}
|
||||
3;"ILS 2.0 Kreisel";"0003";"Kreisel39";"E/1-E/4";1;"5739.13, -9850.80, 2000.00";"800.00, 6095.71, 1.00";"V5J6gAABHoSAAAAAAAAAWoJ4";"";"";"";"";"0004-L, 0002-R";"0030, 0029";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "5.3", "Anzahl der Separatoren": "0", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "GUZ", "Drehung": 90, "Name": "Kreisel39", "Geruest fuer Einzelmodul": true}
|
||||
4;"ILS 2.0 Kreisel";"0004";"Kreisel40";"E/3-F/7";1;"6533.60, -3258.73, 2000.00";"800.00, 8689.42, 1.00";"Y7Hgi/sQHoSAAAAAAAAAWoJ4";"";"";"";"";"0005-R, 0003-R";"0016, 0029, 0017, 0028";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "7.89", "Anzahl der Separatoren": "2", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "UZS", "Drehung": 90, "Name": "Kreisel40", "Geruest fuer Einzelmodul": true}
|
||||
5;"ILS 2.0 Kreisel";"0005";"Kreisel41";"E/7-K/8";1;"11425.39, 1485.99, 2000.00";"10583.58, 800.00, 1.00";"XZdgFqymHoSAAAAAAAAAAAAA";"";"";"";"";"0006-L, 0006-R, 0004-L, 0004-R";"0018, 0027, 0028, 0020";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "9.78", "Anzahl der Separatoren": "1", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "GUZ", "Drehung": 0, "Name": "Kreisel41", "Geruest fuer Einzelmodul": true}
|
||||
6;"ILS 2.0 Kreisel";"0006";"Kreisel42";"E/8-F/10";1;"6533.60, 4145.31, 2000.00";"800.00, 4518.63, 1.00";"Y7HgHMcmHoSAAAAAAAAAWoJ4";"";"";"";"";"0005-L";"0019, 0027";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "3.72", "Anzahl der Separatoren": "1", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "UZS", "Drehung": 90, "Name": "Kreisel42", "Geruest fuer Einzelmodul": true}
|
||||
7;"ILS 2.0 Kreisel";"0007";"Kreisel43";"E/6-E/8";1;"4940.59, 96.75, 2000.00";"800.00, 4800.00, 1.00";"S2Mu3NruHoSAAAAAAAAAWoJ4";"";"";"";"";"0008-L, 0008-R, 0002-L, 0002-R";"0022, 0025, 0013, 0026";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "4.0", "Anzahl der Separatoren": "2", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "GUZ", "Drehung": 90, "Name": "Kreisel43", "Geruest fuer Einzelmodul": true}
|
||||
8;"ILS 2.0 Kreisel";"0008";"Kreisel44";"B/7-E/7";1;"2440.85, 505.79, 2000.00";"4200.00, 800.00, 1.00";"BTNyB7e+HoSAAAAAAAAAAAAA";"";"";"";"";"0009-R, 0007-L";"0025, 0011, 0023, 0012";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "3.4", "Anzahl der Separatoren": "2", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "UZS", "Drehung": 0, "Name": "Kreisel44", "Geruest fuer Einzelmodul": true}
|
||||
9;"ILS 2.0 Kreisel";"0009";"Kreisel45";"B/6-B/9";1;"-61.76, 1425.92, 2000.00";"800.00, 4800.00, 1.00";"/w7A8SMAHoSAAAAAAAAAWoJ4";"";"";"";"";"0001-L, 0001-R, 0008-L, 0008-R";"0010, 0024, 0023";"";"";{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "4.0", "Anzahl der Separatoren": "1", "Kreiselart": "STANDARD", "Anzahl der Scanner": "0", "Anzahl der Rampen": "0", "Höhe in m": "2.0", "Drehrichtung": "GUZ", "Drehung": 90, "Name": "Kreisel45", "Geruest fuer Einzelmodul": true}
|
||||
10;"ILS 2.0 Separator";"0010";"Separator :11";"B/8";1;"-461.76, 1526.13, 2001.50";"150.00, 209.90, 3.00";"+PRAFl9EHoSAAAAAAAAAWoJ4";"/+33ADlFAE4g";"";"";"";"0023, 0024";"";"";"";{"Zuordnung": "0009-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 90, "Typ": ""}
|
||||
11;"ILS 2.0 Separator";"0011";"Separator :10";"C/7";1;"1244.39, 105.79, 1.50";"209.90, 150.00, 3.00";"EhK4AZ0+AAAAAAAAAAAAAAAA";"AC5EAAQhAAAA";"";"";"";"0025, 0023";"";"";"";{"Zuordnung": "0008-R", "ARTINR": "200000077", "Höhe": "0", "Drehung": 0, "Typ": ""}
|
||||
12;"ILS 2.0 Separator";"0012";"Separator :9";"D/7";1;"3699.43, 905.79, 2001.50";"209.90, 150.00, 3.00";"OV0UDdI+HoSAAAAAAAAAf///";"AJLZACNhAE4g";"";"";"";"0023, 0025";"";"";"";{"Zuordnung": "0008-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 180, "Typ": ""}
|
||||
13;"ILS 2.0 Separator";"0013";"Separator :8";"E/6";1;"4540.59, -1493.47, 2001.50";"150.00, 209.90, 3.00";"RUiu6Ev0HoSAAAAAAAAAWoJ4";"ALFd/8NSAE4g";"";"";"";"0025, 0026";"";"";"";{"Zuordnung": "0007-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 90, "Typ": ""}
|
||||
14;"ILS 2.0 Separator";"0014";"Separator :7";"E/5";1;"4540.03, -3169.65, 2001.50";"150.00, 209.90, 3.00";"RUZ+0Iy8HoSAAAAAAAAApX2I";"ALFY/4aHAE4g";"";"";"";"0030, 0026";"";"";"";{"Zuordnung": "0002-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 270, "Typ": ""}
|
||||
15;"ILS 2.0 Separator";"0015";"Separator :6";"E/4";1;"5340.03, -6534.21, 2001.50";"150.00, 209.90, 3.00";"UXt+m2GQHoSAAAAAAAAAWoJ4";"ANCY/v5rAE4g";"";"";"";"0026, 0030";"";"";"";{"Zuordnung": "0002-R", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 90, "Typ": ""}
|
||||
16;"ILS 2.0 Separator";"0016";"Separator :5";"F/4";1;"6933.60, -6618.23, 2001.50";"150.00, 209.90, 3.00";"acxgmhlcHoSAAAAAAAAAWoJ4";"AQ7Y/vsjAE4g";"";"";"";"0028, 0029";"";"";"";{"Zuordnung": "0004-R", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 90, "Typ": ""}
|
||||
17;"ILS 2.0 Separator";"0017";"Separator :4";"E/7";1;"6133.60, 302.58, 2001.50";"150.00, 209.90, 3.00";"XZdgBYgiHoSAAAAAAAAApX2I";"AO+YAA4pAE4g";"";"";"";"0029, 0028";"";"";"";{"Zuordnung": "0004-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 270, "Typ": ""}
|
||||
18;"ILS 2.0 Separator";"0018";"Separator :3";"F/8";1;"7149.18, 1885.99, 2001.50";"209.90, 150.00, 3.00";"bCxOHMcmHoSAAAAAAAAAAAAA";"ARTsAEmrAE4g";"";"";"";"0020, 0027";"";"";"";{"Zuordnung": "0005-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 0, "Typ": ""}
|
||||
19;"ILS 2.0 Separator";"0019";"Separator :2";"F/8";1;"6933.60, 2908.49, 2001.50";"150.00, 209.90, 3.00";"acxgK3ccHoSAAAAAAAAAWoJ4";"AQ7YAG9FAE4g";"";"";"";"0027, 0027";"";"";"";{"Zuordnung": "0006-R", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 90, "Typ": ""}
|
||||
20;"ILS 2.0 BTMT Beladung";"0020";"BTMT Beladung :1";"I/7-J/8";1;"14374.25, 1186.94, 1955.31";"645.71, 397.50, 316.02";"f///EJImHoSAAAAAAAAAAAAA";"AiYBADU7AE6r";"Aj3vACprAE4g";"";"";"0028, 0018";"";"";"";{"ARTINR": "829662012", "Höhe": "2000", "Drehung": 0}
|
||||
21;"ILS 2.0 BTMT Entladung";"0021";"BTMT Entladung :1";"A/7";1;"-2501.71, 212.89, 1847.09";"1468.14, 950.36, 467.01";"3bjiCN/+HoSAAAAAAAAAf/+r";"/7UPABabAE4f";"/4Hu//aMAD/1";"";"";"0024, 0024";"";"";"";{"ARTINR": "400100156", "Höhe": "2000", "Drehung": 179}
|
||||
22;"ILS 2.0 Separator";"0022";"Separator :1";"E/8";1;"4540.59, 1258.01, 2001.50";"150.00, 209.90, 3.00";"RUiuEkfsHoSAAAAAAAAAWoJ4";"ALFdAC7MAE4g";"";"";"";"0026, 0025";"";"";"";{"Zuordnung": "0007-L", "ARTINR": "200000077", "Höhe": "2000", "Drehung": 90, "Typ": ""}
|
||||
23;"ILS Weiche";"0023";"ILS Weiche :1";"B/7";1;"338.24, 505.79, 2000.00";"100.00, 250.00, 30.00";"";"";"";"";"";"0011, 0012";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0009", "Kreisel B": "0008", "Achse von Kreisel": "0008", "Beruehrung": "Kreis/Tangente"}
|
||||
24;"ILS Weiche";"0024";"ILS Weiche :2";"B/7";1;"-461.76, 994.84, 2000.00";"100.00, 250.00, 30.00";"";"";"";"";"";"0021, 0021";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0009", "Kreisel B": "0001", "Achse von Kreisel": "0001", "Beruehrung": "Kreis/Tangente"}
|
||||
25;"ILS Weiche";"0025";"ILS Weiche :3";"E/7";1;"4540.59, 505.79, 2000.00";"100.00, 250.00, 30.00";"";"";"";"";"";"0022, 0013";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0008", "Kreisel B": "0007", "Achse von Kreisel": "0008", "Beruehrung": "Kreis/Tangente"}
|
||||
26;"ILS Weiche";"0026";"ILS Weiche :4";"E/6";1;"4940.31, -2303.25, 2000.00";"250.07, 100.17, 30.00";"";"";"";"";"";"0014, 0015";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0007", "Kreisel B": "0002", "Achse von Kreisel": "0007", "Beruehrung": "Kreis/Kreis"}
|
||||
27;"ILS Weiche";"0027";"ILS Weiche :5";"F/8";1;"6533.60, 1885.99, 2000.00";"250.00, 100.00, 30.00";"";"";"";"";"";"0018, 0028";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0006", "Kreisel B": "0005", "Achse von Kreisel": "0006", "Beruehrung": "Kreis/Kreis"}
|
||||
28;"ILS Weiche";"0028";"ILS Weiche :6";"F/7";1;"6533.60, 1085.78, 2000.00";"250.00, 100.00, 30.00";"";"";"";"";"";"0017, 0016";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0005", "Kreisel B": "0004", "Achse von Kreisel": "0005", "Beruehrung": "Kreis/Kreis"}
|
||||
29;"ILS Weiche";"0029";"ILS Weiche :7";"E/3";1;"6136.36, -7203.05, 2000.00";"100.25, 250.10, 30.00";"";"";"";"";"";"0030, 0030";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0004", "Kreisel B": "0003", "Achse von Kreisel": "0004", "Beruehrung": "Kreis/Kreis"}
|
||||
30;"ILS Weiche";"0030";"ILS Weiche :8";"E/3";1;"5339.58, -7202.95, 2000.00";"100.19, 250.07, 30.00";"";"";"";"";"";"0015, 0014";"";"";"";{"Erzeugt aus": "Kreisel-Beruehrpunkt", "Kreisel A": "0003", "Kreisel B": "0002", "Achse von Kreisel": "0003", "Beruehrung": "Kreis/Kreis"}
|
||||
|
Can't render this file because it contains an unexpected character in line 2 and column 172.
|
@@ -0,0 +1,74 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Tests fuer tro_flow.link_tros - Uebergang durch eine Kreisel-Kreisel-Weiche.
|
||||
|
||||
Fixture: Testanlage test_system (dxfmakros results/export.csv) mit einem
|
||||
zusaetzlichen Separator 0022 auf Kreisel 0007. Kreisel 0009 hat nur einen
|
||||
eigenen Separator (0010 vor Weiche 0024 zu Kreisel 0001 mit der Entladung);
|
||||
in Kreisel 0009 gelangt man nur ueber Weiche 0023, die Separator 0011 auf
|
||||
Kreisel 0008 steuert. Die Kreiselketten kennen Weichen nicht als Glied - ohne
|
||||
eigene Weichenkante fehlte TRO(0011) -> TRO(0010), der Ausgang war vom
|
||||
Eingang aus unerreichbar und stattdessen zeigte TRO(0010) rueckwaerts auf
|
||||
TRO(0011).
|
||||
|
||||
TROs werden ueber ihre Separatoren angesprochen, nicht ueber die IDs (die
|
||||
haengen an der ID-Datei der Anlage).
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from material_flow import build_graph, read_elements
|
||||
from tro_flow import BOUNDARY_ENTRY, BOUNDARY_EXIT, analyse_tros
|
||||
|
||||
FIXTURES = Path(__file__).parent / "fixtures"
|
||||
|
||||
|
||||
def _analyse(name: str):
|
||||
path = FIXTURES / name
|
||||
elements = read_elements(path, [])
|
||||
graph = build_graph(elements, path.name, [])
|
||||
return analyse_tros(graph, elements)
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def analysis():
|
||||
return _analyse("test_system_sep22_export.csv")
|
||||
|
||||
|
||||
def _tro_mit_sep(analysis, sep_id: str) -> str:
|
||||
return next(t.tro_id for t in analysis.tros if sep_id in t.separators)
|
||||
|
||||
|
||||
def _erreichbar(edges, start: str) -> set[str]:
|
||||
nach: dict[str, list[str]] = {}
|
||||
for a, b in edges:
|
||||
nach.setdefault(a, []).append(b)
|
||||
seen, stack = {start}, [start]
|
||||
while stack:
|
||||
for nxt in nach.get(stack.pop(), []):
|
||||
if nxt not in seen:
|
||||
seen.add(nxt)
|
||||
stack.append(nxt)
|
||||
return seen
|
||||
|
||||
|
||||
def test_weiche_fuehrt_auf_partnerkreisel(analysis):
|
||||
von, nach = _tro_mit_sep(analysis, "0011"), _tro_mit_sep(analysis, "0010")
|
||||
assert (von, nach) in analysis.edges
|
||||
|
||||
|
||||
def test_keine_rueckwaertskante_ueber_die_weiche(analysis):
|
||||
von, nach = _tro_mit_sep(analysis, "0010"), _tro_mit_sep(analysis, "0011")
|
||||
assert (von, nach) not in analysis.edges
|
||||
|
||||
|
||||
def test_ausgang_vom_eingang_erreichbar(analysis):
|
||||
# Nicht fuer test_system_export.csv: dort fehlt auf Kreisel 0007 der
|
||||
# Separator vor der Weiche zu Kreisel 0008 (erst 0022 hier steuert sie) -
|
||||
# die Anlage ist dort physisch nicht durchgaengig.
|
||||
eingang = next(b.tro_id for b in analysis.boundaries if b.type_name == BOUNDARY_ENTRY)
|
||||
ausgang = next(b.tro_id for b in analysis.boundaries if b.type_name == BOUNDARY_EXIT)
|
||||
assert ausgang in _erreichbar(analysis.edges, eingang)
|
||||
Reference in New Issue
Block a user