1#  Copyright (c) 2021, Manfred Moitzi
2#  License: MIT License
3import sys
4import pathlib
5import ezdxf
6from ezdxf import zoom
7from ezdxf.explode_mtext import MTextExplode
8
9if not ezdxf.options.use_matplotlib:
10    print("The Matplotlib package is required.")
11    sys.exit(1)
12
13DIR = pathlib.Path('~/Desktop/Outbox').expanduser()
14
15LOREM_IPSUM = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam " \
16              "nonumy eirmod tempor {\C1invidunt ut labore} et dolore mag{\C3na al}iquyam " \
17              "erat, sed {\C5diam voluptua.} At vero eos et accusam et justo duo dolores " \
18              "et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est " \
19              "Lorem ipsum dolor sit amet."
20LEFT = LOREM_IPSUM + "\n\n"
21CENTER = r"\pxqc;" + LOREM_IPSUM + "\n\n"
22RIGHT = r"\pxqr;" + LOREM_IPSUM + "\n\n"
23JUSTIFIED = r"\pi1,qj;" + LOREM_IPSUM + "\n\n"
24
25
26def new_doc(content: str, width: float = 30):
27    doc = ezdxf.new(setup=True)
28    msp = doc.modelspace()
29    mtext = msp.add_mtext(content, dxfattribs={
30        "layer": "MTEXT_EXPLODE",
31        "width": width,
32        "char_height": 1,
33        "color": 7,
34        "style": "OpenSans",
35        "line_spacing_style": ezdxf.const.MTEXT_EXACT
36    })
37    mtext.set_bg_color(None, text_frame=True)
38    zoom.extents(msp)
39    return doc
40
41
42def explode_mtext(doc, destroy=True):
43    msp = doc.modelspace()
44    xpl = MTextExplode(msp)
45    for mtext in msp.query("MTEXT"):
46        xpl.explode(mtext, destroy=destroy)
47        if mtext.is_alive:
48            mtext.dxf.layer = "SOURCE"
49    xpl.finalize()  # create required text styles
50    zoom.extents(msp)
51    return doc
52
53
54def create(filename):
55    doc = new_doc(LEFT + CENTER + RIGHT + JUSTIFIED)
56    doc.saveas(DIR / filename)
57    return doc
58
59
60def load(filename):
61    return ezdxf.readfile(DIR / filename)
62
63
64def explode(doc, filename):
65    doc = explode_mtext(doc, destroy=True)
66    doc.saveas(DIR / filename)
67
68
69if __name__ == '__main__':
70    doc = create("mtext_source.dxf")
71    # doc = load("mtext_source.dxf")
72    explode(doc, "mtext_xplode.dxf")
73