1# Copyright (c) 2013-2021, Manfred Moitzi
2# License: MIT License
3import ezdxf
4
5
6def create_doc(filename):
7    def add_justify_text(content, p1, p2, align):
8        msp.add_text(content).set_pos(p1, p2, align)
9        msp.add_line(p1, p2)
10
11    def add_grid(pos, width, height):
12        attribs = {'height': 0.2, 'color': 3}
13        x, y = pos
14        dx = width / 2
15        dy = height / 2
16        msp.add_line((x, y), (x, y + height))
17        msp.add_line((x + dx, y), (x + dx, y + height))
18        msp.add_line((x + width, y), (x + width, y + height))
19
20        msp.add_line((x, y - 1), (x + width, y - 1))
21        msp.add_text('BASELINE ADJUSTMENTS', dxfattribs=attribs).set_pos((x, y - 1.5))
22        msp.add_text('LEFT', dxfattribs=attribs).set_pos((x, y - 1), align='LEFT')
23        msp.add_text('CENTER', dxfattribs=attribs).set_pos((x + dx, y - 1), align='CENTER')
24        msp.add_text('RIGHT', dxfattribs=attribs).set_pos((x + width, y - 1), align='RIGHT')
25
26        attribs['color'] = 2
27        msp.add_line((x, y), (x + width, y))
28        msp.add_text('BOTTOM_LEFT', dxfattribs=attribs).set_pos((x, y), align='BOTTOM_LEFT')
29        msp.add_text('BOTTOM_CENTER', dxfattribs=attribs).set_pos((x + dx, y), align='BOTTOM_CENTER')
30        msp.add_text('BOTTOM_RIGHT', dxfattribs=attribs).set_pos((x + width, y), align='BOTTOM_RIGHT')
31
32        y += dy
33
34        msp.add_line((x, y), (x + width, y))
35        msp.add_text('MIDDLE_LEFT', dxfattribs=attribs).set_pos((x, y), align='MIDDLE_LEFT')
36        msp.add_text('MIDDLE_CENTER', dxfattribs=attribs).set_pos((x + dx, y), align='MIDDLE_CENTER')
37        msp.add_text('MIDDLE_RIGHT', dxfattribs=attribs).set_pos((x + width, y), align='MIDDLE_RIGHT')
38
39        y += dy
40
41        msp.add_line((x, y), (x + width, y))
42        msp.add_text('TOP_LEFT', dxfattribs=attribs).set_pos((x, y), align='TOP_LEFT')
43        msp.add_text('TOP_CENTER', dxfattribs=attribs).set_pos((x + dx, y), align='TOP_CENTER')
44        msp.add_text('TOP_RIGHT', dxfattribs=attribs).set_pos((x + width, y), align='TOP_RIGHT')
45
46    def show_insert_points(msp):
47        for text in msp.query('TEXT'):
48            msp.add_circle(text.dxf.insert, radius=.1, dxfattribs={
49                'color': 1,
50                'layer': "INSERT_POINTS",
51            })
52            msp.add_circle(text.dxf.align_point, radius=.075, dxfattribs={
53                'color': 2,
54                'layer': "INSERT_POINTS",
55            })
56
57    def shift_insert_point(msp):
58        for text in msp.query('TEXT'):
59            text.dxf.insert += (1, 1)
60
61    doc = ezdxf.new(dxfversion='R2004')
62    msp = doc.modelspace()
63    add_grid((0, 0), width=10, height=10)
64    # shift_insert_point(msp)
65
66    add_justify_text("ALIGNED-TEXT-ALIGNED-TEXT-ALIGNED-TEXT-ALIGNED-TEXT", (15, 0), (35, 5), 'ALIGNED')
67    add_justify_text("FITTED-TEXT-FITTED-TEXT-FITTED-TEXT-FITTED-TEXT", (15, 10), (35, 5), 'FIT')
68    add_justify_text("MIDDLE", (15, 15), (35, 10), 'MIDDLE')
69    show_insert_points(msp)
70
71    doc.set_modelspace_vport(height=30, center=(15, 0))
72    doc.saveas(filename)
73
74
75if __name__ == '__main__':
76    create_doc("text_alignments.dxf")
77