Files
dxfmakros/data/polylines.md
T
s.ayadi bbc9e9b9f9 [FEAT] Werkzeuge zum Auslesen fremder Zeichnungen und der VF-Eingabe-Journale
Grundlage fuer reproduzierbare Nachbau-Testfaelle aus echten Projekt-
zeichnungen (HundM05).

- lib/vf_journal_export.py (neu): liest die Eingabe-Journale der VF_n-Bloecke
  aus der XDATA (App SSG_VF_EDIT, Marker "linienzug") und schreibt sie als
  Frage-Antwort-Protokoll im Schema von tests/testdata/linienzug_tests.json -
  Gegenstueck zu vfl-entry->string, ohne ezdxf (reine Gruppencode-Lesung).
  Optional --csv fuer Strecken-ID und Erwartungswerte je Kette.
- lib/extract_polylines.py (neu): LWPOLYLINE-Objekte als JSON, inkl.
  OCS->Welt-Umrechnung fuer gekippte Ebenen (Handles, Segment-/Gesamtlaengen).
- lib/dxf_scan_components.py: erkennt jetzt zusaetzlich, ob ein Block ein
  2D-Schema oder ein 3D-Modell ist (TYPEN_3D, ist_3d_block/darstellung_von) -
  eine Anlagenzeichnung enthaelt beides. Dazu Sensor-Erfassung,
  Zwillings-Zusammenfuehrung und Hoehenschaetzung aus der Umgebung.
- lib/dxf_abbild.py: gibt die erkannte Darstellung je Element mit aus.
- tests/test_vf_journal_grammatik.py (neu): prueft den Journal-Dekoder gegen
  handgebaute Journale - ohne CAD und ohne die grosse DXF. Deckt die zwei
  Zweige ab, die in den echten Ketten nicht vorkommen: Glied "Linie-VF" und
  eine VF-Einheit mit gewinkeltem Erstkoerper (dort fragt vfl-vf-einheit
  KEINE Separator-/Endpunkt-Fragen vorab, anders als beim horizontalen).
- data/polylines.md, tests/testdata/hundm05_linienzug_polylines.json:
  ausgewertete Streckenzuege der Quellzeichnung.
- .gitignore: die Quellzeichnungen selbst (data/polylines.dxf 124 MB,
  data/polylines.dwg, tests/HM5.dwg) bleiben draussen - eingecheckt ist die
  Auswertung, nicht die Zeichnung.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-03 10:13:56 +02:00

172 lines
5.3 KiB
Markdown

