Files
dxfmakros/doc/tools.md
T

427 lines
15 KiB
Markdown

Diese Werkzeuge ermöglichen die massenhafte Aufbereitung von einzelnen dxf Dateien mit Omniflo Bögen und Weichen. Sie setzen automatisiert die Einfügepunkte, die Koordinatensysteme und die Attribugte der jeweiligen Datei korrekt. Anwendbarauf 2D und 3D Dateien, wenn in 3D die 2D Kurven als Skelett enthalten sind.
- [set\_einfuegepunkt](#set_einfuegepunkt)
- [Aufruf](#aufruf)
- [Datenquellen](#datenquellen)
- [Ablauf](#ablauf)
- [Schalter](#schalter)
- [--boegen](#--boegen)
- [--weichen45](#--weichen45)
- [--weichen90](#--weichen90)
- [--weichenkoerper](#--weichenkoerper)
- [--weichen-parallel](#--weichen-parallel)
- [--delta](#--delta)
- [--dreifachweiche](#--dreifachweiche)
- [--sternweiche](#--sternweiche)
- [--number SIVASNR](#--number-sivasnr)
- [--show-omniflo](#--show-omniflo)
- [Abdeckung](#abdeckung)
- [Uebersicht aller Schalter](#uebersicht-aller-schalter)
- [Umgebungsvariablen](#umgebungsvariablen)
- [set\_koords](#set_koords)
- [Aufruf](#aufruf-1)
- [Datenquellen](#datenquellen-1)
- [Ablauf](#ablauf-1)
- [Schalter](#schalter-1)
- [--k1set](#--k1set)
- [--k2set](#--k2set)
- [--k3set](#--k3set)
- [--k4set](#--k4set)
- [--set-all](#--set-all)
- [--force](#--force)
- [--show-omniflo](#--show-omniflo-1)
- [--test](#--test)
- [--number SIVASNR](#--number-sivasnr-1)
- [Uebersicht K-Zuordnung](#uebersicht-k-zuordnung)
- [Umgebungsvariablen](#umgebungsvariablen-1)
- [set\_attributs](#set_attributs)
- [Aufruf](#aufruf-2)
- [Datenquellen](#datenquellen-2)
- [Ablauf](#ablauf-2)
- [Konfiguration (attradd.cfg)](#konfiguration-attraddcfg)
- [Attribute Omniflo Kurve (Bogen)](#attribute-omniflo-kurve-bogen)
- [Attribute Omniflo Weiche](#attribute-omniflo-weiche)
- [CSV-Export-Felder (Merkmale)](#csv-export-felder-merkmale)
- [Schalter](#schalter-2)
- [--number SIVASNR / -n SIVASNR](#--number-sivasnr---n-sivasnr)
- [--dry-run / -d](#--dry-run---d)
- [Umgebungsvariablen](#umgebungsvariablen-2)
# set_einfuegepunkt
Setzt den Einfuegepunkt (`$INSBASE`) von Omniflo DXF-Dateien anhand geometrischer Kriterien an die richtige Stelle
## Aufruf
```
bin\set_einfuegepunkt.bat [--schalter] [--number SIVASNR]
```
Das Batch-Skript ruft `setenv.bat` auf und startet `lib/set_einfuegepkt.py` mit den uebergebenen Argumenten.
## Datenquellen
| Pfad | Inhalt |
|---|---|
| `data/json/omniflo_boegen.json` | Liste aller Boegen mit Sivasnr, ProfilTyp, Radius, KurvenWinkel etc. |
| `data/json/omniflo_weichen.json` | Liste aller Weichen mit Sivasnr, ProfilTyp, WeichenTyp, KurvenWinkel etc. |
| `data/omniflo/*.dxf` | Die DXF-Quelldateien (je Sivasnr eine Datei) |
Die JSON-Dateien liefern die IDs (Sivasnr) und Metadaten zur Filterung. Die DXF-Dateien enthalten die Geometrie (Linien, Boegen), aus der der Einfuegepunkt berechnet wird.
## Ablauf
1. JSON-Datei einlesen und nach Schalter-Kriterien filtern
2. Fuer jede gefilterte Sivasnr die DXF-Datei aus `data/omniflo/` laden
3. Einfuegepunkt gemaess Typ-Kriterium geometrisch berechnen
4. `$INSBASE` im DXF-Header setzen und Datei nach `results/` speichern
## Schalter
### --boegen
Alle Eintraege aus `omniflo_boegen.json` (27 Items, KurvenWinkel 22.5/45/67.5/90/180).
**Kriterium:** Schnittpunkt der Tangenten am Anfangs- und Endpunkt der Bogenkurve. Bei 180-Grad-Boegen wird der Mittelpunkt zwischen Start und Ende verwendet.
Hier die Bögen:
![Boegen](images/einfuegepunkte-boegen.png).
### --weichen45
Einzel-, Doppel- und Dreiwegeweichen mit KurvenWinkel 45 (32 Items).
**Kriterium:** Schnittpunkt der laengsten vertikalen Linie mit der Tangente am oberen Bogenpunkt. Bei mehreren Boegen wird der mit dem hoechsten Y-Wert gewaehlt.
### --weichen90
Einzel-, Doppel- und Dreiwegeweichen mit KurvenWinkel 90 (24 Items).
**Kriterium:** Wie `--weichen45`.
### --weichenkoerper
Alle Weichen mit KurvenWinkel 22.5 (8 Items: Einzel-/Doppel-/Dreiwegeweiche).
**Kriterium:** Schnittpunkt der laengsten Diagonale mit der laengsten vertikalen Linie (Konvergenzpunkt aller Linien).
### --weichen-parallel
Einzel-, Doppel- und Dreiwegeweichen mit KurvenWinkel 0, ohne Sternweiche (8 Items).
**Kriterium:** Wie `--weichenkoerper`.
### --delta
Deltaweichen (1 Item).
**Kriterium:** Mittelpunkt der laengsten horizontalen Linie.
### --dreifachweiche
Dreifachweichen (6 Items).
**Kriterium:** Mittelpunkt der laengsten horizontalen Linie.
### --sternweiche
Sternweiche (1 Item).
**Kriterium:** Zentrum, berechnet als Mittelpunkt der laengsten horizontalen Linie (entspricht dem Schnittpunkt der horizontalen und vertikalen Mittelachse).
### --number SIVASNR
Optionaler Filter: nur die angegebene 9-stellige Sivasnr verarbeiten. Kombinierbar mit jedem Typ-Schalter.
### --show-omniflo
Erzeugt eine Uebersichts-DXF (`results/omniflo_uebersicht.dxf`) mit allen Omniflo-Elementen. Die Elemente werden in Reihen nach Typ gruppiert angezeigt. Jedes Element erhaelt:
- Den Dateinamen als Beschriftung oberhalb
- Ein rotes Kreuz am Einfuegepunkt
Hier die Weichen
![Weichen](images/einfuegepunkte-weichen.png).
Hier die erzeugte [dxf Datei der Einfügepunkte als Beispiel](dxf/omniflo_uebersicht.dxf) des letzte Laufs
## Abdeckung
Alle 107 Items (27 Boegen + 80 Weichen) sind exklusiv genau einem Schalter zugeordnet. Keine Ueberlappungen, keine Luecken.
## Uebersicht aller Schalter
| Schalter | Items | WeichenTyp | KurvenWinkel | Einfuegepunkt-Kriterium |
| --- | --- | --- | --- | --- |
| `--boegen` | 27 | - | 22.5, 45, 67.5, 90, 180 | Tangentenschnittpunkt am Bogen (180: Mittelpunkt) |
| `--weichen45` | 32 | Einzel-, Doppel-, Dreiwegeweiche | 45 | Tangente oberer Bogenpunkt x laengste Vertikale |
| `--weichen90` | 24 | Einzel-, Doppel-, Dreiwegeweiche | 90 | Tangente oberer Bogenpunkt x laengste Vertikale |
| `--weichenkoerper` | 8 | Einzel-, Doppel-, Dreiwegeweiche | 22.5 | Laengste Diagonale x laengste Vertikale |
| `--weichen-parallel` | 8 | Einzel-, Doppel-, Dreiwegeweiche | 0 | Laengste Diagonale x laengste Vertikale |
| `--dreifachweiche` | 6 | Dreifachweiche | 90 | Mittelpunkt laengste Horizontale |
| `--delta` | 1 | Deltaweiche | 90 | Mittelpunkt laengste Horizontale |
| `--sternweiche` | 1 | Sternweiche | 0 | Zentrum (Mittelpunkt laengste Horizontale) |
| **Gesamt** | **107** | | | |
## Umgebungsvariablen
Werden durch `bin/setenv.bat` gesetzt:
| Variable | Verwendung |
|---|---|
| `DXFM_DATA` | Pfad zu `data/` (JSON + DXF Quelldateien) |
| `DXFM_RESULTS` | Pfad zu `results/` (Ausgabe) |
---
# set_koords
Setzt Koordinatensystem-Bloecke (K1, K2, K3, K4) in Omniflo DXF-Dateien. Jeder Block enthaelt drei Linien vom Ursprung: rot (X-Achse, Laenge 1), gruen (Y-Achse, Laenge 2), blau (Z-Achse, Laenge 3).
## Aufruf
```
python lib/set_koords.py [--schalter] [--number SIVASNR] [--force]
```
## Datenquellen
| Pfad | Inhalt |
|---|---|
| `data/json/omniflo_boegen.json` | Liste aller Boegen mit Sivasnr, ProfilTyp etc. |
| `data/json/omniflo_weichen.json` | Liste aller Weichen mit Sivasnr, ProfilTyp etc. |
| `data/omniflo/*.dxf` / `results/*.dxf` | DXF-Quelldateien (bevorzugt aus results/, Fallback data/omniflo/) |
## Ablauf
1. JSON-Daten und SWITCH_FILTERS (aus utils.py) laden
2. Fuer jede gefilterte Sivasnr die DXF-Datei laden
3. Kx-Position geometrisch berechnen (abhaengig von Typ und Schalter)
4. Block-Referenz mit korrekter Rotation einfuegen und DXF nach `results/` speichern
## Schalter
### --k1set
K1 an alle Boegen und Weichen setzen.
- **Boegen:** Beginn der obersten horizontalen Linie. x rechts, y oben, z aus Zeichenebene (rz=0).
- **Weichen:** Beginn der untersten vertikalen Linie. x oben, y links, z aus Zeichenebene (rz=90).
### --k2set
K2 an alle Boegen und Weichen setzen (linker Bogenzweig). Nutzt dieselben SWITCH_FILTERS wie set_einfuegepkt.py.
- **Boegen:** Position am anderen Ende der Kette (Gerade-Bogen-Gerade). x tangential zur Linie, zur Bogenmitte zeigend. 180-Grad-Sonderfall: rz=0.
- **Weichen (weichen45, weichen90, weichen_parallel):** Folgt dem Bogenzweig bis zum Ende. x tangential, bei Doppelweichen: linker Zweig.
- **Weichenkoerper:** Ende der linken langen Diagonale.
- **Dreifach-/Delta-/Sternweiche:** Linkes Ende der laengsten horizontalen Linie.
### --k3set
K3 an Weichen mit 2+ Boegen setzen (rechter Zweig). Gleiche Logik wie K2, aber rechter Ast (groesstes x). Nur bei: Doppelweichen, Dreiwegeweichen, Dreifachweiche, Delta, Stern, Weichenkoerper Doppel/Dreiwege.
### --k4set
K4 an Weichen setzen (oberes Ende der K1-Linie). Rotation wie K1 (rz=90). Kein K4 bei: Boegen, Doppelweiche, Dreifachweiche, Deltaweiche.
### --set-all
Alle Koordinatensysteme (K1-K4) in einem Durchgang setzen.
### --force
Bestehende Kx ueberschreiben (sonst skip wenn vorhanden). Duplikate werden immer bereinigt (letztes bleibt).
### --show-omniflo
Erzeugt eine Uebersichts-DXF (`results/koords_uebersicht.dxf`) mit allen Omniflo-Elementen und farbigen Kreuzen an den K-Positionen:
| Koordinatensystem | Farbe |
|---|---|
| K1 | rot |
| K2 | orange |
| K3 | gelb |
| K4 | gruen |
So sehen in der Übersicht die Markierungen von K1 bis K4 aus:![Markierungen über K1, .. K4](images/omniflo-setkoords1.png)
Hier eine Übersicht wie die gesamte Datei aussieht
![Übersicht](images/omniflo-setkoords2.png)
Hier die erzeugte [dxf Datei mit den Koordinatensystemen](dxf/koords_uebersicht.dxf) als Beispiel des letzte Laufs
### --test
Erzeugt Testdatei (`results/ks_test.dxf`) mit 4 Koordinatensystemen und verifiziert das Ruecklesen.
### --number SIVASNR
Nur die angegebene 9-stellige Sivasnr verarbeiten. Kombinierbar mit jedem Schalter.
## Uebersicht K-Zuordnung
| K | Boegen | Weichen | Weichenkoerper | Dreifach/Delta/Stern |
| --- | --- | --- | --- | --- |
| K1 | Oberste H-Linie (rz=0) | Unterste V-Linie (rz=90) | Unterste V-Linie (rz=90) | Unterste V-Linie (rz=90) |
| K2 | Anderes Kettenende | Linker Bogenzweig | Linke Diagonale | Linkes H-Linienende |
| K3 | - | Rechter Bogenzweig (2+ Boegen) | Rechte Diagonale (2+ Diag.) | Rechtes H-Linienende |
| K4 | - | Oberes K1-Linienende | Oberes K1-Linienende | Sternweiche: ja |
## Umgebungsvariablen
| Variable | Verwendung |
|---|---|
| `DXFM_DATA` | Pfad zu `data/` (JSON + DXF Quelldateien) |
| `DXFM_RESULTS` | Pfad zu `results/` (Ausgabe) |
---
# set_attributs
Fuegt Attribute (ATTDEF) zu allen Omniflo DXF-Dateien hinzu und verpackt die
gesamte Geometrie in eine benannte Blockdefinition. Die Attribut-Tags und deren
Werte werden ueber eine Konfigurationsdatei gesteuert.
**Voraussetzung:** Die Quelldateien in `data/omniflo/` sollten zuvor durch
`set_einfuegepkt.py` verarbeitet worden sein, damit `$INSBASE` korrekt gesetzt ist.
## Aufruf
```
python lib/set_attributs.py [--number SIVASNR] [--dry-run]
```
## Datenquellen
| Pfad | Inhalt |
|---|---|
| `cfg/attradd.cfg` | Attribut-Konfiguration (Tags und Quellfelder je Elementtyp) |
| `data/json/omniflo_boegen.json` | Liste aller Boegen mit Metadaten |
| `data/json/omniflo_weichen.json` | Liste aller Weichen mit Metadaten |
| `data/omniflo/*.dxf` | DXF-Quelldateien (Basis: Ausgabe von `set_einfuegepkt.py`) |
## Ablauf
1. Konfiguration aus `cfg/attradd.cfg` lesen
2. JSON-Daten laden und Lookup-Tabelle (Sivasnr -> Typ + Eintrag) erstellen
3. Fuer jede Sivasnr die DXF-Datei oeffnen, bestehende ATTDEFs entfernen
4. Neue ATTDEFs gemaess Config einfuegen (Layer `ATTRIB`, unterhalb der Geometrie)
5. Alle Entities (Geometrie + ATTDEFs) in eine Blockdefinition verschieben:
- Blockname = Sivasnummer (identisch mit dem Dateinamen ohne `.dxf`)
- Basispunkt der Blockdefinition = `$INSBASE` aus dem DXF-Header
6. Im Modelspace einen INSERT auf den neuen Block einfuegen, mit ATTRIB-Entities
befuellt aus den ATTDEF-Standardwerten (ermoeglicht Attributanzeige per Klick in BricsCAD)
7. Ergebnis nach `results/omniflo/` speichern
## Ausgabestruktur (DXF)
```
BLOCKS
BLOCK "<sivasnr>" (Basispunkt = $INSBASE)
<Geometrie-Entities>
ATTDEF BESCHR = "..."
ATTDEF ARTINR = "..."
...
ENDBLK
ENTITIES (Modelspace)
INSERT "<sivasnr>" at (0, 0)
ATTRIB BESCHR = "..."
ATTRIB ARTINR = "..."
...
SEQEND
```
Der INSERT im Modelspace traegt die konkreten Attributwerte und ist in BricsCAD
per Klick editierbar. Die Blockdefinition mit ATTDEFs dient als Vorlage fuer
den Block-Import via `import_element_as_block` (omniflo_utils.py).
## Konfiguration (attradd.cfg)
Die Config-Datei ist im INI-Format mit Abschnitten je Elementtyp.
Quellwerte koennen sein:
- **JSON-Feldname** (z.B. `ProfilTyp`) - Wert wird aus dem JSON-Eintrag gelesen
- **Fester Text** in Anfuehrungszeichen (z.B. `"Omniflo Kurve"`)
- **Platzhalter** `{sivasnr}` - wird durch die Sivasnr ersetzt
### Attribute Omniflo Kurve (Bogen)
| ATTDEF-Tag | Quelle | Beschreibung |
| --- | --- | --- |
| `BESCHR` | `ProfilTyp` | Profilbezeichnung aus JSON |
| `ARTINR` | `Sivasnr` | Sivas-Artikelnummer |
| `TEILEART` | `"Omniflo Kurve"` | Fester Typname |
| `RADIUS` | `Radius` | Kurvenradius in mm |
| `WINKEL` | `KurvenWinkel` | Kurvenwinkel in Grad |
| `SIVASNR_TEF` | `SivasnrTEF` | Sivas-Nr. des TEF-Antriebs (leer = kein Antrieb) |
| `LAYER` | *(aus [layer])* | Layer-Name gemaess Kategorisierung |
### Attribute Omniflo Weiche
| ATTDEF-Tag | Quelle | Beschreibung |
| --- | --- | --- |
| `BESCHR` | `ProfilTyp` | Profilbezeichnung aus JSON |
| `ARTINR` | `Sivasnr` | Sivas-Artikelnummer |
| `TEILEART` | `"Omniflo Weiche"` | Fester Typname |
| `WEICHENTYP` | `WeichenTyp` | Weichentyp (Einzelweiche, Doppelweiche, Dreiwegeweiche, ...) |
| `WINKEL` | `KurvenWinkel` | Kurvenwinkel in Grad |
| `RICHTUNG` | `KurvenRichtung` | Richtungskennung (1=Links, 2=Rechts, 3=Beide, 7=Dreiweg) |
| `SIVASNR_TEF` | `SivasnrTEF` | Sivas-Nr. des TEF-Antriebs (leer = kein Antrieb) |
| `LAYER` | *(aus [layer])* | Layer-Name gemaess Kategorisierung |
### CSV-Export-Felder (Merkmale)
Die Attribute werden beim CSV-Export (`export_csv.py`, aufgerufen ueber `c:EXPORTCSV`) wie folgt in CSV-Merkmale ueberfuehrt.
CSV-Format: `Elementnummer;TeileArt;TeileId;Bezeichnung;Anzahl;Merkmale`
**Omniflo Kurve:**
| Merkmal | Quelle | Typ |
| --- | --- | --- |
| `Kurvenwinkel` | JSON `KurvenWinkel` | float |
| `Radius` | JSON `Radius` | float |
| `Höhe` | Attribut `HOEHE` / Z-Koordinate | string |
| `Drehung` | Attribut `DREHUNG` / CAD-Rotation | float |
| `SivasNummer` | JSON `Sivasnr` | string |
**Omniflo Weiche:**
| Merkmal | Quelle | Typ |
| --- | --- | --- |
| `Weichentyp` | JSON `WeichenTyp` | string |
| `Richtung` | JSON `KurvenRichtung` | string |
| `Weichenwinkel` | JSON `KurvenWinkel` | float |
| `Höhe` | Attribut `HOEHE` / Z-Koordinate | string |
| `Drehung` | Attribut `DREHUNG` / CAD-Rotation | float |
| `Antrieb Kurve` | `SivasnrTEF` != null | bool |
| `SivasNummer` | JSON `Sivasnr` | string |
Höhe und Drehung werden beim Export selbst aus den Blockinformationen entnommen und dann ins json geschrieben.
| ATTDEF-Tag | Quelle | Beschreibung |
| --- | --- | --- |
| `HOEHE` | `"2000"` | Montagehoehe in mm (wird beim Export aus Z-Koordinate aktualisiert) |
| `DREHUNG` | `"0"` | Drehwinkel in Grad (wird beim Export aus CAD-Rotation aktualisiert) |
## Schalter
### --number SIVASNR / -n SIVASNR
Nur die angegebene Sivasnr verarbeiten.
### --dry-run / -d
Nur anzeigen welche Attribute gesetzt wuerden, ohne DXF-Dateien zu schreiben.
## Umgebungsvariablen
| Variable | Verwendung |
|---|---|
| `DXFM_DATA` | Pfad zu `data/` (JSON + DXF Quelldateien) |
| `DXFM_CFG` | Pfad zu `cfg/` (attradd.cfg) |
| `DXFM_RESULTS` | Pfad zu `results/` (Ausgabe nach `results/omniflo/`) |
Alle drei haben Fallback auf relative Pfade vom Projektverzeichnis.