Funktion zur Erzeugung von Koordinatensystemen gebaut um eindeutig den Ein und Auslauf von Bögen und weichen zu erhalten.
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
"""
|
||||
Erzeugt benannte Koordinatensystem-Bloecke in DXF-Dateien.
|
||||
|
||||
Jeder Block enthaelt drei Linien vom Ursprung:
|
||||
- rot(1) X-Achse, Laenge 1
|
||||
- gruen(3) Y-Achse, Laenge 2
|
||||
- blau(5) Z-Achse, Laenge 3
|
||||
|
||||
Die 3D-Rotation erfolgt ueber die Transformation des INSERT-Entities.
|
||||
"""
|
||||
|
||||
import math
|
||||
import ezdxf
|
||||
from ezdxf.math import Matrix44
|
||||
|
||||
|
||||
# Block-Linien: (color, dx, dy, dz)
|
||||
KS_LINES = [
|
||||
(1, 1.0, 0.0, 0.0), # rot, X-Achse, Laenge 1
|
||||
(3, 0.0, 2.0, 0.0), # gruen, Y-Achse, Laenge 2
|
||||
(5, 0.0, 0.0, 3.0), # blau, Z-Achse, Laenge 3
|
||||
]
|
||||
|
||||
|
||||
def _ensure_block(doc, block_name):
|
||||
"""Erzeugt den Block falls er noch nicht existiert."""
|
||||
if block_name not in doc.blocks:
|
||||
blk = doc.blocks.new(name=block_name)
|
||||
for color, dx, dy, dz in KS_LINES:
|
||||
blk.add_line(
|
||||
start=(0, 0, 0),
|
||||
end=(dx, dy, dz),
|
||||
dxfattribs={"color": color},
|
||||
)
|
||||
return block_name
|
||||
|
||||
|
||||
def _ensure_layer(doc, layer_name="_KOORDINATENSYSTEME"):
|
||||
"""Stellt sicher, dass der Layer existiert."""
|
||||
if layer_name not in doc.layers:
|
||||
doc.layers.add(layer_name)
|
||||
|
||||
|
||||
def insert_ks(msp, name, point, rx=0, ry=0, rz=0):
|
||||
"""
|
||||
Erzeugt ein benanntes Koordinatensystem als Block-Referenz.
|
||||
|
||||
Args:
|
||||
msp: Modelspace oder Block des Ziel-Dokuments.
|
||||
name: Block-Name (z.B. "K1", "K2", "K3", "K4").
|
||||
point: Einfuegepunkt als (x, y, z) Tupel.
|
||||
rx: Rotation um X-Achse in Grad.
|
||||
ry: Rotation um Y-Achse in Grad.
|
||||
rz: Rotation um Z-Achse in Grad.
|
||||
|
||||
Returns:
|
||||
Das erzeugte INSERT-Entity.
|
||||
"""
|
||||
doc = msp.doc
|
||||
_ensure_layer(doc)
|
||||
_ensure_block(doc, name)
|
||||
|
||||
insert = msp.add_blockref(
|
||||
name,
|
||||
insert=point,
|
||||
dxfattribs={"layer": "_KOORDINATENSYSTEME"},
|
||||
)
|
||||
|
||||
# 3D-Rotation via Transformationsmatrix
|
||||
m = Matrix44.chain(
|
||||
Matrix44.translate(-point[0], -point[1], -point[2]),
|
||||
Matrix44.x_rotate(math.radians(rx)),
|
||||
Matrix44.y_rotate(math.radians(ry)),
|
||||
Matrix44.z_rotate(math.radians(rz)),
|
||||
Matrix44.translate(point[0], point[1], point[2]),
|
||||
)
|
||||
insert.transform(m)
|
||||
|
||||
return insert
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
doc = ezdxf.new(dxfversion="R2010")
|
||||
msp = doc.modelspace()
|
||||
|
||||
insert_ks(msp, "K1", (0, 0, 0))
|
||||
insert_ks(msp, "K2", (10, 0, 0), rz=90)
|
||||
insert_ks(msp, "K3", (20, 0, 0), ry=45)
|
||||
insert_ks(msp, "K4", (30, 0, 0), rx=30, ry=45, rz=60)
|
||||
|
||||
import os
|
||||
results_dir = os.environ.get("DXFM_RESULTS", "results")
|
||||
os.makedirs(results_dir, exist_ok=True)
|
||||
out_path = os.path.join(results_dir, "ks_test.dxf")
|
||||
doc.saveas(out_path)
|
||||
print(f"Testdatei gespeichert: {out_path}")
|
||||
Reference in New Issue
Block a user