[FIX] Export: ZUORDNUNG-Attribut vor BBox-Suche bei Separator/Scanner
Separatoren an einer Kreisel-Kreisel-Weiche ragen mit Toleranz in die Box beider Kreisel; compute_kreisel_umlauf/compute_sensor_zuordnung nahmen den ersten Treffer (test_system: Separator 0018 an Kreisel 0006 statt 0005, 0015 an 0003 statt 0002). Das ZUORDNUNG-Attribut aus count_sep_scan hat jetzt Vorrang, sofern es einen vorhandenen Carrier nennt; die Haelfte L/R wird weiter per BBox bestimmt, ohne Attribut bleibt die BBox-Suche. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -538,3 +538,51 @@ class TestAsEsUeberEinlaufpunkt:
|
||||
umlauf = compute_kreisel_umlauf(
|
||||
items, tolerance_mm=200.0, durchmesser_mm=DURCHMESSER_MM)
|
||||
assert "0071" not in [p[0] for p in umlauf["0001"]]
|
||||
|
||||
|
||||
class TestZuordnungAttributVorBBox:
|
||||
"""Realer Fall test_system, Separator 0018: er sitzt an der Kreisel-
|
||||
Kreisel-Weiche zweier Kreisel und ragt mit Toleranz in die Box BEIDER.
|
||||
Die BBox-Suche nahm den ersten Kreisel in der Item-Liste (den falschen);
|
||||
das ZUORDNUNG-Attribut aus der Zeichnung (cs-zuordnung-lauf) nennt den
|
||||
richtigen und hat Vorrang."""
|
||||
|
||||
def _anlage(self, attr):
|
||||
# Kreisel 0006 senkrecht (Achse +Y), AN8-Mitte bei (0, 400);
|
||||
# Kreisel 0005 waagerecht (Achse +X), AN8-Mitte bei (0, -400):
|
||||
# AN8/AN8 beruehren sich bei (0, 0). Separator auf der Oberkante von
|
||||
# Kreisel 0005, 615 mm rechts der Weiche.
|
||||
k6 = _kreisel("0006", 0.0, 0.0, 90.0, abstand=2000.0)
|
||||
k5 = _kreisel("0005", -400.0, -400.0, 0.0, abstand=8000.0)
|
||||
sep = _separator("0018", 615.0, 0.0)
|
||||
sep["_zuordnung_attr"] = attr
|
||||
sep["merkmale"] = {}
|
||||
return [sep, k6, k5]
|
||||
|
||||
def test_umlauf_folgt_attribut(self):
|
||||
items = self._anlage("0005")
|
||||
umlauf = compute_kreisel_umlauf(items, tolerance_mm=200.0,
|
||||
durchmesser_mm=DURCHMESSER_MM)
|
||||
assert "0018" in [p[0] for p in umlauf["0005"]]
|
||||
assert "0018" not in [p[0] for p in umlauf["0006"]]
|
||||
|
||||
def test_ohne_attribut_bbox_rueckfall(self):
|
||||
items = self._anlage("")
|
||||
umlauf = compute_kreisel_umlauf(items, tolerance_mm=200.0,
|
||||
durchmesser_mm=DURCHMESSER_MM)
|
||||
alle = [p[0] for pts in umlauf.values() for p in pts]
|
||||
assert alle.count("0018") == 1
|
||||
|
||||
def test_sensor_zuordnung_folgt_attribut(self):
|
||||
from export_neighbors import compute_sensor_zuordnung
|
||||
items = self._anlage("0005")
|
||||
zuo = compute_sensor_zuordnung(items, 200.0,
|
||||
kreisel_durchmesser_mm=DURCHMESSER_MM)
|
||||
assert zuo[0].startswith("0005")
|
||||
|
||||
def test_unbekanntes_attribut_bbox_rueckfall(self):
|
||||
from export_neighbors import compute_sensor_zuordnung
|
||||
items = self._anlage("9999")
|
||||
zuo = compute_sensor_zuordnung(items, 200.0,
|
||||
kreisel_durchmesser_mm=DURCHMESSER_MM)
|
||||
assert zuo[0] != "9999" and zuo[0] != "nicht zugeordnet"
|
||||
|
||||
Reference in New Issue
Block a user