From 3905da309c9b560f05cfebb2633b7c64c4c12c34 Mon Sep 17 00:00:00 2001
From: Paul Wolok
Date: Mon, 8 Sep 2025 10:48:59 +0200
Subject: [PATCH] =?UTF-8?q?=C3=9Cbernimmt=20nun=20die=20Layers=20und=20die?=
=?UTF-8?q?=20Farben=20bei=20der=20Bibliothek=20Erstellung?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lib/dxf2lib.py | 109 ++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 95 insertions(+), 14 deletions(-)
diff --git a/lib/dxf2lib.py b/lib/dxf2lib.py
index 6940c3b..e9c2fd5 100644
--- a/lib/dxf2lib.py
+++ b/lib/dxf2lib.py
@@ -8,6 +8,7 @@ import shutil
import configparser
from utils import check_environment_var, setup_logger
from pathlib import Path
+import logging
def get_bbox(entities):
@@ -161,7 +162,9 @@ def create_block_library(input_dir, output_file, config, logger=None):
error_files = []
processed_files = []
+ max_blockspacing_x = 0
max_blockspacing_y = 0
+
for filename in os.listdir(input_dir):
if not filename.lower().endswith(".dxf"):
continue
@@ -176,15 +179,17 @@ def create_block_library(input_dir, output_file, config, logger=None):
entities = list(src_msp)
allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC"}
filtered_entities = []
- insert = 0
+
for e in entities:
if e.dxftype() in allowed_types:
filtered_entities.append(e)
else:
- print(f"{e.dxftype()} is nicht in der erlaubten Liste. Diese befindet sich in {filename}")
+ logger.info(f"{e.dxftype()} is nicht in der erlaubten Liste. Diese befindet sich in {filename}")
+
entities = filtered_entities
+
except Exception as e:
error_msg = f"Fehler beim Lesen von {filename}: {e}"
if logger:
@@ -194,6 +199,26 @@ def create_block_library(input_dir, output_file, config, logger=None):
error_files.append((filename, error_msg))
continue
+ # Sicherstellen, dass die im Quell-DXF verwendeten Layer im Zieldokument existieren
+ try:
+ used_layer_names = {e.dxf.layer for e in entities if hasattr(e.dxf, "layer")}
+ for layer_name in used_layer_names:
+ if layer_name and layer_name not in doc.layers:
+ try:
+ src_layer = src_doc.layers.get(layer_name)
+ doc.layers.add(
+ name=layer_name,
+ color=getattr(src_layer.dxf, "color", None),
+ linetype=getattr(src_layer.dxf, "linetype", None),
+ lineweight=getattr(src_layer.dxf, "lineweight", None),
+ )
+ except Exception:
+ # Fallback: Layer mit Standardwerten anlegen
+ doc.layers.add(name=layer_name)
+ except Exception:
+ pass
+ # if filename == "834372100":
+
center, ausdehnung = get_bbox(entities)
if center is None:
error_msg = f"Keine gültige Geometrie in {filename}"
@@ -208,12 +233,19 @@ def create_block_library(input_dir, output_file, config, logger=None):
doc.blocks.delete_block(name)
blk = doc.blocks.new(name=name, base_point=(0,0))
-
+
for e in entities:
try:
cp = e.copy()
- cp.translate(-center.x, -center.y, 0) # Geometrie verschieben!
+ # Geometrie verschieben!
+ cp.translate(-center.x, -center.y, 0)
+ # Ursprungs-Layer übernehmen
+ if hasattr(e.dxf, "layer"):
+ cp.dxf.layer = e.dxf.layer
+ if (hasattr(e.dxf, "color")):
+ cp.dxf.color = e.dxf.color
blk.add_entity(cp)
+
except Exception as err:
error_msg = f"Fehler beim Verarbeiten von Entity {e.dxftype()} in {filename}: {err}"
if logger:
@@ -223,17 +255,50 @@ def create_block_library(input_dir, output_file, config, logger=None):
error_files.append((filename, error_msg))
# Platzierung in Reihen und Spalten
- # Attribut-Definition (ATTDEF) hinzufügen
+ # Attribut-Definition (ATTDEF) hinzufügen
blk.add_attdef(
tag="NAME",
insert=(0.2, 0.2), # Position relativ zum Blockursprung
- text="Default Text",
-
+ text="Default Text"
)
- msp.add_blockref(name, insert=(x_offset, y_offset))
- # Text mit Blocknamen über dem Block
+
+ # Blockreferenz-Layer bestimmen
+ blockref_layer = None
+ try:
+ # Konfiguration erlaubt expliziten Layernamen
+ cfg_layer = None
+ try:
+ cfg_layer = config.get("dxf2lib", "blockref_layer")
+ except Exception:
+ cfg_layer = None
- # Werte aus Config holen (Block: [dxf2lib])
+ if cfg_layer and cfg_layer.strip():
+ blockref_layer = cfg_layer.strip()
+ else:
+ # Dominanten Ursprungs-Layer verwenden (Mehrheit der Entities)
+ layer_counts = {}
+ for e in entities:
+ ln = getattr(e.dxf, "layer", None)
+ if not ln:
+ continue
+ layer_counts[ln] = layer_counts.get(ln, 0) + 1
+ if layer_counts:
+ blockref_layer = max(layer_counts.items(), key=lambda kv: kv[1])[0]
+
+ if blockref_layer and blockref_layer not in doc.layers:
+ # Sicherstellen, dass der Layer existiert
+ try:
+ src_layer = src_doc.layers.get(blockref_layer)
+ doc.layers.add(
+ name=blockref_layer,
+ color=getattr(src_layer.dxf, "color", None),
+ linetype=getattr(src_layer.dxf, "linetype", None),
+ lineweight=getattr(src_layer.dxf, "lineweight", None),
+ )
+ except Exception:
+ doc.layers.add(name=blockref_layer)
+ except Exception:
+ blockref_layer = None
section = "dxf2lib"
text_height = get_cfg_value(section, "text_height", DEFAULTS["text_height"])
extra_block_space_x = get_cfg_value(section, "extra_block_space_x", DEFAULTS["extra_block_space_x"])
@@ -241,21 +306,33 @@ def create_block_library(input_dir, output_file, config, logger=None):
extra_text_space_y = get_cfg_value(section, "extra_text_space_y", DEFAULTS["extra_text_space_y"])
ausdehnung_x, ausdehung_y = ausdehnung[0], ausdehnung[1]
- block_spacing_y = ausdehung_y
- block_spacing_x = ausdehnung_x + extra_block_space_x
- max_blockspacing_y = max(max_blockspacing_y, block_spacing_y)
+ block_spacing_y = ausdehung_y + 400
+ block_spacing_x = ausdehnung_x + extra_block_space_x
+ max_blockspacing_x = max(max_blockspacing_x, block_spacing_x)
+ max_blockspacing_y = max(max_blockspacing_y, block_spacing_y)
+ x_offset += max_blockspacing_x
+ # Blockreferenz mit optionalem Layer einfügen (Entity-Layer bleiben erhalten)
+ if blockref_layer:
+ msp.add_blockref(name, insert=(x_offset, y_offset), dxfattribs={"layer": blockref_layer})
+ else:
+ msp.add_blockref(name, insert=(x_offset, y_offset))
+ # Text mit Blocknamen über dem Block
+
+ # Werte aus Config holen (Block: [dxf2lib])
+
msp.add_text(name, dxfattribs={'height': text_height, 'insert': (x_offset -ausdehnung_x/2 , y_offset + ausdehung_y/2 + extra_text_space_y)})
processed_files.append(filename)
blocks_in_row += 1
- x_offset += block_spacing_x # Abstand zwischen Blöcken in einer Reihe
+ # Abstand zwischen Blöcken in einer Reihe
if blocks_in_row == blocks_per_row:
blocks_in_row = 0
x_offset = 0
y_offset -= max_blockspacing_y # Neue Zeile, nach unten versetzt
max_blockspacing_y = 0
+ max_blockspacing_x = 0
if logger:
logger.info(f"Bibliotheks-DXF gespeichert: {output_file}")
@@ -297,6 +374,7 @@ def get_cfg_value(section, key, fallback):
except Exception:
return fallback
+
if __name__ == "__main__":
# Argumentparser für Kommandozeilenoptionen
parser = argparse.ArgumentParser(description="SVG/XML zu DXF Konverter")
@@ -332,10 +410,13 @@ if __name__ == "__main__":
print(f"Log-Verzeichnis erstellt: {log_dir}")
# Logger Setup
+ log_file = Path(os.environ['PROJECT_LOG']) / 'dxf2lib.log'
+ file_handler = logging.FileHandler(str(log_file), 'a', 'utf-8')
logger = setup_logger(log_dir, name='dxf2lib')
logger.info("=== DXF2LIB Verarbeitung gestartet ===")
logger.info(f"Input-Verzeichnis: {INPUT_DIR}")
logger.info(f"Output-Datei: {OUTPUT_FILE}")
+ logger.addHandler(file_handler)
# Lade Config-Datei
config = configparser.ConfigParser()