Integration der Funktionalität des Python Skripts in ein Lisp Skript, um den Umweg über DXF zu vermeiden und direkt in der Zeichnung arbeiten zu können
This commit is contained in:
@@ -1,145 +1,26 @@
|
||||
# DRT-Verbindungszähler - DXF-Analyse-Tool
|
||||
# Verbindungsanalyse für DRT-Gerüst
|
||||
|
||||
Ein Python-basiertes Werkzeug zur automatischen Erkennung und Markierung von Schnittpunkten zwischen Linien in DXF-Dateien.
|
||||
Dieses Projekt analysiert Liniennetzwerke auf spezifizierten Layern in DWG/DXF-Zeichnungen. Damit lassen sich in der Angebotsphase die Anzahl und Arten der notwendigen Gerüstverbinder einfach und schnell aus einer vorhandenen Zeichnung ableiten.
|
||||
Verbindungspunkte werden klassifiziert in:
|
||||
|
||||
## Überblick
|
||||
- Kreuzungen
|
||||
- T-Verbindungen
|
||||
- Eckverbindungen
|
||||
|
||||
Dieses Projekt analysiert DXF-Dateien und identifiziert Verbindungs- bzw. Schnittpunkte zwischen Linien auf verschiedenen Layern. Die gefundenen Schnittpunkte werden mit Kreisen markiert und in einer separaten DXF-Datei sowie einem Textbericht ausgegeben.
|
||||
## Implementierungen
|
||||
|
||||
## Projektstruktur
|
||||
### Python-Version
|
||||
|
||||
```text
|
||||
verbindungszaehler/
|
||||
├── verbindungszaehler.bat # Hauptskript zum Starten der Analyse
|
||||
├── config/
|
||||
│ └── config.cfg # Standardkonfiguration
|
||||
├── scripts/
|
||||
│ └── setenv.bat # Umgebungsvariablen und Verzeichnisstruktur
|
||||
├── src/
|
||||
│ └── lib/
|
||||
│ ├── analyze.py # Python-Analyseskript
|
||||
│ └── dxf_analyzer.py # Kernlogik
|
||||
├── input/ # Eingabeverzeichnis für DXF-Dateien
|
||||
└── output/ # Ausgabeverzeichnis für Ergebnisse
|
||||
```
|
||||
- Offline Analyse
|
||||
- Batch-Verarbeitung von DXF-Dateien
|
||||
- Export von Ergebnis-DXFs + Reports
|
||||
|
||||
## Voraussetzungen
|
||||
### LISP-Version (BricsCAD / AutoCAD)
|
||||
|
||||
- Windows-Betriebssystem
|
||||
- Python 3.x installiert und im PATH verfügbar
|
||||
- Python-Bibliothek für DXF-Verarbeitung `ezdxf`
|
||||
- Modul `dxf_analyzer.py` mit der Klasse `IntersectionAnalyzer`
|
||||
- Direkte Analyse in BricsCAD durch Aufruf des Makros
|
||||
- Keine DXF-Exporte notwendig
|
||||
- Visualisierung der Verbindungen zur Sichtkontrolle direkt in der Zeichnung
|
||||
|
||||
## Installation
|
||||
## Gemeinsames Ziel
|
||||
|
||||
1. Projekt in ein beliebiges Verzeichnis entpacken
|
||||
2. Sicherstellen, dass Python installiert ist
|
||||
3. Benötigte Python-Pakete installieren (z.B. `pip install ezdxf`)
|
||||
4. DXF-Dateien im `input/`-Verzeichnis ablegen
|
||||
|
||||
## Verwendung
|
||||
|
||||
### Methode 1: Alle Dateien im Input-Verzeichnis analysieren
|
||||
|
||||
Doppelklick auf `verbindungszaehler.bat` oder per Kommandozeile:
|
||||
|
||||
```batch
|
||||
verbindungszaehler.bat
|
||||
```
|
||||
|
||||
Alle DXF-Dateien im `input/`-Verzeichnis werden automatisch mit den Einstellungen aus `config.cfg` analysiert.
|
||||
|
||||
### Methode 2: Einzelne Datei per Drag & Drop
|
||||
|
||||
Ziehen Sie eine DXF-Datei direkt auf die `verbindungszaehler.bat` und lassen Sie sie los. Die Datei wird sofort mit den Einstellungen aus `config/config.cfg` analysiert.
|
||||
|
||||
### Methode 3: Einzelne Datei per Kommandozeile
|
||||
|
||||
```batch
|
||||
verbindungszaehler.bat "C:\Pfad\zur\datei.dxf"
|
||||
```
|
||||
|
||||
## Konfiguration
|
||||
|
||||
### config.cfg
|
||||
|
||||
Die Datei `config.example.cfg` enthält alle Einstellungen für die Analyse. Für individuelle Parameter muss eine Kopie von `config.example.cfg` erstellt und in `config.cfg` umbenannt werden. Diese dient nun als Konfigurationsdatei des Projekts.
|
||||
Passen Sie diese Werte in `config.cfg` nach Bedarf an:
|
||||
|
||||
```cfg
|
||||
LAYERS=D-1,D-5
|
||||
TOLERANCE=0.06
|
||||
MARK_RADIUS=150
|
||||
```
|
||||
|
||||
**Parameter-Erklärung:**
|
||||
|
||||
- **LAYERS**: Kommagetrennte Liste der zu analysierenden Layer (z.B. "D-1,D-5,D-3")
|
||||
- **TOLERANCE**: Maximaler Abstand in DXF-Einheiten, bei dem zwei Punkte als identisch gelten (für ungenaue Zeichnungen)
|
||||
- **MARK_RADIUS**: Radius der Kreise in DXF-Einheiten, die Schnittpunkte markieren
|
||||
|
||||
**Hinweis:** Nach Änderungen in `config.cfg` werden die neuen Werte bei der nächsten Ausführung automatisch verwendet.
|
||||
|
||||
## Ausgabe
|
||||
|
||||
Das Tool erzeugt für jede analysierte DXF-Datei zwei Dateien im `output/`-Verzeichnis:
|
||||
|
||||
1. **[Dateiname]_markiert_[Datum]_[Zeit].dxf**
|
||||
DXF-Datei mit eingezeichneten Kreisen an allen gefundenen Schnittpunkten
|
||||
|
||||
2. **[Dateiname]_analyse_[Datum]_[Zeit].txt**
|
||||
Textbericht mit Details zu den gefundenen Verbindungen (Koordinaten, Anzahl, etc.)
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
```text
|
||||
zeichnung_markiert_20241202_14-30-25.dxf
|
||||
zeichnung_analyse_20241202_14-30-25.txt
|
||||
```
|
||||
|
||||
## Funktionsweise
|
||||
|
||||
1. **setenv.bat** richtet die Verzeichnisstruktur ein und lädt die Konfigurationswerte aus `config.cfg` im `config/`-Ordner
|
||||
2. **verbindungszaehler.bat** verarbeitet die angegebene Datei (oder alle Dateien im Input-Ordner) und ruft das Python-Skript auf
|
||||
3. **analyze.py** lädt die DXF-Datei und übergibt sie zusammen mit den Konfigurationsparametern an den `IntersectionAnalyzer`
|
||||
4. Der Analyzer findet Schnittpunkte zwischen Linien auf den angegebenen Layern innerhalb der definierten Toleranz
|
||||
5. Gefundene Schnittpunkte werden mit Kreisen (Radius aus `MARK_RADIUS`) markiert
|
||||
6. Ergebnisse werden als neue DXF-Datei und Textbericht gespeichert
|
||||
|
||||
## Workflow-Beispiel
|
||||
|
||||
1. DXF-Dateien in den `input/`-Ordner kopieren
|
||||
2. `config.cfg` im `config/`-Ordner öffnen und gewünschte Layer-Namen, Toleranz und Markierungsradius eintragen
|
||||
3. `verbindungszaehler.bat` per Doppelklick starten **oder** eine einzelne DXF-Datei auf die Batch-Datei ziehen
|
||||
4. Ergebnisse im `output/`-Ordner überprüfen: **Bevor die Anzahl der Verbindungen weiter verwendet wird, sind die markierten Punkte im Ausgabelayout zwingend auf Fehler zu überprüfen!**
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Stellen Sie sicher, dass die Layer-Namen in `config.cfg` exakt mit denen in der DXF-Datei übereinstimmen (Groß-/Kleinschreibung beachten)
|
||||
- Bei sehr großen Dateien kann die Analyse einige Zeit in Anspruch nehmen
|
||||
- Die Toleranz sollte an die Genauigkeit Ihrer Zeichnungen angepasst werden (typische Werte: 0.01 bis 0.1)
|
||||
- Der Markierungsradius sollte groß genug sein, um in der Zeichnung sichtbar zu sein, aber klein genug, um Details nicht zu verdecken
|
||||
- Ausgabedateien werden nicht überschrieben, da jede Datei einen eindeutigen Zeitstempel erhält
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
##### "Datei nicht gefunden"
|
||||
|
||||
Überprüfen Sie den Pfad zur DXF-Datei oder legen Sie Dateien im `input/`-Verzeichnis ab.
|
||||
|
||||
##### "Keine Schnittpunkte gefunden"
|
||||
|
||||
- Prüfen Sie, ob die in `config.cfg` angegebenen Layer in der DXF-Datei existieren
|
||||
- Erhöhen Sie den TOLERANCE-Wert in `config.cfg`, falls Linien nicht exakt verbunden sind
|
||||
|
||||
##### Python-Fehler
|
||||
|
||||
Stellen Sie sicher, dass alle erforderlichen Python-Bibliotheken installiert sind.
|
||||
|
||||
##### Drag & Drop funktioniert nicht
|
||||
|
||||
Stellen Sie sicher, dass Sie die Datei auf `verbindungszaehler.bat` (nicht auf `setenv.bat`) ziehen.
|
||||
|
||||
## Autor
|
||||
|
||||
Simon Hensch
|
||||
Beide Implementierungen nutzen dieselbe geometrische Logik zur Klassifikation von Linienverbindungen.
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
# VZAEHLER — Verbindungszähler für BricsCAD
|
||||
|
||||
Automatische Erkennung und Klassifikation von Linienschnittpunkten auf definierten Layern.
|
||||
|
||||
---
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- BricsCAD mit LISP-Unterstützung
|
||||
- Zeichnung mit Linien (`LINE`) auf den zu prüfenden Layern
|
||||
- Skriptdatei: `verbindungszaehler.lsp`
|
||||
|
||||
> **Wichtig:** Es werden ausschließlich Verbindungspunkte erkannt, die auf der selben Z-Koordinate liegen.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
Skript laden:
|
||||
|
||||
```lisp
|
||||
(load "R:/pfad/zur/verbindungszaehler.lsp")
|
||||
```
|
||||
|
||||
Oder über die AutoCAD/BricsCAD Befehlszeile:
|
||||
|
||||
```
|
||||
APPLOAD → Datei auswählen → Laden
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verwendung
|
||||
|
||||
Befehl in der Befehlszeile eingeben:
|
||||
|
||||
```
|
||||
VZAEHLER
|
||||
```
|
||||
|
||||
### Eingabeaufforderungen
|
||||
|
||||
| Eingabe | Beschreibung | Default |
|
||||
|---|---|---|
|
||||
| Layer | Kommagetrennte Liste der zu prüfenden Layer | `D-1, D-5` |
|
||||
| Toleranz | Maximaler Abstand in Zeichnungseinheiten für Toleranzverbindungen | `0.50` |
|
||||
|
||||
Bei einfachem `Return` wird jeweils der Defaultwert verwendet.
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
```
|
||||
===== VERBINDUNGSZAEHLER =====
|
||||
Layer (kommagetrennt) [D-1, D-5]: D-1, D-3
|
||||
Toleranz [0.50]:
|
||||
Layer : D-1 D-3
|
||||
Toleranz : 0.50
|
||||
------------------------------
|
||||
Linien gefunden: 42
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verbindungstypen
|
||||
|
||||
Das Skript unterscheidet drei Typen:
|
||||
|
||||
| Typ | Beschreibung | Erkennungslogik | Layer | Farbe |
|
||||
|---|---|---|---|---|
|
||||
| **Kreuzung** | Zwei Linien kreuzen sich, Schnittpunkt liegt im Inneren beider Linien | Nur echter geometrischer Schnitt, toleranzunabhängig | `D-KREUZUNG` | Rot (1) |
|
||||
| **T-Verbindung** | Ein Endpunkt liegt auf dem Inneren der anderen Linie | Toleranzbasiert | `D-T_VERBINDUNG` | Grün (3) |
|
||||
| **Eckverbindung** | Zwei Endpunkte berühren sich | Toleranzbasiert | `D-ECKVERBINDUNG` | Gelb (5) |
|
||||
|
||||
> **Wichtig:** Kreuzungen werden ausschließlich über echten geometrischen Schnitt erkannt — niemals über Toleranz. T-Verbindungen und Eckverbindungen werden niemals als Kreuzung klassifiziert, auch wenn sich die verlängerten Linien schneiden würden.
|
||||
|
||||
---
|
||||
|
||||
## Ergebnis in der Zeichnung
|
||||
|
||||
An jedem erkannten Verbindungspunkt wird ein Kreis (Radius 100 Einheiten) auf dem jeweiligen Ergebnislayer gezeichnet. Die Layer werden automatisch angelegt falls sie noch nicht existieren.
|
||||
|
||||
---
|
||||
|
||||
## Ausgabedatei
|
||||
|
||||
Nach der Auswertung wird automatisch eine Textdatei im Verzeichnis der Zeichnung erstellt:
|
||||
|
||||
```
|
||||
<Zeichnungsname>_<YYYYMMDD-HHMMSS>_vzaehler.txt
|
||||
```
|
||||
|
||||
**Beispiel:** `meinplan_20260507-143211_vzaehler.txt`
|
||||
|
||||
### Inhalt der Ausgabedatei
|
||||
|
||||
```
|
||||
================================================
|
||||
VERBINDUNGSZAEHLER - ERGEBNIS
|
||||
================================================
|
||||
|
||||
Datum/Zeit : 07.05.2026 14:32:11
|
||||
Zeichnung : R:\projekte\meinplan.dwg
|
||||
Layer : D-1, D-5
|
||||
|
||||
------------------------------------------------
|
||||
VERBINDUNGSTYPEN
|
||||
------------------------------------------------
|
||||
|
||||
Kreuzungen : 3
|
||||
T-Verbindungen : 8
|
||||
Eckverbindungen : 12
|
||||
|
||||
------------------------------------------------
|
||||
SUMMEN
|
||||
------------------------------------------------
|
||||
|
||||
Kreuzungen : 3
|
||||
Kontaktpunkte (T + Eck) : 20
|
||||
davon T-Verbindungen : 8
|
||||
davon Eckverbindungen : 12
|
||||
|
||||
GESAMT : 23
|
||||
|
||||
================================================
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Toleranz — Hinweise
|
||||
|
||||
Die Toleranz wirkt **ausschließlich** auf T-Verbindungen und Eckverbindungen:
|
||||
|
||||
- Zu **klein**: Echte Verbindungen werden nicht erkannt (z.B. bei minimal versetzten Endpunkten durch Zeichenungenauigkeit)
|
||||
- Zu **groß**: Linien die sich nicht berühren werden fälschlich als verbunden gezählt
|
||||
- Empfehlung: Toleranz an die Zeichnungsgenauigkeit anpassen, typisch `0.1` bis `1.0` Zeichnungseinheiten (mm bei metrischer Konfiguration)
|
||||
|
||||
---
|
||||
|
||||
## Bekannte Einschränkungen
|
||||
|
||||
- Es werden nur Objekte vom Typ `LINE` ausgewertet — keine Polylinien, Bögen oder Splines
|
||||
- Die Auswertung erfolgt in 2D (XY-Ebene), Z-Koordinaten werden ignoriert
|
||||
- Bei sehr großen Zeichnungen (1000+ Linien) kann die Laufzeit spürbar steigen, da alle Linienpaare gegeneinander geprüft werden (O(n²))
|
||||
@@ -0,0 +1,587 @@
|
||||
(vl-load-com)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; SAFE UTIL
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun safe-num (x)
|
||||
(if (numberp x) x 0.0)
|
||||
)
|
||||
|
||||
(defun safe-vec (v)
|
||||
(cond
|
||||
((and (listp v) (>= (length v) 2))
|
||||
(list (safe-num (car v)) (safe-num (cadr v))))
|
||||
((listp v)
|
||||
'(0.0 0.0))
|
||||
(T '(0.0 0.0))
|
||||
)
|
||||
)
|
||||
|
||||
(defun clean-point (p)
|
||||
(if (and p (listp p))
|
||||
(list
|
||||
(safe-num (car p))
|
||||
(safe-num (cadr p))
|
||||
)
|
||||
'(0.0 0.0)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; LAYER MANAGEMENT
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun ensure-layer (name color / doc layers layerObj)
|
||||
|
||||
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
|
||||
(setq layers (vla-get-Layers doc))
|
||||
|
||||
(if (not (tblsearch "LAYER" name))
|
||||
(setq layerObj (vla-add layers name))
|
||||
(setq layerObj (vla-item layers name))
|
||||
)
|
||||
|
||||
(vla-put-Color layerObj color)
|
||||
layerObj
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; GEOMETRY CORE
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun point-distance (a b)
|
||||
(sqrt
|
||||
(+ (expt (- (car a) (car b)) 2)
|
||||
(expt (- (cadr a) (cadr b)) 2)))
|
||||
)
|
||||
|
||||
(defun vec-sub (a b)
|
||||
(setq a (safe-vec a))
|
||||
(setq b (safe-vec b))
|
||||
(list (- (car a) (car b))
|
||||
(- (cadr a) (cadr b)))
|
||||
)
|
||||
|
||||
(defun point-distance-segment (p a b / ap ab denom t-val proj)
|
||||
(setq p (safe-vec p))
|
||||
(setq a (safe-vec a))
|
||||
(setq b (safe-vec b))
|
||||
(setq ap (vec-sub p a))
|
||||
(setq ab (vec-sub b a))
|
||||
;; GUARD: ab muss eine Liste mit 2 Zahlen sein
|
||||
(if (not (and (listp ab)
|
||||
(= (length ab) 2)
|
||||
(numberp (car ab))
|
||||
(numberp (cadr ab))))
|
||||
(point-distance p a) ;; Fallback
|
||||
(progn
|
||||
(setq denom (+ (* (car ab) (car ab))
|
||||
(* (cadr ab) (cadr ab))))
|
||||
(if (<= denom 1e-12)
|
||||
(point-distance p a)
|
||||
(progn
|
||||
(setq t-val (/ (+ (* (car ap) (car ab))
|
||||
(* (cadr ap) (cadr ab)))
|
||||
denom))
|
||||
(setq t-val (safe-num t-val))
|
||||
(if (< t-val 0.0) (setq t-val 0.0))
|
||||
(if (> t-val 1.0) (setq t-val 1.0))
|
||||
(setq proj (list (+ (car a) (* t-val (car ab)))
|
||||
(+ (cadr a) (* t-val (cadr ab)))))
|
||||
(point-distance p proj)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; Liegt ein Punkt strikt zwischen den Endpunkten einer Linie?
|
||||
;; (nicht am Endpunkt, mit kleiner Toleranz für numerischen Drift)
|
||||
(defun point-on-segment-interior (pt a b tol / t-val ab ap denom)
|
||||
(setq ab (vec-sub b a))
|
||||
(setq ap (vec-sub pt a))
|
||||
(setq denom (+ (* (car ab) (car ab)) (* (cadr ab) (cadr ab))))
|
||||
(if (<= denom 1e-12)
|
||||
nil
|
||||
(progn
|
||||
(setq t-val (/ (+ (* (car ap) (car ab)) (* (cadr ap) (cadr ab))) denom))
|
||||
;; "innen" = klar weg von beiden Endpunkten
|
||||
(and (> t-val (/ tol (sqrt denom)))
|
||||
(< t-val (- 1.0 (/ tol (sqrt denom)))))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Endpunkt-zu-Endpunkt Prüfung (Stoß-Erkennung)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun endpoints-touch-raw (l1 l2 tol / p1 p2 p3 p4)
|
||||
;; Rohpunkte direkt aus der Linienliste (clean-point bereits angewendet)
|
||||
(setq p1 (clean-point (car l1)))
|
||||
(setq p2 (clean-point (cadr l1)))
|
||||
(setq p3 (clean-point (car l2)))
|
||||
(setq p4 (clean-point (cadr l2)))
|
||||
(cond
|
||||
((< (point-distance p1 p3) tol) p1)
|
||||
((< (point-distance p1 p4) tol) p1)
|
||||
((< (point-distance p2 p3) tol) p2)
|
||||
((< (point-distance p2 p4) tol) p2)
|
||||
(T nil)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; INTERSECTION CORE (SAFE + TOLERANT)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun intersect-lines (l1 l2 / o1 o2 result arr)
|
||||
|
||||
(setq o1 (vlax-ename->vla-object (caddr l1)))
|
||||
(setq o2 (vlax-ename->vla-object (caddr l2)))
|
||||
|
||||
(setq result
|
||||
(vl-catch-all-apply
|
||||
'vla-IntersectWith
|
||||
(list o1 o2 0)
|
||||
)
|
||||
)
|
||||
|
||||
(if (vl-catch-all-error-p result)
|
||||
nil
|
||||
(progn
|
||||
|
||||
(setq result
|
||||
(vl-catch-all-apply 'vlax-variant-value (list result))
|
||||
)
|
||||
|
||||
(if (vl-catch-all-error-p result)
|
||||
(setq result (vla-IntersectWith o1 o2 0))
|
||||
)
|
||||
|
||||
(setq arr
|
||||
(vl-catch-all-apply 'vlax-safearray->list (list result))
|
||||
)
|
||||
|
||||
(if (vl-catch-all-error-p arr)
|
||||
nil
|
||||
(if (>= (length arr) 3)
|
||||
(list (nth 0 arr) (nth 1 arr) 0.0)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; PIPELINE INTERSECTION (MAIN BRAIN)
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
;; normalize-point ersatzlos streichen
|
||||
|
||||
(defun find-intersection (l1 l2 tol / p1 p2 p3 p4 ip touch-pt)
|
||||
(if (not (and (listp l1) (listp (car l1))
|
||||
(listp l2) (listp (car l2))))
|
||||
nil
|
||||
(progn
|
||||
(setq p1 (clean-point (car l1)))
|
||||
(setq p2 (clean-point (cadr l1)))
|
||||
(setq p3 (clean-point (car l2)))
|
||||
(setq p4 (clean-point (cadr l2)))
|
||||
|
||||
;; Schritt 1: Endpunkt-Stoß
|
||||
(setq touch-pt (endpoints-touch-raw l1 l2 tol))
|
||||
(if touch-pt
|
||||
(cons touch-pt (classify-intersection touch-pt l1 l2 tol))
|
||||
|
||||
;; Schritt 2: Echter Schnitt
|
||||
(progn
|
||||
(setq ip (intersect-lines l1 l2))
|
||||
(if ip
|
||||
(progn
|
||||
;; Sicherheitsnetz: liegt SP nahe einem Endpunkt?
|
||||
(if (or (< (point-distance ip p1) tol)
|
||||
(< (point-distance ip p2) tol)
|
||||
(< (point-distance ip p3) tol)
|
||||
(< (point-distance ip p4) tol))
|
||||
(cons ip (classify-intersection ip l1 l2 tol))
|
||||
(if (and (point-on-segment-interior ip p1 p2 tol)
|
||||
(point-on-segment-interior ip p3 p4 tol))
|
||||
(cons ip "Kreuzung")
|
||||
(cons ip (classify-intersection ip l1 l2 tol))
|
||||
)
|
||||
)
|
||||
)
|
||||
;; Schritt 3: Toleranz-Fallback
|
||||
(cond
|
||||
((< (point-distance-segment p1 p3 p4) tol)
|
||||
(cons p1 (classify-intersection p1 l1 l2 tol)))
|
||||
((< (point-distance-segment p2 p3 p4) tol)
|
||||
(cons p2 (classify-intersection p2 l1 l2 tol)))
|
||||
((< (point-distance-segment p3 p1 p2) tol)
|
||||
(cons p3 (classify-intersection p3 l1 l2 tol)))
|
||||
((< (point-distance-segment p4 p1 p2) tol)
|
||||
(cons p4 (classify-intersection p4 l1 l2 tol)))
|
||||
(T nil)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; CLASSIFICATION
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun is-endpoint (pt line tol)
|
||||
(or
|
||||
(< (point-distance pt (car line)) tol)
|
||||
(< (point-distance pt (cadr line)) tol)
|
||||
)
|
||||
)
|
||||
|
||||
(defun classify-intersection (pt l1 l2 tol / e1 e2)
|
||||
|
||||
(setq e1 (is-endpoint pt l1 tol))
|
||||
(setq e2 (is-endpoint pt l2 tol))
|
||||
|
||||
(cond
|
||||
((and e1 e2) "Eckverbindung")
|
||||
((or e1 e2) "T-Verbindung")
|
||||
(T "Kreuzung")
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; DEDUP
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun point-exists (pt list tol)
|
||||
(vl-some
|
||||
'(lambda (p)
|
||||
(< (point-distance pt p) tol)
|
||||
)
|
||||
list
|
||||
)
|
||||
)
|
||||
|
||||
(defun count-by-type (lst typ)
|
||||
(length
|
||||
(vl-remove-if-not
|
||||
'(lambda (p) (= (caddr p) typ))
|
||||
lst
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; DRAW
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun create-circle (pt radius layer)
|
||||
(entmakex
|
||||
(list
|
||||
'(0 . "CIRCLE")
|
||||
(cons 8 layer)
|
||||
(cons 10 pt)
|
||||
(cons 40 radius)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; INPUT
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun get-lines-by-layer (layers / ss i ent obj lines)
|
||||
|
||||
(setq lines '())
|
||||
|
||||
(foreach lay layers
|
||||
(setq ss
|
||||
(ssget "_X"
|
||||
(list '(0 . "LINE") (cons 8 lay))
|
||||
)
|
||||
)
|
||||
|
||||
(if ss
|
||||
(progn
|
||||
(setq i 0)
|
||||
(repeat (sslength ss)
|
||||
|
||||
(setq ent (ssname ss i))
|
||||
(setq obj (vlax-ename->vla-object ent))
|
||||
|
||||
(setq lines
|
||||
(cons
|
||||
(list
|
||||
(clean-point (vlax-get obj 'StartPoint))
|
||||
(clean-point (vlax-get obj 'EndPoint))
|
||||
ent
|
||||
)
|
||||
lines
|
||||
)
|
||||
)
|
||||
|
||||
(setq i (1+ i))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
lines
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; TEXTDATEI-EXPORT
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun write-report (all-pts filepath layers / f n-kr n-tv n-ek n-kontakt n-gesamt)
|
||||
(setq n-kr (count-by-type all-pts "Kreuzung"))
|
||||
(setq n-tv (count-by-type all-pts "T-Verbindung"))
|
||||
(setq n-ek (count-by-type all-pts "Eckverbindung"))
|
||||
(setq n-kontakt (+ n-tv n-ek))
|
||||
(setq n-gesamt (length all-pts))
|
||||
|
||||
(setq f (open filepath "w"))
|
||||
(if (not f)
|
||||
(prompt (strcat "\nFehler: Datei konnte nicht erstellt werden: " filepath))
|
||||
(progn
|
||||
(write-line "================================================" f)
|
||||
(write-line " VERBINDUNGSZAEHLER - ERGEBNIS" f)
|
||||
(write-line "================================================" f)
|
||||
(write-line "" f)
|
||||
(write-line (strcat " Datum/Zeit : " (menucmd "M=$(edtime,$(getvar,DATE),DD.MM.YYYY HH:MM:SS)")) f)
|
||||
(write-line (strcat " Zeichnung : " (vla-get-FullName (vla-get-ActiveDocument (vlax-get-acad-object)))) f)
|
||||
;; Layer-Zeile im Report dynamisch:
|
||||
(write-line
|
||||
(strcat " Layer : "
|
||||
(apply 'strcat
|
||||
(cons (car layers)
|
||||
(mapcar '(lambda (l) (strcat ", " l)) (cdr layers))
|
||||
)
|
||||
)
|
||||
)
|
||||
f
|
||||
)
|
||||
(write-line "" f)
|
||||
(write-line "------------------------------------------------" f)
|
||||
(write-line " VERBINDUNGSTYPEN" f)
|
||||
(write-line "------------------------------------------------" f)
|
||||
(write-line "" f)
|
||||
(write-line (strcat " Kreuzungen : " (itoa n-kr)) f)
|
||||
(write-line (strcat " T-Verbindungen : " (itoa n-tv)) f)
|
||||
(write-line (strcat " Eckverbindungen : " (itoa n-ek)) f)
|
||||
(write-line "" f)
|
||||
(write-line "------------------------------------------------" f)
|
||||
(write-line " SUMMEN" f)
|
||||
(write-line "------------------------------------------------" f)
|
||||
(write-line "" f)
|
||||
(write-line (strcat " Kreuzungen : " (itoa n-kr)) f)
|
||||
(write-line (strcat " Kontaktpunkte (T + Eck) : " (itoa n-kontakt)) f)
|
||||
(write-line (strcat " davon T-Verbindungen : " (itoa n-tv)) f)
|
||||
(write-line (strcat " davon Eckverbindungen : " (itoa n-ek)) f)
|
||||
(write-line "" f)
|
||||
(write-line (strcat " GESAMT : " (itoa n-gesamt)) f)
|
||||
(write-line "" f)
|
||||
(write-line "================================================" f)
|
||||
(close f)
|
||||
(prompt (strcat "\nBericht gespeichert: " filepath))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; INPUT MIT DEFAULTS
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun prompt-layers (default-layers / input parts result)
|
||||
;; default-layers ist eine Liste z.B. '("D-1" "D-5")
|
||||
(setq input
|
||||
(getstring
|
||||
(strcat "\nLayer (kommagetrennt) ["
|
||||
(apply 'strcat
|
||||
(cons (car default-layers)
|
||||
(mapcar '(lambda (l) (strcat ", " l)) (cdr default-layers))
|
||||
)
|
||||
)
|
||||
"]: ")
|
||||
)
|
||||
)
|
||||
(if (= input "")
|
||||
default-layers
|
||||
;; Eingabe splitten an Komma, Whitespace trimmen
|
||||
(progn
|
||||
;; einfaches Splitten: Zeichen für Zeichen
|
||||
(setq parts (split-string-by input ","))
|
||||
(foreach p parts
|
||||
(setq p (string-trim p))
|
||||
(if (/= p "")
|
||||
(setq result (cons p result))
|
||||
)
|
||||
)
|
||||
(reverse result)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(defun prompt-tolerance (default-tol / input val)
|
||||
(setq input
|
||||
(getstring
|
||||
(strcat "\nToleranz [" (rtos default-tol 2 2) "]: ")
|
||||
)
|
||||
)
|
||||
(if (= input "")
|
||||
default-tol
|
||||
(progn
|
||||
(setq val (atof input))
|
||||
(if (> val 0.0)
|
||||
val
|
||||
(progn
|
||||
(prompt (strcat "\nUngueltige Toleranz, verwende Default: " (rtos default-tol 2 2)))
|
||||
default-tol
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; Hilfsfunktion: String an Trennzeichen splitten
|
||||
(defun split-string-by (str sep / result current i ch)
|
||||
(setq result '())
|
||||
(setq current "")
|
||||
(setq i 0)
|
||||
(while (< i (strlen str))
|
||||
(setq ch (substr str (1+ i) 1))
|
||||
(if (= ch sep)
|
||||
(progn
|
||||
(setq result (cons current result))
|
||||
(setq current "")
|
||||
)
|
||||
(setq current (strcat current ch))
|
||||
)
|
||||
(setq i (1+ i))
|
||||
)
|
||||
;; letztes Segment
|
||||
(setq result (cons current result))
|
||||
(reverse result)
|
||||
)
|
||||
|
||||
;; Hilfsfunktion: führende/nachfolgende Leerzeichen entfernen
|
||||
(defun string-trim (str / i j)
|
||||
(setq i 1)
|
||||
(setq j (strlen str))
|
||||
(while (and (<= i j) (= (substr str i 1) " "))
|
||||
(setq i (1+ i))
|
||||
)
|
||||
(while (and (>= j i) (= (substr str j 1) " "))
|
||||
(setq j (1- j))
|
||||
)
|
||||
(if (> j (1- i))
|
||||
(substr str i (- (1+ j) i))
|
||||
""
|
||||
)
|
||||
)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; MAIN COMMAND
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun c:VZAEHLER (/ layers tol radius lines i j l1 l2 pt typ all-pts result report-path)
|
||||
|
||||
;; ── Defaults ────────────────────────────────────────────
|
||||
(setq default-layers '("D-1" "D-5"))
|
||||
(setq default-tol 0.5)
|
||||
|
||||
;; ── Benutzereingabe ──────────────────────────────────────
|
||||
(prompt "\n===== VERBINDUNGSZAEHLER =====")
|
||||
(setq layers (prompt-layers default-layers))
|
||||
(setq tol (prompt-tolerance default-tol))
|
||||
(setq radius 100)
|
||||
|
||||
(prompt (strcat "\nLayer : "))
|
||||
(foreach l layers (prompt (strcat l " ")))
|
||||
(prompt (strcat "\nToleranz : " (rtos tol 2 2)))
|
||||
(prompt "\n------------------------------")
|
||||
|
||||
;; ── Logik ────────────────────────────────────
|
||||
|
||||
(setq all-pts '())
|
||||
(setq lines (get-lines-by-layer layers))
|
||||
|
||||
(ensure-layer "D-KREUZUNG" 1)
|
||||
(ensure-layer "D-T_VERBINDUNG" 3)
|
||||
(ensure-layer "D-ECKVERBINDUNG" 5)
|
||||
|
||||
(prompt (strcat "\nLinien gefunden: " (itoa (length lines))))
|
||||
|
||||
(setq i 0)
|
||||
|
||||
(while (< i (length lines))
|
||||
|
||||
(setq j (+ i 1))
|
||||
|
||||
(while (< j (length lines))
|
||||
|
||||
(setq l1 (nth i lines))
|
||||
(setq l2 (nth j lines))
|
||||
|
||||
(setq result (find-intersection l1 l2 tol))
|
||||
(if result
|
||||
(progn
|
||||
(setq pt (car result)) ;; Punkt
|
||||
(setq typ (cdr result)) ;; Typ — direkt aus find-intersection
|
||||
(if (not (point-exists pt all-pts tol))
|
||||
(progn
|
||||
(setq all-pts (cons (list (car pt) (cadr pt) typ) all-pts))
|
||||
(cond
|
||||
((= typ "Kreuzung") (create-circle pt radius "D-KREUZUNG"))
|
||||
((= typ "T-Verbindung") (create-circle pt radius "D-T_VERBINDUNG"))
|
||||
((= typ "Eckverbindung") (create-circle pt radius "D-ECKVERBINDUNG"))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(setq j (1+ j))
|
||||
)
|
||||
|
||||
(setq i (1+ i))
|
||||
)
|
||||
|
||||
(prompt "\n\n===== ERGEBNIS =====")
|
||||
(prompt (strcat "\nKreuzungen: " (itoa (count-by-type all-pts "Kreuzung"))))
|
||||
(prompt (strcat "\nT-Verbindungen: " (itoa (count-by-type all-pts "T-Verbindung"))))
|
||||
(prompt (strcat "\nEckverbindungen: " (itoa (count-by-type all-pts "Eckverbindung"))))
|
||||
(prompt (strcat "\nGESAMT: " (itoa (length all-pts))))
|
||||
|
||||
;; ── Report schreiben ──────────────────────────────────────
|
||||
(setq dwg-name
|
||||
(vla-get-Name (vla-get-ActiveDocument (vlax-get-acad-object)))
|
||||
)
|
||||
;; ".dwg" abschneiden falls vorhanden
|
||||
(if (wcmatch dwg-name "*.dwg")
|
||||
(setq dwg-name (substr dwg-name 1 (- (strlen dwg-name) 4)))
|
||||
)
|
||||
(setq timestamp
|
||||
(menucmd "M=$(edtime,$(getvar,DATE),YYYYMMDD-HHMMSS)")
|
||||
)
|
||||
(setq report-path
|
||||
(strcat
|
||||
(vla-get-Path (vla-get-ActiveDocument (vlax-get-acad-object)))
|
||||
"\\"
|
||||
dwg-name
|
||||
"_"
|
||||
timestamp
|
||||
"_vzaehler.txt"
|
||||
)
|
||||
)
|
||||
|
||||
(write-report all-pts report-path layers)
|
||||
|
||||
(princ)
|
||||
)
|
||||
@@ -0,0 +1,145 @@
|
||||
# DRT-Verbindungszähler - DXF-Analyse-Tool
|
||||
|
||||
Ein Python-basiertes Werkzeug zur automatischen Erkennung und Markierung von Schnittpunkten zwischen Linien in DXF-Dateien.
|
||||
|
||||
## Überblick
|
||||
|
||||
Dieses Projekt analysiert DXF-Dateien und identifiziert Verbindungs- bzw. Schnittpunkte zwischen Linien auf verschiedenen Layern. Die gefundenen Schnittpunkte werden mit Kreisen markiert und in einer separaten DXF-Datei sowie einem Textbericht ausgegeben.
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```text
|
||||
verbindungszaehler/
|
||||
├── verbindungszaehler.bat # Hauptskript zum Starten der Analyse
|
||||
├── config/
|
||||
│ └── config.cfg # Standardkonfiguration
|
||||
├── scripts/
|
||||
│ └── setenv.bat # Umgebungsvariablen und Verzeichnisstruktur
|
||||
├── src/
|
||||
│ └── lib/
|
||||
│ ├── analyze.py # Python-Analyseskript
|
||||
│ └── dxf_analyzer.py # Kernlogik
|
||||
├── input/ # Eingabeverzeichnis für DXF-Dateien
|
||||
└── output/ # Ausgabeverzeichnis für Ergebnisse
|
||||
```
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
- Windows-Betriebssystem
|
||||
- Python 3.x installiert und im PATH verfügbar
|
||||
- Python-Bibliothek für DXF-Verarbeitung `ezdxf`
|
||||
- Modul `dxf_analyzer.py` mit der Klasse `IntersectionAnalyzer`
|
||||
|
||||
## Installation
|
||||
|
||||
1. Projekt in ein beliebiges Verzeichnis entpacken
|
||||
2. Sicherstellen, dass Python installiert ist
|
||||
3. Benötigte Python-Pakete installieren (z.B. `pip install ezdxf`)
|
||||
4. DXF-Dateien im `input/`-Verzeichnis ablegen
|
||||
|
||||
## Verwendung
|
||||
|
||||
### Methode 1: Alle Dateien im Input-Verzeichnis analysieren
|
||||
|
||||
Doppelklick auf `verbindungszaehler.bat` oder per Kommandozeile:
|
||||
|
||||
```batch
|
||||
verbindungszaehler.bat
|
||||
```
|
||||
|
||||
Alle DXF-Dateien im `input/`-Verzeichnis werden automatisch mit den Einstellungen aus `config.cfg` analysiert.
|
||||
|
||||
### Methode 2: Einzelne Datei per Drag & Drop
|
||||
|
||||
Ziehen Sie eine DXF-Datei direkt auf die `verbindungszaehler.bat` und lassen Sie sie los. Die Datei wird sofort mit den Einstellungen aus `config/config.cfg` analysiert.
|
||||
|
||||
### Methode 3: Einzelne Datei per Kommandozeile
|
||||
|
||||
```batch
|
||||
verbindungszaehler.bat "C:\Pfad\zur\datei.dxf"
|
||||
```
|
||||
|
||||
## Konfiguration
|
||||
|
||||
### config.cfg
|
||||
|
||||
Die Datei `config.example.cfg` enthält alle Einstellungen für die Analyse. Für individuelle Parameter muss eine Kopie von `config.example.cfg` erstellt und in `config.cfg` umbenannt werden. Diese dient nun als Konfigurationsdatei des Projekts.
|
||||
Passen Sie diese Werte in `config.cfg` nach Bedarf an:
|
||||
|
||||
```cfg
|
||||
LAYERS=D-1,D-5
|
||||
TOLERANCE=0.06
|
||||
MARK_RADIUS=150
|
||||
```
|
||||
|
||||
**Parameter-Erklärung:**
|
||||
|
||||
- **LAYERS**: Kommagetrennte Liste der zu analysierenden Layer (z.B. "D-1,D-5,D-3")
|
||||
- **TOLERANCE**: Maximaler Abstand in DXF-Einheiten, bei dem zwei Punkte als identisch gelten (für ungenaue Zeichnungen)
|
||||
- **MARK_RADIUS**: Radius der Kreise in DXF-Einheiten, die Schnittpunkte markieren
|
||||
|
||||
**Hinweis:** Nach Änderungen in `config.cfg` werden die neuen Werte bei der nächsten Ausführung automatisch verwendet.
|
||||
|
||||
## Ausgabe
|
||||
|
||||
Das Tool erzeugt für jede analysierte DXF-Datei zwei Dateien im `output/`-Verzeichnis:
|
||||
|
||||
1. **[Dateiname]_markiert_[Datum]_[Zeit].dxf**
|
||||
DXF-Datei mit eingezeichneten Kreisen an allen gefundenen Schnittpunkten
|
||||
|
||||
2. **[Dateiname]_analyse_[Datum]_[Zeit].txt**
|
||||
Textbericht mit Details zu den gefundenen Verbindungen (Koordinaten, Anzahl, etc.)
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
```text
|
||||
zeichnung_markiert_20241202_14-30-25.dxf
|
||||
zeichnung_analyse_20241202_14-30-25.txt
|
||||
```
|
||||
|
||||
## Funktionsweise
|
||||
|
||||
1. **setenv.bat** richtet die Verzeichnisstruktur ein und lädt die Konfigurationswerte aus `config.cfg` im `config/`-Ordner
|
||||
2. **verbindungszaehler.bat** verarbeitet die angegebene Datei (oder alle Dateien im Input-Ordner) und ruft das Python-Skript auf
|
||||
3. **analyze.py** lädt die DXF-Datei und übergibt sie zusammen mit den Konfigurationsparametern an den `IntersectionAnalyzer`
|
||||
4. Der Analyzer findet Schnittpunkte zwischen Linien auf den angegebenen Layern innerhalb der definierten Toleranz
|
||||
5. Gefundene Schnittpunkte werden mit Kreisen (Radius aus `MARK_RADIUS`) markiert
|
||||
6. Ergebnisse werden als neue DXF-Datei und Textbericht gespeichert
|
||||
|
||||
## Workflow-Beispiel
|
||||
|
||||
1. DXF-Dateien in den `input/`-Ordner kopieren
|
||||
2. `config.cfg` im `config/`-Ordner öffnen und gewünschte Layer-Namen, Toleranz und Markierungsradius eintragen
|
||||
3. `verbindungszaehler.bat` per Doppelklick starten **oder** eine einzelne DXF-Datei auf die Batch-Datei ziehen
|
||||
4. Ergebnisse im `output/`-Ordner überprüfen: **Bevor die Anzahl der Verbindungen weiter verwendet wird, sind die markierten Punkte im Ausgabelayout zwingend auf Fehler zu überprüfen!**
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Stellen Sie sicher, dass die Layer-Namen in `config.cfg` exakt mit denen in der DXF-Datei übereinstimmen (Groß-/Kleinschreibung beachten)
|
||||
- Bei sehr großen Dateien kann die Analyse einige Zeit in Anspruch nehmen
|
||||
- Die Toleranz sollte an die Genauigkeit Ihrer Zeichnungen angepasst werden (typische Werte: 0.01 bis 0.1)
|
||||
- Der Markierungsradius sollte groß genug sein, um in der Zeichnung sichtbar zu sein, aber klein genug, um Details nicht zu verdecken
|
||||
- Ausgabedateien werden nicht überschrieben, da jede Datei einen eindeutigen Zeitstempel erhält
|
||||
|
||||
## Fehlerbehebung
|
||||
|
||||
##### "Datei nicht gefunden"
|
||||
|
||||
Überprüfen Sie den Pfad zur DXF-Datei oder legen Sie Dateien im `input/`-Verzeichnis ab.
|
||||
|
||||
##### "Keine Schnittpunkte gefunden"
|
||||
|
||||
- Prüfen Sie, ob die in `config.cfg` angegebenen Layer in der DXF-Datei existieren
|
||||
- Erhöhen Sie den TOLERANCE-Wert in `config.cfg`, falls Linien nicht exakt verbunden sind
|
||||
|
||||
##### Python-Fehler
|
||||
|
||||
Stellen Sie sicher, dass alle erforderlichen Python-Bibliotheken installiert sind.
|
||||
|
||||
##### Drag & Drop funktioniert nicht
|
||||
|
||||
Stellen Sie sicher, dass Sie die Datei auf `verbindungszaehler.bat` (nicht auf `setenv.bat`) ziehen.
|
||||
|
||||
## Autor
|
||||
|
||||
Simon Hensch
|
||||
@@ -0,0 +1,8 @@
|
||||
# Alle Linien, die auf den angegebenen Layern liegen, werden in der Berechnung berücksichtigt
|
||||
LAYERS=D-1,D-5
|
||||
|
||||
# Toleranz der Schnittpunkte insbesondere bei T-Verbindungen in Millimetern. Beim Überschreiten der Toleranz wird die Verbindung nicht gezählt.
|
||||
TOLERANCE=15
|
||||
|
||||
# Alle erkannten Verbindungen werden mit einem Kreis des Radius in Millimetern markiert.
|
||||
MARK_RADIUS=150
|
||||
File diff suppressed because it is too large
Load Diff
+241
@@ -0,0 +1,241 @@
|
||||
============================================================
|
||||
DXF SCHNITTPUNKT-ANALYSE ERGEBNIS - 16.04.2026 09:25:49
|
||||
============================================================
|
||||
|
||||
Eingabedatei: C:\Users\s.hensch\Git\drt-verbindungszaehler\input\500658_10_1_ohne_statLager_Verbindungselemente_20260416_SH.dxf
|
||||
Analysierte Layer: D-1, D-5
|
||||
Anzahl analysierter Linien: 164
|
||||
|
||||
------------------------------------------------------------
|
||||
SCHNITTPUNKT-STATISTIK
|
||||
------------------------------------------------------------
|
||||
|
||||
Kreuzung : 6 ( 2.9%)
|
||||
T-Verbindung : 201 ( 95.7%)
|
||||
Eckverbindung : 3 ( 1.4%)
|
||||
|
||||
GESAMT : 210
|
||||
|
||||
------------------------------------------------------------
|
||||
DETAILS DER SCHNITTPUNKTE
|
||||
------------------------------------------------------------
|
||||
|
||||
|
||||
Kreuzung (6 Stück):
|
||||
----------------------------------------
|
||||
1. X= 79401.213, Y= 397.810
|
||||
2. X= 83401.213, Y= 397.810
|
||||
3. X= 87401.213, Y= 397.810
|
||||
4. X= 91401.213, Y= 397.810
|
||||
5. X= 73501.687, Y= 10597.810
|
||||
6. X=134124.793, Y= 10391.879
|
||||
|
||||
T-Verbindung (201 Stück):
|
||||
----------------------------------------
|
||||
1. X=138308.726, Y= 63200.924
|
||||
2. X=138308.726, Y= 52442.951
|
||||
3. X=138308.726, Y= 54442.951
|
||||
4. X=138308.726, Y= 56442.951
|
||||
5. X=138308.726, Y= 58442.951
|
||||
6. X=138308.726, Y= 60442.951
|
||||
7. X=138308.726, Y= 62086.693
|
||||
8. X=128510.648, Y= 63200.924
|
||||
9. X=128510.648, Y= 52441.370
|
||||
10. X=128510.648, Y= 54441.370
|
||||
11. X=128510.648, Y= 56441.370
|
||||
12. X=128510.648, Y= 58441.370
|
||||
13. X=128510.648, Y= 60441.370
|
||||
14. X=128510.648, Y= 61565.879
|
||||
15. X=128510.648, Y= 61160.000
|
||||
16. X=139558.726, Y= 63200.924
|
||||
17. X=130960.648, Y= 63200.924
|
||||
18. X=133410.648, Y= 63200.924
|
||||
19. X=135860.648, Y= 63200.924
|
||||
20. X=126279.842, Y= 52441.370
|
||||
21. X=126279.842, Y= 54441.370
|
||||
22. X=126279.842, Y= 56441.370
|
||||
23. X=126279.842, Y= 58441.370
|
||||
24. X=126279.842, Y= 60441.370
|
||||
25. X=126279.842, Y= 61565.879
|
||||
26. X=126279.842, Y= 51780.000
|
||||
27. X=126279.842, Y= 53878.216
|
||||
28. X=139558.726, Y= 52442.951
|
||||
29. X=139558.726, Y= 54442.951
|
||||
30. X=139558.726, Y= 56442.951
|
||||
31. X=139558.726, Y= 58442.951
|
||||
32. X=139558.726, Y= 60442.951
|
||||
33. X=139558.726, Y= 62086.693
|
||||
34. X= 77401.213, Y= 397.810
|
||||
35. X= 81401.213, Y= 397.810
|
||||
36. X= 85401.213, Y= 397.810
|
||||
37. X= 89401.213, Y= 397.810
|
||||
38. X= 93401.213, Y= 397.810
|
||||
39. X= 95088.723, Y= 397.810
|
||||
40. X= 77401.153, Y= 1547.810
|
||||
41. X= 79401.153, Y= 1547.810
|
||||
42. X= 81401.153, Y= 1547.810
|
||||
43. X= 83401.153, Y= 1547.810
|
||||
44. X= 85401.153, Y= 1547.810
|
||||
45. X= 87401.153, Y= 1547.810
|
||||
46. X= 89401.153, Y= 1547.810
|
||||
47. X= 91401.153, Y= 1547.810
|
||||
48. X= 93401.153, Y= 1547.810
|
||||
49. X= 95088.663, Y= 1547.810
|
||||
50. X= 95180.000, Y= 5747.810
|
||||
51. X= 95977.004, Y= 5747.810
|
||||
52. X= 97051.644, Y= 8147.810
|
||||
53. X= 95180.000, Y= 8147.810
|
||||
54. X= 95977.004, Y= 8147.810
|
||||
55. X= 75394.609, Y= 10597.810
|
||||
56. X= 77400.687, Y= 10597.810
|
||||
57. X= 79400.687, Y= 10597.810
|
||||
58. X= 81400.687, Y= 10597.810
|
||||
59. X= 83400.687, Y= 10597.810
|
||||
60. X= 85400.687, Y= 10597.810
|
||||
61. X= 87400.687, Y= 10597.810
|
||||
62. X= 89400.687, Y= 10597.810
|
||||
63. X= 91400.687, Y= 10597.810
|
||||
64. X= 93400.687, Y= 10597.810
|
||||
65. X= 73501.687, Y= 11896.713
|
||||
66. X= 75394.609, Y= 11896.810
|
||||
67. X= 77400.620, Y= 11896.914
|
||||
68. X= 79400.620, Y= 11897.017
|
||||
69. X= 81400.620, Y= 11897.120
|
||||
70. X= 83400.620, Y= 11897.223
|
||||
71. X= 85400.620, Y= 11897.326
|
||||
72. X= 87400.620, Y= 11897.429
|
||||
73. X= 89400.620, Y= 11897.532
|
||||
74. X= 91400.620, Y= 11897.635
|
||||
75. X= 93400.620, Y= 11897.738
|
||||
76. X=130051.644, Y= 8191.879
|
||||
77. X=130051.644, Y= 6943.978
|
||||
78. X=132251.644, Y= 8191.879
|
||||
79. X=132251.644, Y= 6943.978
|
||||
80. X=125651.644, Y= 7421.473
|
||||
81. X=127851.644, Y= 7421.473
|
||||
82. X=133383.730, Y= 8191.879
|
||||
83. X=133383.730, Y= 6943.978
|
||||
84. X=147324.793, Y= 11803.549
|
||||
85. X=147324.793, Y= 10926.143
|
||||
86. X=151424.793, Y= 11803.549
|
||||
87. X=151424.793, Y= 10926.143
|
||||
88. X=155924.793, Y= 11803.549
|
||||
89. X=155924.793, Y= 10926.143
|
||||
90. X=149424.793, Y= 11803.549
|
||||
91. X=153724.793, Y= 11803.549
|
||||
92. X=160424.793, Y= 11803.549
|
||||
93. X=164924.793, Y= 11803.549
|
||||
94. X=169424.793, Y= 11803.549
|
||||
95. X=173924.793, Y= 11803.549
|
||||
96. X=178424.793, Y= 11803.549
|
||||
97. X=158124.793, Y= 11803.549
|
||||
98. X=162624.793, Y= 11803.549
|
||||
99. X=167124.793, Y= 11803.549
|
||||
100. X=171624.793, Y= 11803.549
|
||||
101. X=176124.793, Y= 11803.549
|
||||
102. X=149424.793, Y= 10926.143
|
||||
103. X=153724.793, Y= 10926.143
|
||||
104. X=160424.793, Y= 10926.143
|
||||
105. X=164924.793, Y= 10926.143
|
||||
106. X=169424.793, Y= 10926.143
|
||||
107. X=173924.793, Y= 10926.143
|
||||
108. X=178424.793, Y= 10926.143
|
||||
109. X=158124.793, Y= 10926.143
|
||||
110. X=162624.793, Y= 10926.143
|
||||
111. X=167124.793, Y= 10926.143
|
||||
112. X=171624.793, Y= 10926.143
|
||||
113. X=176124.793, Y= 10926.143
|
||||
114. X=156485.708, Y= 13474.648
|
||||
115. X=158485.708, Y= 13474.648
|
||||
116. X=160485.708, Y= 13474.648
|
||||
117. X=162485.708, Y= 13474.648
|
||||
118. X=164485.708, Y= 13474.648
|
||||
119. X=166485.708, Y= 13474.648
|
||||
120. X=168485.708, Y= 13474.648
|
||||
121. X=170485.708, Y= 13474.648
|
||||
122. X=172485.708, Y= 13474.648
|
||||
123. X=174485.708, Y= 13474.648
|
||||
124. X=176485.708, Y= 13474.648
|
||||
125. X=178005.866, Y= 13474.648
|
||||
126. X=156485.708, Y= 12404.648
|
||||
127. X=158485.708, Y= 12404.648
|
||||
128. X=160485.708, Y= 12404.648
|
||||
129. X=162485.708, Y= 12404.648
|
||||
130. X=164485.708, Y= 12404.648
|
||||
131. X=166485.708, Y= 12404.648
|
||||
132. X=168485.708, Y= 12404.648
|
||||
133. X=170485.708, Y= 12404.648
|
||||
134. X=172485.708, Y= 12404.648
|
||||
135. X=174485.708, Y= 12404.648
|
||||
136. X=176485.708, Y= 12404.648
|
||||
137. X=178005.866, Y= 12404.648
|
||||
138. X=130960.648, Y= 61160.000
|
||||
139. X=120387.520, Y= 51780.000
|
||||
140. X=121006.726, Y= 51780.000
|
||||
141. X=123465.272, Y= 51780.000
|
||||
142. X=125006.726, Y= 51780.000
|
||||
143. X=120387.520, Y= 53878.216
|
||||
144. X=121006.726, Y= 53878.216
|
||||
145. X=123465.272, Y= 53878.216
|
||||
146. X=125006.726, Y= 53878.216
|
||||
147. X=120387.520, Y= 52829.108
|
||||
148. X=121006.726, Y= 52829.108
|
||||
149. X=144732.392, Y= 53286.846
|
||||
150. X=144732.392, Y= 55286.846
|
||||
151. X=144732.392, Y= 57286.846
|
||||
152. X=144732.392, Y= 59286.846
|
||||
153. X=144732.392, Y= 60686.578
|
||||
154. X=146632.860, Y= 53286.846
|
||||
155. X=146632.860, Y= 55286.846
|
||||
156. X=146632.860, Y= 57286.846
|
||||
157. X=146632.860, Y= 59286.846
|
||||
158. X=146632.860, Y= 60686.578
|
||||
159. X=145682.626, Y= 53286.846
|
||||
160. X=145682.626, Y= 52819.128
|
||||
161. X= 76800.000, Y= 65085.000
|
||||
162. X= 78800.000, Y= 65085.000
|
||||
163. X= 80800.000, Y= 65085.000
|
||||
164. X= 82800.000, Y= 65085.000
|
||||
165. X= 84800.000, Y= 65085.000
|
||||
166. X= 72300.000, Y= 65085.000
|
||||
167. X= 74800.000, Y= 65085.000
|
||||
168. X= 73361.274, Y= 65085.000
|
||||
169. X= 76800.000, Y= 64015.000
|
||||
170. X= 78800.000, Y= 64015.000
|
||||
171. X= 80800.000, Y= 64015.000
|
||||
172. X= 82800.000, Y= 64015.000
|
||||
173. X= 84800.000, Y= 64015.000
|
||||
174. X= 72300.000, Y= 64015.000
|
||||
175. X= 74800.000, Y= 64015.000
|
||||
176. X= 73361.274, Y= 64015.000
|
||||
177. X= 85849.346, Y= 64015.000
|
||||
178. X=125651.644, Y= 1588.300
|
||||
179. X=125651.644, Y= 3588.300
|
||||
180. X=125651.644, Y= 5588.300
|
||||
181. X=125651.644, Y= 630.889
|
||||
182. X=127851.644, Y= 1588.300
|
||||
183. X=127851.644, Y= 3588.300
|
||||
184. X=127851.644, Y= 5588.300
|
||||
185. X=127851.644, Y= 630.889
|
||||
186. X= 95180.000, Y= 7190.000
|
||||
187. X= 95977.004, Y= 7190.000
|
||||
188. X=126280.000, Y= 1588.300
|
||||
189. X=126280.000, Y= 630.889
|
||||
190. X=147880.000, Y= 64274.648
|
||||
191. X=149880.000, Y= 64274.648
|
||||
192. X=151880.000, Y= 64274.648
|
||||
193. X=153880.000, Y= 64274.648
|
||||
194. X=155880.000, Y= 64274.648
|
||||
195. X=147202.099, Y= 64274.648
|
||||
196. X=147880.000, Y= 63204.648
|
||||
197. X=149880.000, Y= 63204.648
|
||||
198. X=151880.000, Y= 63204.648
|
||||
199. X=153880.000, Y= 63204.648
|
||||
200. X=155880.000, Y= 63204.648
|
||||
201. X=147202.099, Y= 63204.648
|
||||
|
||||
Eckverbindung (3 Stück):
|
||||
----------------------------------------
|
||||
1. X=144732.392, Y= 52819.128
|
||||
2. X=146632.860, Y= 52819.128
|
||||
3. X= 85849.346, Y= 65085.000
|
||||
+479776
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Reference in New Issue
Block a user