1# Created: 16.03.2011, 2018 rewritten for pytest
2# Copyright (C) 2011-2019, Manfred Moitzi
3# License: MIT License
4import pytest
5
6from ezdxf.entities.dimstyle import DimStyle
7from ezdxf.document import Drawing
8from ezdxf.lldxf.const import DXF12
9
10
11@pytest.fixture
12def dimstyle():
13    doc = Drawing.new()
14    doc.blocks.new('left_arrow')
15    doc.blocks.new('right_arrow')
16    doc.blocks.new('arrow')
17    doc.blocks.new('_DOT')
18    doc.blocks.new('_OPEN')
19    return DimStyle.new('FFFF', doc=doc, dxfattribs={
20        'name': 'DIMSTYLE1',
21    })
22
23
24def test_name(dimstyle):
25    assert 'DIMSTYLE1' == dimstyle.dxf.name
26
27
28def test_set_blk1_and_blk2_arrows(dimstyle):
29    dimstyle.set_arrows('', 'left_arrow', 'right_arrow')
30    assert dimstyle.dxf.dimblk == ''
31    assert dimstyle.dxf.dimblk1 == 'left_arrow'
32    assert dimstyle.dxf.dimblk2 == 'right_arrow'
33
34
35def test_set_both_arrows(dimstyle):
36    dimstyle.set_arrows('arrow')
37    assert dimstyle.dxf.dimblk == 'arrow'
38    assert dimstyle.dxf.dimblk1 == ''
39    assert dimstyle.dxf.dimblk2 == ''
40
41    dimstyle.set_arrows(blk1='OPEN', blk2='DOT')
42    assert dimstyle.dxf.dimblk == ''
43    assert dimstyle.dxf.dimblk1 == 'OPEN'
44    assert dimstyle.dxf.dimblk2 == 'DOT'
45
46
47def test_set_tick(dimstyle):
48    dimstyle.set_tick(.25)
49    assert dimstyle.dxf.dimtsz == .25
50
51
52def test_set_text_align(dimstyle):
53    dimstyle.set_text_align(valign='above')
54    assert dimstyle.dxf.dimtad == 1
55
56
57def test_set_text_format(dimstyle):
58    dimstyle.set_text_format(prefix='+', postfix=' cm', rnd=.5, leading_zeros=False, trailing_zeros=False)
59    assert dimstyle.dxf.dimpost == '+<> cm'
60    assert dimstyle.dxf.dimrnd == .5
61    assert dimstyle.dxf.dimzin == 12
62
63
64@pytest.fixture(scope='module')
65def dimstyle2():
66    import ezdxf
67    doc = ezdxf.new('R2007', setup=('linetypes',))
68    doc.blocks.new('left_arrow')
69    doc.blocks.new('right_arrow')
70    doc.blocks.new('TestArrow')
71    doc.blocks.new('arrow')
72    doc.styles.new('TestStyle')
73    return doc.dimstyles.new('testing')
74
75
76def test_handle_export(dimstyle2):
77    dimstyle2.set_arrows('', 'left_arrow', 'right_arrow', 'arrow')
78    # test handles
79    blocks = dimstyle2.doc.blocks
80    left_arrow = blocks.get('left_arrow')
81    right_arrow = blocks.get('right_arrow')
82    leader_arrow = blocks.get('arrow')
83
84    # prepare for export
85    dimstyle2.set_handles()
86    assert dimstyle2.dxf.hasattr('dimblk_handle') is False
87    assert dimstyle2.dxf.dimblk1_handle == left_arrow.block_record_handle
88    assert dimstyle2.dxf.dimblk2_handle == right_arrow.block_record_handle
89    assert dimstyle2.dxf.dimldrblk_handle == leader_arrow.block_record_handle
90
91
92def test_dont_write_handles_for_R12(dimstyle):
93    from ezdxf.lldxf.tagwriter import TagWriter
94    from io import StringIO
95    s = StringIO()
96    t = TagWriter(s)
97    t.dxfversion = DXF12
98    t.write_handles = False
99    dimstyle.export_dxf(t)
100    result = s.getvalue()
101    assert '105\nFFFF\n' not in result
102
103
104def test_dimstyle_name(dimstyle2):
105    assert 'testing' == dimstyle2.dxf.name
106
107
108def test_dimstyle_blk1_and_blk2_ticks(dimstyle2):
109    dimstyle2.set_arrows('', 'left_arrow', 'right_arrow')
110    assert dimstyle2.get_dxf_attrib('dimblk') == ''
111    assert dimstyle2.get_dxf_attrib('dimblk1') == 'left_arrow'
112    assert dimstyle2.get_dxf_attrib('dimblk2') == 'right_arrow'
113
114
115def test_dimstyle_both_ticks(dimstyle2):
116    dimstyle2.set_arrows('arrow')
117    assert dimstyle2.get_dxf_attrib('dimblk') == 'arrow'
118    assert dimstyle2.get_dxf_attrib('dimblk1') == ''  # closed filled
119    assert dimstyle2.get_dxf_attrib('dimblk2') == ''  # closed filled
120
121    assert dimstyle2.get_dxf_attrib('dimblk1') == ''
122    assert dimstyle2.get_dxf_attrib('dimblk2') == ''
123
124
125def test_dimstyle_virtual_dimtxsty_attribute(dimstyle2):
126    dimstyle2.dxf.dimtxsty = 'TestStyle'
127    assert dimstyle2.dxf.dimtxsty == 'TestStyle'
128
129    # prepare for export
130    dimstyle2.set_handles()
131    assert dimstyle2.dxf.dimtxsty_handle == dimstyle2.doc.styles.get('TestStyle').dxf.handle
132
133
134def test_dimstyle_virtual_dimldrblk_attribute(dimstyle2):
135    dimstyle2.dxf.dimldrblk = 'CLOSED'
136
137    dimstyle2.dxf.dimldrblk = 'TestArrow'
138    assert dimstyle2.dxf.dimldrblk == 'TestArrow'
139
140
141def test_dimstyle_virtual_linetypes_attributes(dimstyle2):
142    dimstyle2.dxf.dimltype = 'DOT2'
143    assert dimstyle2.dxf.dimltype == 'DOT2'
144
145    dimstyle2.dxf.dimltex1 = 'DOT'
146    assert dimstyle2.dxf.dimltex1 == 'DOT'
147
148    dimstyle2.dxf.dimltex2 = 'DOTX2'
149    assert dimstyle2.dxf.dimltex2 == 'DOTX2'
150
151    # prepare for export
152    dimstyle2.set_handles()
153    assert dimstyle2.dxf.dimltype_handle == dimstyle2.doc.linetypes.get('DOT2').dxf.handle
154    assert dimstyle2.dxf.dimltex1_handle == dimstyle2.doc.linetypes.get('DOT').dxf.handle
155    assert dimstyle2.dxf.dimltex2_handle == dimstyle2.doc.linetypes.get('DOTX2').dxf.handle
156
157
158def test_dimstyle_group_codes(dimstyle):
159    codes = DimStyle.CODE_TO_DXF_ATTRIB
160    assert 105 not in codes
161    assert 2 not in codes
162
163
164def test_dimstyle_set_align(dimstyle2):
165    dimstyle2.set_text_align(valign='above')
166    assert dimstyle2.dxf.dimtad == 1
167    dimstyle2.set_text_align(halign='above1')
168    assert dimstyle2.dxf.dimjust == 3
169
170
171def test_set_text_format_2(dimstyle2):
172    dimstyle2.set_text_format(
173        prefix='+',
174        postfix=' cm',
175        rnd=.5,
176        dec=2,
177        sep='.',
178        leading_zeros=False,
179        trailing_zeros=False,
180    )
181    assert dimstyle2.dxf.dimpost == '+<> cm'
182    assert dimstyle2.dxf.dimrnd == .5
183    assert dimstyle2.dxf.dimdec == 2
184    assert dimstyle2.dxf.dimdsep == ord('.')
185    assert dimstyle2.dxf.dimzin == 12
186
187
188def test_set_dimline_format(dimstyle2):
189    dimstyle2.set_dimline_format(
190        color=2,
191        linetype='DOT',
192        lineweight=18,
193        extension=.33,
194        disable1=True,
195        disable2=True,
196    )
197    assert dimstyle2.dxf.dimclrd == 2
198    assert dimstyle2.dxf.dimltype == 'DOT'
199    assert dimstyle2.dxf.dimlwd == 18
200    assert dimstyle2.dxf.dimdle == .33
201    assert dimstyle2.dxf.dimsd1 == 1
202    assert dimstyle2.dxf.dimsd2 == 1
203
204
205def test_set_extline_format(dimstyle2):
206    dimstyle2.set_extline_format(
207        color=2,
208        lineweight=18,
209        extension=.33,
210        offset=.77,
211        fixed_length=.5,
212    )
213    assert dimstyle2.dxf.dimclre == 2
214    assert dimstyle2.dxf.dimlwe == 18
215    assert dimstyle2.dxf.dimexe == .33
216    assert dimstyle2.dxf.dimexo == .77
217    assert dimstyle2.dxf.dimfxlon == 1
218    assert dimstyle2.dxf.dimfxl == .5
219
220
221def test_set_extline1(dimstyle2):
222    dimstyle2.set_extline1(
223        linetype='DOT',
224        disable=True,
225    )
226    assert dimstyle2.dxf.dimltex1 == 'DOT'
227    assert dimstyle2.dxf.dimse1 == 1
228
229
230def test_set_extline2(dimstyle2):
231    dimstyle2.set_extline2(
232        linetype='DOT',
233        disable=True,
234    )
235    assert dimstyle2.dxf.dimltex2 == 'DOT'
236    assert dimstyle2.dxf.dimse2 == 1
237