From 50f2d5f50ef766bbd99bfeef56f5d52f272b25ed Mon Sep 17 00:00:00 2001
From: Paul Wolok
Date: Mon, 8 Sep 2025 15:42:36 +0200
Subject: [PATCH] =?UTF-8?q?Layer=20farben=20werden=20in=20plant2dxf=20ange?=
=?UTF-8?q?nommen=20(Layer=20selber=20nicht),=20dxf2lib=20wurde=20refrecto?=
=?UTF-8?q?red=20f=C3=BCr=20die=20Leserlichkeit?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lib/dxf2lib.py | 89 +++++++++++++++++++++++++++++-------------------
lib/plant2dxf.py | 55 +++++++++++++++++++++++++-----
2 files changed, 100 insertions(+), 44 deletions(-)
diff --git a/lib/dxf2lib.py b/lib/dxf2lib.py
index e9c2fd5..4f74158 100644
--- a/lib/dxf2lib.py
+++ b/lib/dxf2lib.py
@@ -112,16 +112,6 @@ def get_bbox(entities):
(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)
-
-
- else:
-
- # Für andere Entity-Typen: Standard bbox() verwenden
- 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 as err:
print(f" BBox Fehler für {e.dxftype()}: {err}")
continue
@@ -148,7 +138,7 @@ def create_block_library(input_dir, output_file, config, logger=None):
logger: Optionaler Logger für Logging-Ausgaben
Note:
- - Unterstützte Entity-Typen: LINE, LWPOLYLINE, POLYLINE, SPLINE, CIRCLE, ARC
+ - Unterstützte Entity-Typen: LINE, LWPOLYLINE, POLYLINE, SPLINE, CIRCLE, ARC, INSERT
- Blöcke werden zentriert und in einem 20x20 Raster angeordnet
- Erstellt eine Log-Datei mit Zeitstempel für fehlerhafte Dateien
- Automatische Erstellung des Output-Verzeichnisses falls nötig
@@ -177,7 +167,7 @@ def create_block_library(input_dir, output_file, config, logger=None):
src_doc = ezdxf.readfile(filepath)
src_msp = src_doc.modelspace()
entities = list(src_msp)
- allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC"}
+ allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC", "INSERT"}
filtered_entities = []
for e in entities:
@@ -217,7 +207,7 @@ def create_block_library(input_dir, output_file, config, logger=None):
doc.layers.add(name=layer_name)
except Exception:
pass
- # if filename == "834372100":
+
center, ausdehnung = get_bbox(entities)
if center is None:
@@ -233,39 +223,26 @@ 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()
- # 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
+ # Sicherstellen, dass referenzierte Blöcke für INSERT verfügbar sind
+ if e.dxftype() == "INSERT":
+ handle_insert_entities(doc, src_doc, e)
+ cp = copy_entity(logger, error_files, filename, e, center)
+ if cp:
blk.add_entity(cp)
-
- except Exception as err:
- error_msg = f"Fehler beim Verarbeiten von Entity {e.dxftype()} in {filename}: {err}"
- if logger:
- logger.error(error_msg)
- else:
- print(error_msg)
- error_files.append((filename, error_msg))
-
# Platzierung in Reihen und Spalten
# Attribut-Definition (ATTDEF) hinzufügen
blk.add_attdef(
tag="NAME",
insert=(0.2, 0.2), # Position relativ zum Blockursprung
- text="Default Text"
+
)
- # Blockreferenz-Layer bestimmen
+ # Blockreferenz-Layer bestimmen
blockref_layer = None
try:
- # Konfiguration erlaubt expliziten Layernamen
+ #Konfiguration erlaubt expliziten Layernamen
cfg_layer = None
try:
cfg_layer = config.get("dxf2lib", "blockref_layer")
@@ -360,6 +337,48 @@ def create_block_library(input_dir, output_file, config, logger=None):
doc.saveas(output_file)
+def copy_entity(logger, error_files, filename, e, center):
+ try:
+ cp = e.copy()
+ # 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
+ return cp
+
+ except Exception as err:
+ error_msg = f"Fehler beim Verarbeiten von Entity {e.dxftype()} in {filename}: {err}"
+ if logger:
+ logger.error(error_msg)
+ else:
+ print(error_msg)
+ error_files.append((filename, error_msg))
+ return None
+
+def handle_insert_entities(doc, src_doc, e):
+
+ try:
+ ref_name = e.dxf.name
+ if ref_name not in doc.blocks and ref_name in src_doc.blocks:
+ src_blk = src_doc.blocks[ref_name]
+ dst_blk = doc.blocks.new(name=ref_name)
+ # Basispunkt übernehmen, falls vorhanden
+ try:
+ dst_blk.block.dxf.base_point = src_blk.block.dxf.base_point
+
+ except Exception:
+ pass
+ for ent in src_blk:
+ dst_blk.add_entity(ent.copy())
+
+
+ except Exception:
+ pass
+
+
# Standardwerte (falls nicht in der Config)
DEFAULTS = {
"text_height": 20, # Schriftgröße des Texts (in DXF-Einheiten)
diff --git a/lib/plant2dxf.py b/lib/plant2dxf.py
index 7c8eaf5..9c1a996 100644
--- a/lib/plant2dxf.py
+++ b/lib/plant2dxf.py
@@ -78,13 +78,51 @@ def parse_merkmale(merkmale_str: str) -> dict:
return {}
def import_block(block_name: str, from_doc, to_doc) -> None:
- """Importiert Blockdefinition block_name von from_doc nach to_doc."""
+ """Importiert Blockdefinition block_name von from_doc nach to_doc.
+
+ - Kopiert alle Entities des Blocks
+ - Stellt sicher, dass benutzte Layer im Ziel existieren (mit Eigenschaften)
+ - Übernimmt Basispunkt und Block-Layer, falls vorhanden
+ """
if block_name in to_doc.blocks:
return
if block_name not in from_doc.blocks:
raise ValueError(f"Block '{block_name}' nicht in Bibliothek gefunden.")
src = from_doc.blocks[block_name]
+
+ # Sicherstellen, dass alle verwendeten Layer existieren
+ try:
+ used_layers = set()
+ for ent in src:
+ ln = getattr(getattr(ent, "dxf", object()), "layer", None)
+ if ln:
+ used_layers.add(ln)
+ for layer_name in used_layers:
+ if layer_name not in to_doc.layers:
+ try:
+ src_layer = from_doc.layers.get(layer_name)
+ to_doc.layers.add(
+ name=layer_name,
+ color=getattr(src_layer.dxf, "color"),
+ linetype=getattr(src_layer.dxf, "linetype"),
+ lineweight=getattr(src_layer.dxf, "lineweight"),
+ )
+ except Exception:
+ to_doc.layers.add(name=layer_name)
+ except Exception:
+ pass
+
tgt = to_doc.blocks.new(name=block_name)
+ # Basispunkt/Layer des Blocks übernehmen, wenn vorhanden
+ try:
+ tgt.block.dxf.base_point = src.block.dxf.base_point
+ except Exception:
+ pass
+ try:
+ tgt.block.dxf.layer = src.block.dxf.layer
+ except Exception:
+ pass
+
for ent in src:
tgt.add_entity(ent.copy())
@@ -311,9 +349,6 @@ def handle_omniflo(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols)
print(f"[INFO] Omniflo Gerade → {teileid} Linie von ({start[0]:.1f}, {start[1]:.1f}) nach ({ende[0]:.1f}, {ende[1]:.1f})")
return
# Sonst wie gehabt: Block mit SivasNummer
-
-
-
if not lib_doc:
print("[WARN] lib_doc nicht verfügbar, Block wird nicht eingefügt.")
return
@@ -329,19 +364,21 @@ def handle_omniflo(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols)
imported_block = doc.blocks.get(blockname)
if hasattr(lib_block.block.dxf, "base_point"):
imported_block.block.dxf.base_point = lib_block.block.dxf.base_point
-
+ if hasattr(lib_block.block.dxf, "layer"):
+ imported_block.block.dxf.layer= lib_block.block.dxf.layer
drehung = merkmale.get("Drehung")
if drehung not in (0.0, 180.0):
drehung = drehung -180
- bref = msp.add_blockref(blockname, (x, y), dxfattribs={"xscale": 1.0, "yscale":1.0,"rotation": drehung })
+ bref = msp.add_blockref(blockname, (x, y), dxfattribs={"xscale": 1.0, "yscale":1.0,"rotation": drehung, "layer": imported_block.block.dxf.layer })
bref.add_attrib(
tag= "NAME",
text= merkmale.get("bezeichner"),
insert = (x,y),
- invisible =True
-
- )
+
+
+
+ )
bref.add_auto_attribs({ATTR_TAG: teileid})
if verbose:
print(f"[INFO] Block '{blockname}' (Omniflo) → {teileid} ({x:.1f}, {y:.1f})")