feat: HW Planung - Symbole erzeugen, Nummerierung, Ausgabeziel-Dialog
- Symbole erzeugen (HW_SYMBOLE, Einzelbefehle HW_SYM_*): Bauteile nach cfg/io_regeln.json (reduzierte Kopie aus kabellaengen), Symbole aus cfg/hw_symbole.json katalog-identisch nachgebaut (lib/hw_symbole.py), REALE_POSITION mit x auf dem Bauteil, Paare uebereinander, Ausweichen in y ohne Ueberlappung - Symbole nummerieren (HW_NUMMERIEREN): lib/create_numbers.py samt error_collector.py und cfg/enumerate.cfg aus kabellaengen uebernommen - Ausgabeziel per Dialog dcl/hw_ausgabe.dcl: aktuelle Zeichnung, bestehende Datei ergaenzen oder neue Datei - Materialfluss mit XDATA SSG_HW_MF, ergaenzt vorhandene Datei - Doku doc/hw_planung.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d2729140ff
commit
8abb6b3c65
20 files changed
+4176
-183
No files matched your search
@@ -92,3 +92,40 @@ def test_csv_nach_dxf(tmp_path):
|
||||
msp = ezdxf.readfile(str(dxf_pfad)).modelspace()
|
||||
assert len(msp.query('LWPOLYLINE[layer=="HW_Kreisel"]')) == 1
|
||||
assert len(msp.query('CIRCLE[layer=="HW_Weiche"]')) == 1
|
||||
|
||||
|
||||
def _csv_mit_kreisel(tmp_path):
|
||||
kopf = ("Elementnummer;TeileArt;TeileId;Bezeichnung;Planquadrat;Anzahl;Position;"
|
||||
"Boundingbox;Insertpoint;K1;K2;K3;K4;Nachbarn;TrackIds;Fehler;Warnungen;Merkmale")
|
||||
zeile = ('1;"ILS 2.0 Kreisel";"0001";"K1";"";1;"0.00, 0.00, 0.00";"5800.00, 800.00, 1.00";'
|
||||
'"";"";"";"";"";"";"";"";"";{"Drehrichtung": "UZS", "Drehung": 0}')
|
||||
csv_pfad = tmp_path / "export.csv"
|
||||
csv_pfad.write_text(kopf + "\n" + zeile + "\n", encoding="utf-8")
|
||||
return csv_pfad
|
||||
|
||||
|
||||
def test_materialfluss_markiert_und_ersetzt_nur_eigenes(tmp_path):
|
||||
"""Erzeugte Objekte tragen XDATA SSG_HW_MF; ein zweiter Lauf ersetzt sie,
|
||||
laesst aber fremde Geometrie (z.B. Renamer-Rahmen) stehen."""
|
||||
csv_pfad = _csv_mit_kreisel(tmp_path)
|
||||
dxf_pfad = tmp_path / "Test_HW.dxf"
|
||||
assert hw.main([str(csv_pfad), str(dxf_pfad), "--layer-cfg", ""]) == 0
|
||||
doc = ezdxf.readfile(str(dxf_pfad))
|
||||
msp = doc.modelspace()
|
||||
assert msp and all(e.has_xdata(hw.XDATA_APP) for e in msp)
|
||||
msp.add_line((0, 0), (1, 1), dxfattribs={"layer": "ILS_RENAMER"})
|
||||
doc.saveas(str(dxf_pfad))
|
||||
|
||||
assert hw.main([str(csv_pfad), str(dxf_pfad), "--layer-cfg", ""]) == 0
|
||||
msp = ezdxf.readfile(str(dxf_pfad)).modelspace()
|
||||
assert len(msp.query('LWPOLYLINE[layer=="HW_Kreisel"]')) == 1
|
||||
assert len(msp.query('LINE[layer=="ILS_RENAMER"]')) == 1
|
||||
|
||||
|
||||
def test_materialfluss_einheitenlos(tmp_path):
|
||||
"""Zwischendatei fuer die aktuelle Zeichnung: $INSUNITS = 0, sonst
|
||||
skaliert BricsCAD sie beim Einfuegen."""
|
||||
csv_pfad = _csv_mit_kreisel(tmp_path)
|
||||
dxf_pfad = tmp_path / "Test_HW_tmp.dxf"
|
||||
assert hw.main([str(csv_pfad), str(dxf_pfad), "--layer-cfg", "", "--einheitenlos"]) == 0
|
||||
assert ezdxf.readfile(str(dxf_pfad)).header["$INSUNITS"] == 0
|
||||
Reference in new issue
Block a user