# Polylinien aus `data/polylines.dxf`
Quelle: `data/polylines.dxf` (ASCII-DXF, AC1032 / AutoCAD 2018, ca. 143 MB).
Die Datei enthaelt genau **5 LWPOLYLINE**-Objekte, alle auf Layer `Z-6`,
alle direkt am Anfang der `ENTITIES`-Sektion (ab Zeile 159094). In der
`BLOCKS`-Sektion liegen keine Polylinien.
Alle Polylinien sind **offen** (Gruppencode `70 = 0`) und haben **keine Bulges**
(kein Gruppencode `42`), sind also reine Streckenzuege.
Die Spalte **Laenge** gibt jeweils die Strecke vom vorhergehenden zum aktuellen
Punkt an (Segmentlaenge). Da OCS ein orthonormales System ist, entspricht die
in der Polylinien-Ebene gemessene Laenge der echten 3D-Laenge im Weltsystem.
---
## Polylinie 1 - Handle `CA`
| Feld | Wert |
|---|---|
| Handle (5) | `CA` |
| Layer (8) | `Z-6` |
| Stuetzpunkte (90) | 5 |
| Geschlossen (70) | 0 (offen) |
| Elevation (38) | -271.758876 |
| Extrusion (210/220/230) | -1.3674923e-07 / -0.043577812 / -0.999050036 |
Achtung: Die Extrusionsrichtung ist **nicht** (0,0,1). Die Gruppencodes
`10`/`20` sind daher **OCS**-Koordinaten, keine Weltkoordinaten. Beide
Darstellungen sind unten aufgefuehrt.
### OCS-Koordinaten (Rohwerte 10/20)
| Nr. | X | Y | Laenge zum Vorgaenger |
|---:|---:|---:|---:|
| 1 | 8610.178314 | -1646.791925 | - |
| 2 | 8608.179544 | -6230.251177 | 4583.4597 |
| 3 | 9758.166544 | -6230.250709 | 1149.9870 |
| 4 | 9758.180524 | -5392.918048 | 837.3327 |
| 5 | 9758.945042 | -1661.656105 | 3731.2620 |
| | | **Gesamtlaenge** | **10302.0414** |
### Weltkoordinaten (aus OCS umgerechnet, Arbitrary-Axis-Algorithmus)
| Nr. | X | Y | Z | Laenge zum Vorgaenger |
|---:|---:|---:|---:|---:|
| 1 | 8610.1835 | 1657.0432 | 199.7371 | - |
| 2 | 8608.1991 | 6236.1483 | 0.0000 | 4583.4597 |
| 3 | 9758.1861 | 6236.1442 | 0.0000 | 1149.9870 |
| 4 | 9758.1975 | 5399.6070 | 36.4891 | 837.3327 |
| 5 | 9758.9503 | 1671.8896 | 199.0894 | 3731.2620 |
| | | | **Gesamtlaenge** | **10302.0414** |
---
## Polylinie 2 - Handle `CD`
| Feld | Wert |
|---|---|
| Handle (5) | `CD` |
| Layer (8) | `Z-6` |
| Stuetzpunkte (90) | 6 |
| Geschlossen (70) | 0 (offen) |
| Elevation (38) | 199.737126 |
| Extrusion (210/220/230) | Standard (0/0/1) |
### Koordinaten (10/20, entsprechen den Weltkoordinaten X/Y)
| Nr. | X | Y | Laenge zum Vorgaenger |
|---:|---:|---:|---:|
| 1 | 4927.055794 | 1205.360995 | - |
| 2 | 4932.562971 | 7060.201678 | 5854.8433 |
| 3 | 7106.355038 | 7060.201678 | 2173.7921 |
| 4 | 7106.138574 | 4645.514574 | 2414.6871 |
| 5 | 6201.192989 | 4645.514574 | 904.9456 |
| 6 | 6176.269578 | 1205.360995 | 3440.2439 |
| | | **Gesamtlaenge** | **14788.5119** |
---
## Polylinie 3 - Handle `FB`
| Feld | Wert |
|---|---|
| Handle (5) | `FB` |
| Layer (8) | `Z-6` |
| Stuetzpunkte (90) | 5 |
| Geschlossen (70) | 0 (offen) |
| Elevation (38) | 2366.737126 |
| Extrusion (210/220/230) | Standard (0/0/1) |
### Koordinaten (10/20, entsprechen den Weltkoordinaten X/Y)
| Nr. | X | Y | Laenge zum Vorgaenger |
|---:|---:|---:|---:|
| 1 | 12891.792045 | 1205.360995 | - |
| 2 | 12908.891320 | 6244.648400 | 5039.3164 |
| 3 | 12908.891320 | 6244.648400 | 0.0000 |
| 4 | 13904.931447 | 6244.648400 | 996.0401 |
| 5 | 13898.258832 | 1695.891177 | 4548.7621 |
| | | **Gesamtlaenge** | **10584.1187** |
---
## Polylinie 4 - Handle `12B`
| Feld | Wert |
|---|---|
| Handle (5) | `12B` |
| Layer (8) | `Z-6` |
| Stuetzpunkte (90) | 5 |
| Geschlossen (70) | 0 (offen) |
| Elevation (38) | 2266.737126 |
| Extrusion (210/220/230) | Standard (0/0/1) |
### Koordinaten (10/20, entsprechen den Weltkoordinaten X/Y)
| Nr. | X | Y | Laenge zum Vorgaenger |
|---:|---:|---:|---:|
| 1 | 17198.353387 | 1205.360995 | - |
| 2 | 17215.452662 | 6244.648400 | 5039.3164 |
| 3 | 17215.452662 | 6244.648400 | 0.0000 |
| 4 | 18211.492790 | 6244.648400 | 996.0401 |
| 5 | 18204.820174 | 1695.891177 | 4548.7621 |
| | | **Gesamtlaenge** | **10584.1187** |
---
## Polylinie 5 - Handle `15A`
| Feld | Wert |
|---|---|
| Handle (5) | `15A` |
| Layer (8) | `Z-6` |
| Stuetzpunkte (90) | 5 |
| Geschlossen (70) | 0 (offen) |
| Elevation (38) | 2266.737126 |
| Extrusion (210/220/230) | Standard (0/0/1) |
### Koordinaten (10/20, entsprechen den Weltkoordinaten X/Y)
| Nr. | X | Y | Laenge zum Vorgaenger |
|---:|---:|---:|---:|
| 1 | 21480.091053 | 1205.360995 | - |
| 2 | 21497.190328 | 6244.648400 | 5039.3164 |
| 3 | 21497.190328 | 6244.648400 | 0.0000 |
| 4 | 22493.230455 | 6244.648400 | 996.0401 |
| 5 | 22486.557840 | 1695.891177 | 4548.7621 |
| | | **Gesamtlaenge** | **10584.1187** |
---
## Zusammenfassung
| Nr. | Handle | Stuetzpunkte | Gesamtlaenge | kuerzestes Segment | laengstes Segment |
|---:|---|---:|---:|---:|---:|
| 1 | `CA` | 5 | 10302.0414 | 837.3327 | 4583.4597 |
| 2 | `CD` | 6 | 14788.5119 | 904.9456 | 5854.8433 |
| 3 | `FB` | 5 | 10584.1187 | 0.0000 | 5039.3164 |
| 4 | `12B` | 5 | 10584.1187 | 0.0000 | 5039.3164 |
| 5 | `15A` | 5 | 10584.1187 | 0.0000 | 5039.3164 |
## Auffaelligkeiten
- Polylinie 1 (`CA`) liegt in einer gekippten Ebene (Extrusion ca. 2.5 Grad
gegen die Z-Achse) und ist die einzige mit OCS-Koordinaten.
- Die Polylinien 3 (`FB`), 4 (`12B`) und 5 (`15A`) sind formgleich und nur in
X versetzt (Versatz ca. 4306.56 bzw. 4281.74).
- In den Polylinien 3, 4 und 5 ist jeweils Punkt 3 ein **Duplikat** von Punkt 2
(Segmentlaenge 0.0000). Falls diese Daten weiterverarbeitet werden, sollten
die Nullsegmente vorher entfernt werden.