[FIX] Kreisel-Umlauf (export_neighbors.compute_kreisel_umlauf): AS/ES, deren ZZ_ASES_MARKER-Box keinen Kreisel trifft, ueber den Ein-/Auslaufpunkt der Strecke (K1 = KS_EIN, K2 = KS_AUS) zuordnen - laeuft eine Strecke parallel zum Kreisel, liegt der Marker (Einfuegepunkt) ~560 mm neben der Kette, der Einlauf aber darauf (Dematic VF_5 an Kreisel1 fehlte in den TrackIds); bereits zugeordnete AS/ES unveraendert + Tests; [ADD] dxf_anlage_export.py: Kreisel-Drehrichtung (DREHRICHTUNG) ins Testdaten-JSON; [CHANGE] dematic_arvato.json aus dem aktuellen Dematic_TST.dxf (Kreisel 1/4 GUZ, BTMT Be-/Entladung, Scanner vor Separator 0048)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 11:35:12 +02:00
parent 16a15bb83b
commit 8ef7324032
6 changed files with 185 additions and 60 deletions
+53
View File
@@ -485,3 +485,56 @@ class TestAsEsImKreiselUmlauf:
keys = [p[0] for p in umlauf["0001"]]
assert "0057" not in keys, (
"ES-Item weit ausserhalb der Kreiselbox wurde faelschlich erkannt")
def _trans(x, y, z=0.0):
"""Gegenstueck zu _decode_trans_xy (csv:trans-encode in export.lsp): drei
vorzeichenbehaftete 24-Bit-Fixed-Point-Werte (Faktor 10), je 4 Zeichen."""
from export_neighbors import _B64_CHARS
text = ""
for v in (x, y, z):
n = int(round(v * 10.0)) & 0xFFFFFF
text += "".join(_B64_CHARS[(n >> s) & 63] for s in (18, 12, 6, 0))
return text
def _strecke(teileid, k1_xy, k2_xy):
return {"teileart": "ILS 2.0 Strecke", "teileid": teileid,
"k1": _trans(*k1_xy), "k2": _trans(*k2_xy)}
class TestAsEsUeberEinlaufpunkt:
"""Dematic/Arvato VF_5 an Kreisel1 (Review 2026-10-08): die Strecke laeuft
PARALLEL zum Kreisel, der 90-Grad-Einlauf (KS_EIN) liegt darum quer zur
Kette - Marker (Einfuegepunkt) 557 mm neben der Kette, Einlauf nur 52 mm
davor. Kreisel entlang +Y, rechte Kette bei x = +400."""
def _kreisel_y(self):
return _kreisel("0001", 0.0, 0.0, 90.0, abstand=3619.0)
def test_marker_daneben_einlauf_auf_der_kette(self):
items = [self._kreisel_y(),
_separator("0043", 400.0, 1500.0),
_ases("ILS Ausschleuselement", "0071", 957.0, 2283.0, "0009"),
_strecke("0009", (348.0, 2283.0), (348.0, 9000.0))]
umlauf = compute_kreisel_umlauf(
items, tolerance_mm=200.0, durchmesser_mm=DURCHMESSER_MM)
punkte = {p[0]: p for p in umlauf["0001"]}
assert "0071" in punkte, "AS ueber den Einlaufpunkt nicht im Umlauf"
# nach dem Einlauf einsortiert, nicht nach dem Marker
assert len(umlauf["0001"]) == 2
def test_ohne_einlaufpunkt_bleibt_es_bei_der_marker_box(self):
items = [self._kreisel_y(),
_ases("ILS Ausschleuselement", "0071", 957.0, 2283.0, "0009")]
umlauf = compute_kreisel_umlauf(
items, tolerance_mm=200.0, durchmesser_mm=DURCHMESSER_MM)
assert "0071" not in [p[0] for p in umlauf["0001"]]
def test_einlauf_weit_weg_wird_nicht_zugeordnet(self):
items = [self._kreisel_y(),
_ases("ILS Ausschleuselement", "0071", 957.0, 2283.0, "0009"),
_strecke("0009", (5000.0, 2283.0), (9000.0, 2283.0))]
umlauf = compute_kreisel_umlauf(
items, tolerance_mm=200.0, durchmesser_mm=DURCHMESSER_MM)
assert "0071" not in [p[0] for p in umlauf["0001"]]