diff --git a/lib/dxf2lib b/lib/dxf2lib new file mode 100644 index 0000000..9f61079 --- /dev/null +++ b/lib/dxf2lib @@ -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) diff --git a/lib/svg2dxf.py b/lib/svg2dxf.py new file mode 100644 index 0000000..a942832 --- /dev/null +++ b/lib/svg2dxf.py @@ -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)