Ü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
|
import configparser
|
||||||
from utils import check_environment_var, setup_logger
|
from utils import check_environment_var, setup_logger
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
def get_bbox(entities):
|
def get_bbox(entities):
|
||||||
@@ -161,7 +162,9 @@ def create_block_library(input_dir, output_file, config, logger=None):
|
|||||||
|
|
||||||
error_files = []
|
error_files = []
|
||||||
processed_files = []
|
processed_files = []
|
||||||
|
max_blockspacing_x = 0
|
||||||
max_blockspacing_y = 0
|
max_blockspacing_y = 0
|
||||||
|
|
||||||
for filename in os.listdir(input_dir):
|
for filename in os.listdir(input_dir):
|
||||||
if not filename.lower().endswith(".dxf"):
|
if not filename.lower().endswith(".dxf"):
|
||||||
continue
|
continue
|
||||||
@@ -176,15 +179,17 @@ def create_block_library(input_dir, output_file, config, logger=None):
|
|||||||
entities = list(src_msp)
|
entities = list(src_msp)
|
||||||
allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC"}
|
allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC"}
|
||||||
filtered_entities = []
|
filtered_entities = []
|
||||||
insert = 0
|
|
||||||
for e in entities:
|
for e in entities:
|
||||||
if e.dxftype() in allowed_types:
|
if e.dxftype() in allowed_types:
|
||||||
filtered_entities.append(e)
|
filtered_entities.append(e)
|
||||||
else:
|
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
|
entities = filtered_entities
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
error_msg = f"Fehler beim Lesen von {filename}: {e}"
|
error_msg = f"Fehler beim Lesen von {filename}: {e}"
|
||||||
if logger:
|
if logger:
|
||||||
@@ -194,6 +199,26 @@ def create_block_library(input_dir, output_file, config, logger=None):
|
|||||||
error_files.append((filename, error_msg))
|
error_files.append((filename, error_msg))
|
||||||
continue
|
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)
|
center, ausdehnung = get_bbox(entities)
|
||||||
if center is None:
|
if center is None:
|
||||||
error_msg = f"Keine gültige Geometrie in {filename}"
|
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)
|
doc.blocks.delete_block(name)
|
||||||
|
|
||||||
blk = doc.blocks.new(name=name, base_point=(0,0))
|
blk = doc.blocks.new(name=name, base_point=(0,0))
|
||||||
|
|
||||||
for e in entities:
|
for e in entities:
|
||||||
try:
|
try:
|
||||||
cp = e.copy()
|
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)
|
blk.add_entity(cp)
|
||||||
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
error_msg = f"Fehler beim Verarbeiten von Entity {e.dxftype()} in {filename}: {err}"
|
error_msg = f"Fehler beim Verarbeiten von Entity {e.dxftype()} in {filename}: {err}"
|
||||||
if logger:
|
if logger:
|
||||||
@@ -223,17 +255,50 @@ def create_block_library(input_dir, output_file, config, logger=None):
|
|||||||
error_files.append((filename, error_msg))
|
error_files.append((filename, error_msg))
|
||||||
|
|
||||||
# Platzierung in Reihen und Spalten
|
# Platzierung in Reihen und Spalten
|
||||||
# Attribut-Definition (ATTDEF) hinzufügen
|
# Attribut-Definition (ATTDEF) hinzufügen
|
||||||
blk.add_attdef(
|
blk.add_attdef(
|
||||||
tag="NAME",
|
tag="NAME",
|
||||||
insert=(0.2, 0.2), # Position relativ zum Blockursprung
|
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"
|
section = "dxf2lib"
|
||||||
text_height = get_cfg_value(section, "text_height", DEFAULTS["text_height"])
|
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"])
|
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"])
|
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]
|
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)})
|
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)
|
processed_files.append(filename)
|
||||||
blocks_in_row += 1
|
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:
|
if blocks_in_row == blocks_per_row:
|
||||||
|
|
||||||
blocks_in_row = 0
|
blocks_in_row = 0
|
||||||
x_offset = 0
|
x_offset = 0
|
||||||
y_offset -= max_blockspacing_y # Neue Zeile, nach unten versetzt
|
y_offset -= max_blockspacing_y # Neue Zeile, nach unten versetzt
|
||||||
max_blockspacing_y = 0
|
max_blockspacing_y = 0
|
||||||
|
max_blockspacing_x = 0
|
||||||
|
|
||||||
if logger:
|
if logger:
|
||||||
logger.info(f"Bibliotheks-DXF gespeichert: {output_file}")
|
logger.info(f"Bibliotheks-DXF gespeichert: {output_file}")
|
||||||
@@ -297,6 +374,7 @@ def get_cfg_value(section, key, fallback):
|
|||||||
except Exception:
|
except Exception:
|
||||||
return fallback
|
return fallback
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Argumentparser für Kommandozeilenoptionen
|
# Argumentparser für Kommandozeilenoptionen
|
||||||
parser = argparse.ArgumentParser(description="SVG/XML zu DXF Konverter")
|
parser = argparse.ArgumentParser(description="SVG/XML zu DXF Konverter")
|
||||||
@@ -332,10 +410,13 @@ if __name__ == "__main__":
|
|||||||
print(f"Log-Verzeichnis erstellt: {log_dir}")
|
print(f"Log-Verzeichnis erstellt: {log_dir}")
|
||||||
|
|
||||||
# Logger Setup
|
# 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 = setup_logger(log_dir, name='dxf2lib')
|
||||||
logger.info("=== DXF2LIB Verarbeitung gestartet ===")
|
logger.info("=== DXF2LIB Verarbeitung gestartet ===")
|
||||||
logger.info(f"Input-Verzeichnis: {INPUT_DIR}")
|
logger.info(f"Input-Verzeichnis: {INPUT_DIR}")
|
||||||
logger.info(f"Output-Datei: {OUTPUT_FILE}")
|
logger.info(f"Output-Datei: {OUTPUT_FILE}")
|
||||||
|
logger.addHandler(file_handler)
|
||||||
|
|
||||||
# Lade Config-Datei
|
# Lade Config-Datei
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
|
|||||||
Reference in New Issue
Block a user