File: mtext_rendering_by_matplotlib.py

package info (click to toggle)
ezdxf 1.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 104,528 kB
  • sloc: python: 182,341; makefile: 116; lisp: 20; ansic: 4
file content (83 lines) | stat: -rw-r--r-- 2,357 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#  Copyright (c) 2021, Manfred Moitzi
#  License: MIT License
from typing import List
import pathlib
import ezdxf
from ezdxf.math import Vec2
from ezdxf.tools.text_size import mtext_size, WordSizeDetector
from ezdxf import path, colors
from ezdxf.addons import text2path
from ezdxf.addons import MTextExplode

CWD = pathlib.Path("~/Desktop/Outbox").expanduser()
if not CWD.exists():
    CWD = pathlib.Path(".")


def rect(p1: Vec2, p2: Vec2) -> List[Vec2]:
    return [
        p1,
        Vec2(p2.x, p1.y),
        p2,
        Vec2(p1.x, p2.y),
    ]


def main():
    doc = ezdxf.new()
    doc.styles.add("ARIAL", font="arial.ttf")
    box_layer = doc.layers.add(
        "bounding boxes based on Matplotlib", color=colors.MAGENTA
    )
    mtext_layer = doc.layers.add("MTEXT by current viewer")
    path_layer = doc.layers.add(
        "path rendering by Matplotlib", color=colors.YELLOW
    )

    msp = doc.modelspace()
    mtext = msp.add_mtext(
        "111111\n22222\n3333",
        dxfattribs={"style": "ARIAL", "layer": mtext_layer.dxf.name},
    )
    print(f"MTEXT width: {mtext.dxf.width}")
    print(f"MTEXT cap height: {mtext.dxf.char_height}")

    # Add bounding boxes for all words:
    word_size_detector = WordSizeDetector()
    size = mtext_size(mtext, tool=word_size_detector)
    for p1, p2 in word_size_detector.word_boxes():
        msp.add_lwpolyline(
            rect(p1, p2), close=True, dxfattribs={"layer": box_layer.dxf.name}
        )

    # Add bounding boxes for whole MTEXT entity:
    msp.add_lwpolyline(
        rect(Vec2(0, -size.total_height), Vec2(size.total_width, 0)),
        close=True,
        dxfattribs={"layer": box_layer.dxf.name},
    )

    # Add path renderings done by Matplotlib::
    with MTextExplode(msp) as mtxpl:
        mtxpl.explode(mtext, destroy=False)

    for text_entity in msp.query("TEXT"):
        text_path = text2path.make_path_from_entity(text_entity)
        path.render_lwpolylines(
            msp,
            [text_path],
            dxfattribs={
                "layer": path_layer.dxf.name,
            },
        )
        text_entity.destroy()

    doc.set_modelspace_vport(
        size.total_height * 1.1,
        center=(size.total_width / 2, -size.total_height / 2),
    )
    doc.saveas(CWD / "mtext_rendering_by_matplotlib.dxf")


if __name__ == "__main__":
    main()