Files
dxfmakros/cfg/export.cfg
T
m.stangl f6461aab0f [ADD] Kreisel-Split (links/rechts) bei Kollisionspruefung + Separator/Scanner-Zuordnung
- export_neighbors.py: kreisel_half_bboxes() teilt die Kreisel-BBox entlang
  der Achse durch Antriebs-/Spannstation (AN8/SP8) in eine linke und eine
  rechte Haelfte (je ca. 400mm breit, siehe [Kreisel] durchmesser_mm in
  cfg/export.cfg, gespiegelt von component_defaults.json). compute_neighbor_ids
  ersetzt jeden Kreisel-Eintrag in der Kollisionsgruppe durch dieses Paar
  (TeileId-L/-R) statt einer einzelnen BBox - Nachbarn einer Gefaellestrecke/
  eines Foerderers zeigen jetzt, welche Haelfte tatsaechlich beruehrt.
- compute_sensor_zuordnung(): ordnet jeden Separator/Scanner per BBox-
  Ueberschneidung seiner Gefaellestrecke, seinem Foerderer oder einer
  Kreiselhaelfte zu (Prioritaet in dieser Reihenfolge), ersetzt die
  ZUORDNUNG-Attribut-Merkmale im CSV-Export bei Treffer.
- compute_scanner_nearest_separator(): sucht zusaetzlich, unabhaengig von der
  Zuordnung, zu jedem Scanner den raeumlich naechstgelegenen Separator.
- ssg_id.lsp: ssg-id-collect-blocks erfasst jetzt auch Separator_SP/S-LP/
  Scanner-Bloecke, damit ssg-id-check-all ihr (neues) ID-Attribut vor jedem
  Export befuellt; export_csv.py bevorzugt dieses echte ID-Attribut als
  TeileId und faellt nur bei leerem Attribut auf eine laufende SEP-/SCN-
  Ersatznummer zurueck.
- data/ils/Scanner_2D.dwg, Scanner_3D.dwg, Separator_SP_2D.dwg: ID-ATTDEF
  ergaenzt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 11:21:16 +02:00

133 lines
6.4 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
[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). 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
# als die ueblichen Omniflo-Bauteile sein (AP110-Geraden ca. 2000mm).
omniflo_zellgroesse_mm=3000
# 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