Files
plant2dxf/doc/plant2dxf_doku.md
T

143 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Dokumentation: plant2dxf
## Übersicht
Das Skript `plant2dxf.py` dient dazu, aus einer RuleDesigner-CSV-Datei DXF-Elemente zu erzeugen. Es werden verschiedene Anlagenkomponenten anhand ihrer Typen (TeileArt) erkannt und als Blöcke in eine DXF-Zeichnung eingefügt. Je nach TeileArt werden die Elemente komplett neu erzeugt oder (teilweise) aus einer "Bibliotheks-dxf" kopiert. Die Konfiguration der Blöcke erfolgt über eine separate Konfigurationsdatei (`shapes.cfg`).
---
## Funktionsweise
1. **CSV-Einlesen:**
Das Skript liest eine CSV-Datei ein, in der für jede Anlagenkomponente u.a. Typ, ID, Planquadrat (Koordinaten) und optionale Merkmale angegeben sind.
2. **Konfiguration:**
Über die Datei `shapes.cfg` werden für jede TeileArt die zu verwendenden Blöcke, deren Offsets und Rotationen definiert.
3. **Blockplatzierung:**
Für jede Zeile der CSV wird anhand der TeileArt die passende Platzierungsroutine aufgerufen. Die Blöcke werden an die berechnete Position (transformiert ins DXF-Koordinatensystem) gesetzt. Je nach Teileart findet neben der Platzierung von Blöcken die Erzeugung zusätzlicher Elemente (z.B. Linien) statt.
4. **DXF-Ausgabe:**
Am Ende wird die generierte DXF-Datei unter dem Dateinamen der Eingabedatei gespeichert.
---
## Aufruf
```bash
python plant2dxf.py -f <input.csv> [-c <shapes.cfg>] [-l <bibliothek.dxf>] [-o <anlage.dxf>] [-v]
```
### Argumente
- `-f, --file`
**(erforderlich)** Pfad zur Eingabe-CSV-Datei.
- `-c, --config`
Pfad zur Konfigurationsdatei mit Blockdefinitionen (Standard: `shapes.cfg` im PROJECT_CFG-Verzeichnis).
- `-l, --lib`
Pfad zur DXF-Bibliothek mit Blockdefinitionen (Standard: `blocks.dxf` im PROJECT_DATA-Verzeichnis).
- `-o, --output`
Pfad zur Ausgabedatei (Standard: `<inputname>.dxf` im PROJECT_WORK-Verzeichnis).
- `-v, --verbose`
Zeigt zusätzliche Ausgaben an.
### Umgebungsvariablen
- `PROJECT_DATA` Verzeichnis für Bibliotheksdateien
- `PROJECT_WORK` Arbeitsverzeichnis (z.B. für CSV und Ausgabedateien)
- `PROJECT_CFG` Verzeichnis für Konfigurationsdateien
---
## Aufbau der CSV-Datei
Die CSV-Datei muss folgende Spalten enthalten:
- `TeileArt` Typ der Komponente (z.B. "ILS 2.0 Kreisel")
- `TeileId` Eindeutige ID der Komponente
- `Planquadrat` Koordinaten im Format `X:<Wert> Y:<Wert>` (Beachte: Koordinaten hier sind "Bildschirmkoordinaten", d.h. 0/0 in der linken oberen Ecke. Transformation auf Normalkoordinaten findet im Skript statt.)
- `Merkmale` (optional) JSON-String mit weiteren Eigenschaften
Beispiel:
```csv
TeileArt;TeileId;Planquadrat;Merkmale
ILS 2.0 Kreisel;K1;X:1000 Y:2000;{"Abstand (Kreiselachse A - Kreiselachse) in Meter": "20", "Drehung": "45"}
```
---
## Aufbau der shapes.cfg
Die Datei `shapes.cfg` definiert für jede TeileArt die zu verwendenden Blöcke aus der Bibliotheks-dxf und deren Eigenschaften. Über die Offsets bzw. die Rotationen können die Blockursprünge auf die tatsächlichen Platzierungskoordinaten angepasst werden. Die Keys (Überschriften) **müssen** exakt den Bezeichner "TeileArt" der Eingabe-dxf entsprechen!
### Beispiel
```ini
[ILS 2.0 Kreisel]
items = SP8, AN8
offset_symb1 = 0,0
offset_symb2 = 0,0
rot_symb1 = 0.0
rot_symb2 = 0.0
[ILS 2.0 Gefällestrecke]
items = EE DS, AE DS
offset_symb1 = 0,-330
offset_symb2 = 0,1000
rot_symb1 = 0.0
rot_symb2 = 0.0
```
#### Erklärung der Parameter
- **[TeileArt]**
Abschnittsname entspricht **exakt** dem Wert aus der CSV-Spalte `TeileArt`.
- **items**
Kommagetrennte Liste der Blocknamen, die für diese TeileArt verwendet werden.
- **offset_symbX**
Offset (in mm) für den X-ten Block relativ zur berechneten Position, Format: `x,y`.
- **rot_symbX**
Rotation (in Grad °) für den X-ten Block.
---
## Erweiterbarkeit
- Neue TeileArten können durch Hinzufügen eines neuen Abschnitts in `shapes.cfg` und ggf. einer neuen Handler-Funktion im Skript (`handle_<teileart>`) ergänzt werden.
- Die Handler-Funktion muss nach dem Schema `handle_<teileart>` benannt werden (Sonderzeichen werden ersetzt, siehe Funktion `normalize_func_name`).
---
## Beispielablauf
1. **CSV und Konfiguration vorbereiten**
2. **Skript mit passenden Parametern aufrufen**
3. **DXF-Datei wird im Zielverzeichnis erzeugt**
---
## Abhängigkeiten
- Python 3.x
- [ezdxf](https://ezdxf.mozman.at/) (DXF-Bibliothek)
- Standardbibliotheken: os, sys, csv, json, re, argparse, configparser, math, pathlib
- [pydantic](https://docs.pydantic.dev/latest/)(Klassenerstellung)
---
## Hinweise
- Die Blockbibliothek (`blocks.dxf`) ist optional, wird aber für komplexe Blöcke benötigt.
- Fehlerhafte oder fehlende Koordinaten/Merkmale werden übersprungen und als Warnung ausgegeben.
- Die Transformation der Koordinaten erfolgt so, dass (0,0) im DXF unten links ist.
---