diff --git a/masque/file/dxf.py b/masque/file/dxf.py index e8c7486..da35531 100644 --- a/masque/file/dxf.py +++ b/masque/file/dxf.py @@ -55,8 +55,7 @@ def write( tuple: (1, 2) -> '1.2' str: '1.2' -> '1.2' (no change) - DXF does not support shape repetition (only block repetition). Please call - library.wrap_repeated_shapes() before writing to file. + Shape repetitions are expanded into individual DXF entities. Other functions you may want to call: - `masque.file.oasis.check_valid_names(library.keys())` to check for invalid names @@ -344,16 +343,15 @@ def _shapes_to_elements( for layer, sseq in shapes.items(): attribs = dict(layer=_mlayer2dxf(layer)) for shape in sseq: + displacements = [numpy.zeros(2)] if shape.repetition is not None: - raise PatternError( - 'Shape repetitions are not supported by DXF.' - ' Please call library.wrap_repeated_shapes() before writing to file.' - ) + displacements = shape.repetition.displacements - for polygon in shape.to_polygons(): - xy_open = polygon.vertices - xy_closed = numpy.vstack((xy_open, xy_open[0, :])) - block.add_lwpolyline(xy_closed, dxfattribs=attribs) + for dd in displacements: + for polygon in shape.to_polygons(): + xy_open = polygon.vertices + dd + xy_closed = numpy.vstack((xy_open, xy_open[0, :])) + block.add_lwpolyline(xy_closed, dxfattribs=attribs) def _labels_to_texts( @@ -363,11 +361,17 @@ def _labels_to_texts( for layer, lseq in labels.items(): attribs = dict(layer=_mlayer2dxf(layer)) for label in lseq: - xy = label.offset - block.add_text( - label.string, - dxfattribs=attribs - ).set_placement(xy, align=TextEntityAlignment.BOTTOM_LEFT) + if label.repetition is None: + block.add_text( + label.string, + dxfattribs=attribs + ).set_placement(label.offset, align=TextEntityAlignment.BOTTOM_LEFT) + else: + for dd in label.repetition.displacements: + block.add_text( + label.string, + dxfattribs=attribs + ).set_placement(label.offset + dd, align=TextEntityAlignment.BOTTOM_LEFT) def _mlayer2dxf(layer: layer_t) -> str: