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()