[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:
@@ -17,7 +17,7 @@ Je Wrapper (Felder wie in tests/testdata/object_data.md bzw. mubea.json):
|
||||
|
||||
KREISEL_n -> Kreisel ("function": "insert", x/y/z = Einfuegepunkt,
|
||||
abstand = Mittenabstand AN8-SP8 aus der Blockdefinition,
|
||||
rotation, typ = KREISELART)
|
||||
rotation, typ = KREISELART, drehrichtung = DREHRICHTUNG)
|
||||
GF_n -> Gefaellestrecke Modus 1 (XDATA SSG_GF_EDIT wie
|
||||
gf-xdata-lesen + SEITE_AS/SEITE_ES wie GEFAELLESTRECKE_EDIT).
|
||||
Endet die Strecke auf der Kette eines Kreisels, wird statt
|
||||
@@ -210,6 +210,10 @@ def kreisel_eintrag(e, block_inhalt, projekt):
|
||||
("abstand", _r(abstand)),
|
||||
("rotation", _r(e["rot"])),
|
||||
("typ", a.get("KREISELART") or "STANDARD"),
|
||||
# Umlaufsinn: bestimmt die Reihenfolge im Kreisel-Umlauf und damit den
|
||||
# TRO-Fluss - ohne ihn kam jeder Nachbau als UZS heraus (Dematic 1/4:
|
||||
# GUZ). hundm05:bau-kreisel reicht ihn an kreisel-insert-script weiter.
|
||||
("drehrichtung", a.get("DREHRICHTUNG") or "UZS"),
|
||||
("comment", "aus Zeichnung: %s (ID %s), abstand aus %s"
|
||||
% (e["name"], a.get("ID", "?"), quelle)),
|
||||
])
|
||||
|
||||
@@ -1287,6 +1287,11 @@ def compute_kreisel_umlauf(items, tolerance_mm, durchmesser_mm=800.0,
|
||||
|
||||
punkte_je_kreisel = {tid: [] for tid in kreisel}
|
||||
|
||||
# Ein-/Auslaufpunkt je Strecke (K1 = KS_EIN des AS, K2 = KS_AUS des ES),
|
||||
# fuer AS/ES, deren Marker-Box keinen Kreisel trifft (siehe unten).
|
||||
strecken_kos = {it.get("teileid", ""): _asel_kos_xy(it)
|
||||
for it in items if it.get("teileart", "") in GF_VF_TEILEARTEN}
|
||||
|
||||
for item in items:
|
||||
if item.get("teileart", "") not in KREISEL_UMLAUF_TEILEARTEN:
|
||||
continue
|
||||
@@ -1305,6 +1310,31 @@ def compute_kreisel_umlauf(items, tolerance_mm, durchmesser_mm=800.0,
|
||||
(teileid, bbox.get("cx", 0.0), bbox.get("cy", 0.0)))
|
||||
matched_tid = tid
|
||||
break
|
||||
# Rueckfall fuer AS/ES: der ZZ_ASES_MARKER sitzt auf dem EINFUEGEPUNKT
|
||||
# des Elements, der Kreisel beruehrt aber dessen Ein-/Auslauf (KS_EIN/
|
||||
# KS_AUS). Ein 90-Grad-Element hat den Einlauf ~610 mm seitlich - laeuft
|
||||
# die Strecke quer vom Kreisel weg, liegt dieser Versatz entlang der
|
||||
# Kette und der Marker trotzdem darauf; laeuft sie PARALLEL zum
|
||||
# Kreisel, liegt er quer dazu und der Marker ~560 mm daneben (Dematic/
|
||||
# Arvato VF_5 an Kreisel1: Marker 557 mm, Einlauf 52 mm von der Kette,
|
||||
# Review 2026-10-08). Nur wenn die Marker-Box nichts trifft - bereits
|
||||
# zugeordnete AS/ES behalten Position und Reihenfolge.
|
||||
if matched_tid is None and item.get("teileart", "") in (
|
||||
AUSSCHLEUS_TEILEART, EINSCHLEUS_TEILEART):
|
||||
k1_xy, k2_xy = strecken_kos.get(item.get("_zuordnung", ""), (None, None))
|
||||
pt = k1_xy if item.get("teileart", "") == AUSSCHLEUS_TEILEART else k2_xy
|
||||
if pt is not None:
|
||||
pt_bounds = _bounds({"cx": pt[0], "cy": pt[1], "dx": 0.0, "dy": 0.0},
|
||||
half_tol)
|
||||
for tid, kb in kreisel_bounds.items():
|
||||
if _overlaps(pt_bounds, kb):
|
||||
punkte_je_kreisel[tid].append((teileid, pt[0], pt[1]))
|
||||
matched_tid = tid
|
||||
if dbg:
|
||||
dbg(f" Umlauf-Kandidat {teileid!r}: Marker-Box ohne "
|
||||
f"Kreisel, Ein-/Auslauf ({pt[0]:.0f},{pt[1]:.0f}) "
|
||||
f"liegt auf Kreisel {tid}")
|
||||
break
|
||||
if dbg:
|
||||
if matched_tid is not None:
|
||||
dbg(f" Umlauf-Kandidat {teileid!r} ({item.get('teileart', '')!r}) "
|
||||
|
||||
Reference in New Issue
Block a user