diff --git a/lib/plant2dxf.py b/lib/plant2dxf.py index 4d7c07a..d6a94a5 100644 --- a/lib/plant2dxf.py +++ b/lib/plant2dxf.py @@ -92,22 +92,19 @@ def import_block(block_name: str, from_doc, to_doc) -> None: # 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: + used_layer_names = {e.dxf.layer for e in src if hasattr(e.dxf, "layer")} + for layer_name in used_layer_names: + if layer_name and 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"), + 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 to_doc.layers.add(name=layer_name) except Exception: pass @@ -128,7 +125,7 @@ def import_block(block_name: str, from_doc, to_doc) -> None: import_block(ent.dxf.name,from_doc, to_doc) tgt.add_entity(ent.copy()) - + def berechne_hoehe(csv_path, logger=None): y_werte = [] try: @@ -252,6 +249,7 @@ def draw_kreisel_drehrichtung_markierung(msp, pos1, pos2, merkmale, lib_doc, doc if drehrichtung == "GUZS": rotation += 180 import_block("S-LP", lib_doc, doc) + bref = msp.add_blockref("S-LP", (px, py), dxfattribs={"rotation": rotation}) if verbose: print(f"[INFO] Drehrichtung '{drehrichtung}': S-LP oben bei ({px:.1f}, {py:.1f}), rot={rotation:.1f}") @@ -363,6 +361,33 @@ def handle_omniflo(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols) print(f"[WARN] Omniflo-Block '{blockname}' nicht in Bibliothek {lib_doc.filename}. Überspringe {teileid}.") return import_block(blockname, lib_doc, doc) + src = lib_doc.blocks[blockname] + try: + used_layer_names = {e.dxf.layer for e in src 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 = lib_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 + layer_counts = {} + for e in src: + ln = getattr(e.dxf, "layer", None) + if not ln: + continue + if ln != "BOUNDING_BOX": + layer_counts[ln] = layer_counts.get(ln, 0) + 1 + if layer_counts: + blockref_layer = max(layer_counts.items(), key=lambda kv: kv[1])[0] lib_block = lib_doc.blocks.get(blockname) imported_block = doc.blocks.get(blockname) if hasattr(lib_block.block.dxf, "base_point"): @@ -370,9 +395,8 @@ def handle_omniflo(msp, teileid, merkmale, x, y, doc, lib_doc, verbose, symbols) 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, "layer": imported_block.block.dxf.layer }) + + bref = msp.add_blockref(blockname, (x, y), dxfattribs={"xscale": 1.0, "yscale":1.0,"rotation": drehung, "layer": blockref_layer}) bref.add_attrib( tag= "NAME",