diff --git a/masque/file/dxf.py b/masque/file/dxf.py index db01f51..0c19b5a 100644 --- a/masque/file/dxf.py +++ b/masque/file/dxf.py @@ -212,8 +212,10 @@ def _read_block(block: ezdxf.layouts.BlockLayout | ezdxf.layouts.Modelspace) -> if isinstance(element, LWPolyline | Polyline): if isinstance(element, LWPolyline): points = numpy.asarray(element.get_points()) - elif isinstance(element, Polyline): + is_closed = element.closed + else: points = numpy.asarray([pp.xyz for pp in element.points()]) + is_closed = element.is_closed attr = element.dxfattribs() layer = attr.get('layer', DEFAULT_LAYER) @@ -233,7 +235,6 @@ def _read_block(block: ezdxf.layouts.BlockLayout | ezdxf.layouts.Modelspace) -> if width == 0: width = attr.get('const_width', 0) - is_closed = element.closed verts = points[:, :2] if is_closed and (len(verts) < 2 or not numpy.allclose(verts[0], verts[-1])): verts = numpy.vstack((verts, verts[0])) diff --git a/masque/test/test_dxf.py b/masque/test/test_dxf.py index e6e6e7e..0c0a1a3 100644 --- a/masque/test/test_dxf.py +++ b/masque/test/test_dxf.py @@ -1,5 +1,6 @@ - +import io import numpy +import ezdxf from numpy.testing import assert_allclose from pathlib import Path @@ -109,3 +110,20 @@ def test_dxf_manhattan_precision(tmp_path: Path): target_name = next(k for k in read_top.refs if k.upper() == "SUB") ref = read_top.refs[target_name][0] assert isinstance(ref.repetition, Grid), "Grid should be preserved for 90-degree rotation" + + +def test_dxf_read_legacy_polyline() -> None: + doc = ezdxf.new() + msp = doc.modelspace() + msp.add_polyline2d([(0, 0), (10, 0), (10, 10)], dxfattribs={"layer": "legacy"}).close(True) + + stream = io.StringIO() + doc.write(stream) + stream.seek(0) + + read_lib, _ = dxf.read(stream) + top_pat = read_lib.get("Model") or list(read_lib.values())[0] + + polys = [shape for shape in top_pat.shapes["legacy"] if isinstance(shape, Polygon)] + assert len(polys) == 1 + assert_allclose(polys[0].vertices, [[0, 0], [10, 0], [10, 10]])