Neue Skripte dxf2lib.py und svg2dxf.py hinzugefügt zur Verarbeitung von DXF-Dateien und zur Konvertierung von SVG in DXF.
This commit is contained in:
+75
@@ -0,0 +1,75 @@
|
||||
import os
|
||||
import ezdxf
|
||||
from ezdxf.math import Vec2
|
||||
|
||||
# Hilfsfunktion für Umgebungsvariablen mit Fallback
|
||||
|
||||
def check_environment_var(env_str: str, fallback: str) -> str:
|
||||
out_path = os.environ.get(env_str)
|
||||
if out_path:
|
||||
return out_path
|
||||
print(f"[WARN] Umgebungsvariable {env_str} ist nicht gesetzt oder leer. Verwende '{fallback}'.")
|
||||
return fallback
|
||||
|
||||
# Verzeichnisse/Dateien über Umgebungsvariablen oder Fallback
|
||||
INPUT_DIR = os.path.join(check_environment_var("PROJECT_WORK", "."), "converted_dxfs")
|
||||
OUTPUT_FILE = os.path.join(check_environment_var("PROJECT_WORK", "."), "block_library.dxf")
|
||||
|
||||
doc = ezdxf.new()
|
||||
msp = doc.modelspace()
|
||||
|
||||
def get_bbox(entities):
|
||||
min_x, min_y = float('inf'), float('inf')
|
||||
max_x, max_y = float('-inf'), float('-inf')
|
||||
for e in entities:
|
||||
try:
|
||||
box = e.bbox()
|
||||
if box:
|
||||
(x1, y1), (x2, y2) = box.extmin, box.extmax
|
||||
min_x, min_y = min(min_x, x1), min(min_y, y1)
|
||||
max_x, max_y = max(max_x, x2), max(max_y, y2)
|
||||
except Exception:
|
||||
continue
|
||||
if min_x == float('inf'):
|
||||
return None
|
||||
return Vec2((min_x + max_x) / 2, (min_y + max_y) / 2)
|
||||
|
||||
x_offset = 0
|
||||
|
||||
for filename in os.listdir(INPUT_DIR):
|
||||
if not filename.lower().endswith(".dxf"):
|
||||
continue
|
||||
|
||||
filepath = os.path.join(INPUT_DIR, filename)
|
||||
name = os.path.splitext(filename)[0]
|
||||
|
||||
try:
|
||||
src_doc = ezdxf.readfile(filepath)
|
||||
src_msp = src_doc.modelspace()
|
||||
entities = list(src_msp)
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen von {filename}: {e}")
|
||||
continue
|
||||
|
||||
center = get_bbox(entities)
|
||||
if center is None:
|
||||
print(f"Keine gültige Geometrie in {filename}")
|
||||
continue
|
||||
|
||||
if name in doc.blocks:
|
||||
doc.blocks.delete_block(name)
|
||||
|
||||
blk = doc.blocks.new(name=name, base_point=center)
|
||||
|
||||
for e in entities:
|
||||
try:
|
||||
blk.add_entity(e.copy())
|
||||
except Exception as err:
|
||||
print(f"Fehler in {filename}: {err}")
|
||||
|
||||
# Optional Vorschau
|
||||
msp.add_blockref(name, insert=(x_offset, 0))
|
||||
x_offset += 200 # Abstand zwischen Blöcken
|
||||
|
||||
print(f"Bibliotheks-DXF gespeichert: {OUTPUT_FILE}")
|
||||
doc.saveas(OUTPUT_FILE)
|
||||
@@ -0,0 +1,33 @@
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
# Hilfsfunktion wie in plant2dxf.py
|
||||
|
||||
def check_environment_var(env_str: str, fallback: str) -> str:
|
||||
out_path = os.environ.get(env_str)
|
||||
if out_path:
|
||||
return out_path
|
||||
print(f"[WARN] Umgebungsvariable {env_str} ist nicht gesetzt oder leer. Verwende '{fallback}'.")
|
||||
return fallback
|
||||
|
||||
# Verzeichnisse über Umgebungsvariablen oder Fallback
|
||||
INPUT_DIR = os.path.join(check_environment_var("PROJECT_WORK", "."), "input_svg")
|
||||
OUTPUT_DIR = os.path.join(check_environment_var("PROJECT_WORK", "."), "converted_dxfs")
|
||||
INKSCAPE = "inkscape" # ggf. vollständiger Pfad angeben
|
||||
|
||||
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
||||
|
||||
for filename in os.listdir(INPUT_DIR):
|
||||
if filename.lower().endswith((".svg", ".xml")):
|
||||
in_path = os.path.join(INPUT_DIR, filename)
|
||||
name_wo_ext = os.path.splitext(filename)[0]
|
||||
out_path = os.path.join(OUTPUT_DIR, name_wo_ext + ".dxf")
|
||||
|
||||
print(f"Konvertiere: {filename} → {out_path}")
|
||||
subprocess.run([
|
||||
INKSCAPE,
|
||||
in_path,
|
||||
"--export-type=dxf",
|
||||
f"--export-filename={out_path}"
|
||||
], check=True)
|
||||
Reference in New Issue
Block a user