Übernimmt nun die Layers und die Farben bei der Bibliothek Erstellung

This commit is contained in:
2025-09-08 10:48:59 +02:00
parent 566b3a0ada
commit 3905da309c
+95 -14
View File
@@ -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()