[CHANGE] Omniflo-Nachbarschaft: STRtree-Broad-Phase + KOS-Verfeinerung (10mm); Gerade-K1/K2 im CSV-Export

Die Omniflo-Nachbarschaftserkennung (export_neighbors.py, nur EXPORTCSV) wird
zweistufig:
- Broad-Phase ueber shapely-STRtree auf den Bounding-Boxen (Fallback: das
  bisherige Raster, falls shapely fehlt).
- Narrow-Phase (KOS-Verfeinerung): zwei moegliche Nachbarn gelten nur dann als
  benachbart, wenn ein Anschluss-Koordinatensystem K1-K4 des einen naeher als
  omniflo_ks_toleranz_mm (neu, Default 10mm) an einem K-Punkt des anderen
  liegt. Das verwirft bloss ueberlappende BBoxen ohne echten Anschluss.
  Elemente ohne K1-K4 fallen auf reine BBox-Ueberschneidung zurueck.

Geraden fuehren keine echten K-Bloecke in der Zeichnung; ihre K1 (Anfang) /
K2 (Ende) werden beim Export aus Einfuegepunkt + Laenge + Rotation
synthetisiert (csv:gerade-k-kos-strings in export.lsp) und stehen damit in den
CSV-Spalten K1/K2 - wie echte KOS - und nehmen an der Kollisionspruefung teil.

Verifiziert an results/test-omnicollision: gerichtete Nachbarschaften 20 -> 14.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 16:56:10 +02:00
parent bd79e3d1b6
commit 9c8f84799c
5 changed files with 282 additions and 47 deletions
+21 -4
View File
@@ -104,13 +104,30 @@ format= {x}/{y}
toleranz_mm=200
# Rastergroesse (mm) fuer die Omniflo-Nachbarschaftspruefung (Bogen/Weiche/
# Gerade gegen Bogen/Weiche/Gerade). Omniflo-Elemente werden vor dem
# Ueberschneidungstest nach x/y-Koordinate in Quadranten dieser Groesse
# eingeteilt, geprueft wird dann nur innerhalb derselben und der 8
# angrenzenden Zellen (statt jedes Element gegen jedes). Sollte groesser
# Gerade gegen Bogen/Weiche/Gerade). Wird nur als FALLBACK verwendet, wenn
# shapely (STRtree) nicht verfuegbar ist - dann werden Omniflo-Elemente vor
# dem Ueberschneidungstest nach x/y-Koordinate in Quadranten dieser Groesse
# eingeteilt und nur innerhalb derselben und der 8 angrenzenden Zellen
# geprueft (statt jedes Element gegen jedes). Im Normalfall uebernimmt der
# STRtree die Broad-Phase, dieser Wert bleibt dann ungenutzt. Sollte groesser
# als die ueblichen Omniflo-Bauteile sein (AP110-Geraden ca. 2000mm).
omniflo_zellgroesse_mm=3000
# Toleranz (mm) fuer die KOS-basierte VERFEINERUNG der Omniflo-Nachbarschaft.
# Nachdem der STRtree zwei Omniflo-Elemente (Bogen/Weiche/Gerade) anhand ihrer
# Bounding-Boxen als moegliche Nachbarn erkannt hat, wird zusaetzlich geprueft,
# ob sich ihre Anschluss-Koordinatensysteme (K1-K4) tatsaechlich beruehren:
# nur wenn ein K-Punkt des einen Elements naeher als dieser Wert an einem
# K-Punkt des anderen liegt, gelten sie als echte Nachbarn. Das trennt
# Elemente, deren Bounding-Boxen sich zwar ueberlappen, die aber nicht an
# einem gemeinsamen Anschlusspunkt zusammenstossen. Bei Elementen ohne K1-K4
# (z.B. Altbestand) faellt die Pruefung auf die reine BBox-Ueberschneidung
# zurueck. 0 = Verfeinerung aus (nur BBox). Wert in mm. Siehe
# lib/export_neighbors.py. Geraden fuehren KEINE echten K-Bloecke in der
# Zeichnung; ihre K1 (Anfang) / K2 (Ende) werden beim Export aus der Geometrie
# synthetisiert (siehe csv:gerade-k-kos-strings in Lisp/export.lsp).
omniflo_ks_toleranz_mm=10
# Kollisions-/Nachbarschafts-Debugprotokoll: 0/leer = aus, 1 = schreibt eine
# .dbg-Datei nach DXFM_LOG/export_collision.dbg (bzw. <repo>/logs/, falls
# DXFM_LOG nicht gesetzt ist). Alternativ ein expliziter Dateipfad. Das Log