Übernimmt nun die Layers und die Farben bei der Bibliothek Erstellung
This commit is contained in:
+95
-14
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user