From c6cb095f781ecac9d2ced11e3e6e4c3eabae6d73 Mon Sep 17 00:00:00 2001 From: lertlmaier Date: Mon, 28 Jul 2025 16:22:30 +0200 Subject: [PATCH] =?UTF-8?q?Erweiterung=20der=20Bounding=20Box-Berechnung?= =?UTF-8?q?=20f=C3=BCr=20POLYLINE-Entities=20und=20Filterung=20der=20Entit?= =?UTF-8?q?ies=20nach=20erlaubten=20Typen.=20Anpassung=20der=20Platzierung?= =?UTF-8?q?=20von=20Bl=C3=B6cken=20in=20Reihen=20und=20Spalten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/dxf2lib | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/lib/dxf2lib b/lib/dxf2lib index 9f61079..7d8f196 100644 --- a/lib/dxf2lib +++ b/lib/dxf2lib @@ -23,18 +23,31 @@ def get_bbox(entities): max_x, max_y = float('-inf'), float('-inf') for e in entities: try: - 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: + # Für POLYLINE-Entities: Bounding Box manuell berechnen + if e.dxftype() == "POLYLINE": + if hasattr(e, 'vertices') and len(e.vertices) > 0: + for vertex in e.vertices: + if hasattr(vertex, 'dxf') and hasattr(vertex.dxf, 'location'): + x, y = vertex.dxf.location.x, vertex.dxf.location.y + min_x, min_y = min(min_x, x), min(min_y, y) + max_x, max_y = max(max_x, x), max(max_y, y) + 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 if min_x == float('inf'): return None return Vec2((min_x + max_x) / 2, (min_y + max_y) / 2) x_offset = 0 +y_offset = 0 +blocks_in_row = 0 for filename in os.listdir(INPUT_DIR): if not filename.lower().endswith(".dxf"): @@ -47,6 +60,9 @@ for filename in os.listdir(INPUT_DIR): src_doc = ezdxf.readfile(filepath) src_msp = src_doc.modelspace() entities = list(src_msp) + allowed_types = {"LINE", "LWPOLYLINE", "POLYLINE", "SPLINE", "CIRCLE", "ARC"} + filtered_entities = [e for e in entities if e.dxftype() in allowed_types] + entities = filtered_entities except Exception as e: print(f"Fehler beim Lesen von {filename}: {e}") continue @@ -67,9 +83,14 @@ for filename in os.listdir(INPUT_DIR): except Exception as err: print(f"Fehler in {filename}: {err}") - # Optional Vorschau - msp.add_blockref(name, insert=(x_offset, 0)) - x_offset += 200 # Abstand zwischen Blöcken + # Platzierung in Reihen und Spalten + msp.add_blockref(name, insert=(x_offset, y_offset)) + blocks_in_row += 1 + x_offset += 250 # Abstand zwischen Blöcken in einer Reihe + if blocks_in_row == 20: + blocks_in_row = 0 + x_offset = 0 + y_offset -= 500 # Neue Zeile, nach unten versetzt print(f"Bibliotheks-DXF gespeichert: {OUTPUT_FILE}") doc.saveas(OUTPUT_FILE)