Layer farben werden in plant2dxf angenommen (Layer selber nicht), dxf2lib wurde refrectored für die Leserlichkeit

This commit is contained in:
2025-09-08 15:42:36 +02:00
parent 3905da309c
commit 50f2d5f50e
2 changed files with 100 additions and 44 deletions
+54 -35
View File
@@ -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)
# Basis­punkt ü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)