9c8f84799c
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>
160 lines
8.0 KiB
INI
160 lines
8.0 KiB
INI
# ============================================================
|
|
# export.cfg - Konfiguration fuer Lisp/export.lsp UND lib/export_csv.py,
|
|
# lib/export_sivas.py (gemeinsame Blockname-Muster, siehe
|
|
# lib/export_blockpatterns.py)
|
|
#
|
|
# Format: INI-Style
|
|
# [ABSCHNITT]
|
|
# Key = Wert (einzelner Wert)
|
|
# Key = Wert1, Wert2, Wert3 (Musterliste fuer wcmatch/fnmatch, kommagetrennt)
|
|
#
|
|
# Zeilen mit # sind Kommentare. Leerzeilen werden ignoriert.
|
|
#
|
|
# pattern_kreisel/pattern_strecke sind fuer Lisp's Block-SAMMLUNG grob
|
|
# gehalten (nur "gehoert das ueberhaupt zum Export"). Die uebrigen
|
|
# pattern_eckrad/pattern_variofoerderer/pattern_gefaellestrecke/
|
|
# pattern_strecke_module-Keys sind Teilmengen davon fuer die feinere
|
|
# TeileArt-KLASSIFIKATION in Python (eigene Zeile je Teileart) -
|
|
# Aenderungen an Blocknamen bitte in beiden Stellen nachziehen.
|
|
#
|
|
# pattern_separator/pattern_scanner: eigenstaendige Sensor-Bloecke
|
|
# (Separator_SP/S-LP, Scanner - siehe ils-insert-sensor/mubea:build-separator-one).
|
|
# Werden von Lisp's Block-SAMMLUNG mitgesammelt (siehe export.lsp) und von
|
|
# export_csv.py als eigene TeileArt-Zeilen mit einer beim Export erzeugten
|
|
# laufenden ID ausgegeben (die Bloecke selbst haben KEIN ID-Attribut - anders
|
|
# als Kreisel/GF/VF -, daher keine ssg-id-generate-Persistenz). export_sivas.py
|
|
# schliesst dieselben Bloecke bewusst aus (siehe SEP_SCANNER_PATTERNS dort):
|
|
# ihre Stueckzahl wird im Sivas-Export bereits ueber die ANZAHL_SEPARATOR/
|
|
# ANZAHL_SCANNER-Attribute der zugehoerigen Kreisel/Gefaellestrecke/
|
|
# VarioFoerderer-Bloecke gezaehlt - ein zusaetzlicher eigener Eintrag wuerde
|
|
# doppelt zaehlen.
|
|
# ============================================================
|
|
|
|
[blockpattern]
|
|
pattern_kreisel= KR_*, KREISEL_*, ECKRAD_*
|
|
pattern_eckrad= ECKRAD_*
|
|
pattern_gerade= AP110*, AP_110*
|
|
pattern_strecke= Vario*, Staustrecke*, AUS_Element*, EIN_Element*, VF_*, GF_*
|
|
pattern_variofoerderer= VF_*
|
|
pattern_gefaellestrecke= GF_*
|
|
pattern_strecke_module= Vario*, Staustrecke*, AUS_Element*, EIN_Element*
|
|
pattern_separator= Separator_SP*, S-LP*
|
|
pattern_scanner= Scanner*
|
|
pattern_ks_subblocks= KS_EIN, KS_AUS, K1, K2, K3, K4
|
|
|
|
[python]
|
|
# Interpreter fuer die Export-Skripte (lib/export_csv.py, lib/export_sivas.py).
|
|
# Leer lassen = automatisch: DXFM_PYTHON (aus bin/setenv.bat) -> Projekt-venv
|
|
# <DXFMAKRO>/.venv/Scripts/python.exe -> py.exe -> python (PATH).
|
|
# Nur setzen, wenn ein bestimmter Interpreter erzwungen werden muss.
|
|
# Wichtig: NICHT auf %LOCALAPPDATA%\Microsoft\WindowsApps\python.exe zeigen -
|
|
# das ist nur der Microsoft-Store-Platzhalter (bricht mit Exitcode 49 ab und
|
|
# der Export erzeugt dann keine CSV). Solche Pfade werden ignoriert.
|
|
interpreter=
|
|
|
|
[Planquadrate]
|
|
section=Planquadrate_AN
|
|
|
|
# x_origin/y_origin (in m, DXF-Koordinate der Planquadrat-Ecke A/1 bzw. 1/1):
|
|
# Der Zeichnungsnullpunkt (0,0) liegt in der Regel NICHT in der Gebaeudeecke -
|
|
# Bauteile mit negativer x/y-Koordinate wuerden ohne Offset einen Planquadrat-
|
|
# Index <= 0 ergeben und damit ein leeres Label (z.B. "/" oder "A/") liefern.
|
|
# Leer lassen/weglassen = automatisch: der Ursprung wird bei jedem Export neu
|
|
# auf das jeweils am weitesten links (x_origin) bzw. am weitesten unten
|
|
# (y_origin) liegende Element der aktuellen Zeichnung gesetzt, damit gilt
|
|
# immer Index 1 = dieses Element. Nur explizit setzen, wenn ein fester
|
|
# Bezug zur realen Gebaeudeecke gebraucht wird (z.B. Vergleich ueber
|
|
# mehrere Exportlaeufe/Zeichnungen hinweg).
|
|
x_origin=
|
|
y_origin=
|
|
|
|
# hier kann man im csv Export aus den Koordinaten der Bauteile die Planquadrate berechnen lassen, in denen sie liegen
|
|
# Zählung ist numerisch oder Alphabetisch möglich, Schrittweite in m (z.B. 2m pro Spalte, 4m pro Zeile)
|
|
# liegt man im ersten Quadrat, ist diese A/1, oder 1/1 oder 1/A, je nach Formatierung. Die Zählung beginnt immer bei 1
|
|
[Planquadrate_NA]
|
|
# z.B. 1/A
|
|
x_step=2
|
|
x_description=numerisch # zahlen, von links nach rechts, 2m pro Spalte
|
|
y_step=4
|
|
y_description=alphabetisch # Buchstaben von unten nach oben, 4m pro Zeile
|
|
format= {x}/{y} # Formatierung der Planquadrate, {y} und {x} werden durch die berechneten gerundeten Werte der Objektkoordinaten ersetzt
|
|
|
|
[Planquadrate_AN]
|
|
# z.B. A/1 (x = Alphabetisch, y = Numerisch)
|
|
x_step=2
|
|
x_description=alphabetisch # Buchstaben, von links nach rechts, 2m pro Spalte
|
|
y_step=2
|
|
y_description=numerisch # Zahlen von unten nach oben, 2m pro Zeile
|
|
format= {x}/{y}
|
|
|
|
[Planquadrate_NN]
|
|
# z.B. 2/5
|
|
x_step=2
|
|
x_description=numerisch # Zahlen, von links nach rechts, 2m pro Spalte
|
|
y_step=4
|
|
y_description=numerisch # Zahlen von unten nach oben, 4m pro Zeile
|
|
format= {x}/{y}
|
|
|
|
[Nachbarschaft]
|
|
# Toleranz fuer die Nachbarschaftserkennung beim CSV-Export (Spalte "Nachbarn").
|
|
# Die Bounding-Box jedes Elements wird um die Haelfte dieses Werts nach allen
|
|
# Seiten erweitert, bevor auf Ueberschneidung mit anderen Elementen geprueft
|
|
# wird - zwei Elemente mit einem Abstand <= toleranz_mm (z.B. zwei Kreisel)
|
|
# gelten dann ebenfalls als benachbart. Wert in mm. Siehe lib/export_neighbors.py.
|
|
toleranz_mm=200
|
|
|
|
# Rastergroesse (mm) fuer die Omniflo-Nachbarschaftspruefung (Bogen/Weiche/
|
|
# 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
|
|
# protokolliert je Element die Bounding-Box, die Gruppenzuordnung und jeden
|
|
# Ueberschneidungstest - zur Diagnose, warum (keine) Nachbarn gefunden werden.
|
|
debug_log=1
|
|
|
|
[Boundingbox]
|
|
# Mindesthoehe (Z-Ausdehnung) der von export.lsp (csv:get-bbox, per
|
|
# vla-getboundingbox) ermittelten Bounding-Box. Flache 2D-Bloecke (Draufsicht)
|
|
# haben oft dz=0 - wird auf diesen Wert angehoben. Wert in mm. Default 1, falls
|
|
# nicht gesetzt.
|
|
bb_minimum_height_mm=1
|
|
|
|
[Kreisel]
|
|
# Kreisel-Durchmesser (Antriebs-/Spannstation AN8/SP8) in mm. Quelle der
|
|
# Wahrheit ist data/json/component_defaults.json ("kreisel"."durchmesser",
|
|
# Default 800.0) - hier fuer Python gespiegelt (Aenderungen bitte an beiden
|
|
# Stellen nachziehen, siehe Hinweis oben bei [blockpattern]).
|
|
#
|
|
# Wird von lib/export_neighbors.py (kreisel_half_bboxes) benutzt, um die
|
|
# Bounding-Box jedes Kreisels bei der Kollisionspruefung in eine linke und
|
|
# eine rechte Haelfte zu teilen: AN8 (Antriebsstation) liegt lokal bei
|
|
# (radius, 0), SP8 (Spannstation) bei (radius+abstand, 0) - siehe
|
|
# KreiselInsert.lsp::draw-module - radius = durchmesser_mm/2 (Default 400mm).
|
|
# Die gesamte Geometrie ist symmetrisch um die lokale X-Achse (Y=0, die
|
|
# Linie durch beide Stationsmitten) - genau diese Linie trennt links/rechts.
|
|
durchmesser_mm=800
|
|
|