1# Copyright (c) 2018 Manfred Moitzi
2# License: MIT License
3import pytest
4from ezdxf.lldxf.packedtags import TagArray, VertexArray
5from ezdxf.lldxf.extendedtags import ExtendedTags
6from ezdxf.lldxf.tagwriter import TagCollector
7from ezdxf.math import UCS, Matrix44
8
9
10@pytest.fixture()
11def numbers():
12    return [1, 2, 3, 4]
13
14
15def test_tag_array_init(numbers):
16    array = TagArray(data=numbers)
17    for index, value in enumerate(array.values):
18        assert value == numbers[index]
19
20
21def test_tag_array_clone(numbers):
22    array = TagArray(data=numbers)
23    array2 = array.clone()
24    array2.values[-1] = 9999
25    assert array.values[:-1] == array2.values[:-1]
26    assert array.values[-1] != array2.values[-1]
27
28
29def test_inherited_array(numbers):
30    class FloatArray(TagArray):
31        DTYPE = 'f'
32
33    floats = FloatArray(data=numbers)
34    for index, value in enumerate(floats.values):
35        assert value == numbers[index]
36
37
38def test_vertex_array_basics():
39    tags = ExtendedTags.from_text(SPLINE)
40    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
41    assert len(vertices) == 7
42    points = list(vertices)
43    assert len(points) == 7
44    assert vertices[0] == (0., 0., 0.)
45    assert vertices[1] == (10., 10., 10.)
46    # test negative index
47    assert vertices[-1] == (60., 60., 60.)
48    with pytest.raises(IndexError):
49        _ = vertices[-8]
50    with pytest.raises(IndexError):
51        _ = vertices[8]
52
53
54def test_vertex_array_advanced():
55    tags = ExtendedTags.from_text(SPLINE)
56    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
57    # append()
58    vertices.append((70, 70, 70))
59    assert len(vertices) == 8
60    assert vertices[-1] == (70., 70., 70.)
61
62    # set vertex
63    vertices[0] = (7, 6, 5)
64    assert vertices[0] == (7, 6, 5)
65    assert len(vertices) == 8
66
67    # clear()
68    vertices.clear()
69    assert len(vertices) == 0
70
71    # extend()
72    vertices.extend([(0, 0, 0), (1, 2, 3), (4, 5, 6)])
73    assert len(vertices) == 3
74    assert vertices[0] == (0, 0, 0)
75    assert vertices[1] == (1, 2, 3)
76    assert vertices[2] == (4, 5, 6)
77
78
79def test_vertex_array_delete():
80    tags = ExtendedTags.from_text(SPLINE)
81    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
82    assert len(vertices) == 7
83    assert vertices[0] == (0, 0, 0)
84    del vertices[0]
85    assert vertices[0] == (10, 10, 10)
86    assert len(vertices) == 6
87
88    del vertices[1]  # (20, 20, 20)
89    assert vertices[1] == (30, 30, 30)
90    assert len(vertices) == 5
91
92
93def test_vertex_array_delete_slices():
94    tags = ExtendedTags.from_text(SPLINE)
95    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
96    del vertices[:2]
97    assert len(vertices) == 5
98    assert vertices[0] == (20, 20, 20)
99
100    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
101    del vertices[::2]
102    assert len(vertices) == 3
103    assert vertices[0] == (10, 10, 10)
104    assert vertices[1] == (30, 30, 30)
105    assert vertices[2] == (50, 50, 50)
106
107
108def test_vertex_array_insert():
109    tags = ExtendedTags.from_text(SPLINE)
110    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
111    assert vertices[0] == (0, 0, 0)
112    assert vertices[1] == (10, 10, 10)
113    vertices.insert(1, (-1, -2, -3))
114    assert vertices[0] == (0, 0, 0)
115    assert vertices[1] == (-1, -2, -3)
116    assert vertices[2] == (10, 10, 10)
117    assert len(vertices) == 8
118
119
120def test_vertex_array_to_dxf_tags():
121    tags = ExtendedTags.from_text(SPLINE)
122    vertices = VertexArray.from_tags(tags.get_subclass('AcDbSpline'))
123    tags = TagCollector.dxftags(vertices)
124    assert len(tags) == 7 * 3
125    assert tags[0] == (10, 0.)
126    assert tags[3] == (10, 10.)
127    assert tags[-1] == (30, 60.)
128
129
130def test_vertext_array_transform_by_ucs():
131    vertices = VertexArray()
132    vertices.extend([(0, 0, 0), (1, 0, 0), (1, 1, 0)])
133    ucs = UCS(origin=(0, 0, 1))
134    vertices.transform(ucs.matrix)
135    assert vertices[0] == (0, 0, 1)
136    assert vertices[1] == (1, 0, 1)
137    assert vertices[2] == (1, 1, 1)
138
139
140def test_vertext_transform():
141    vertices = VertexArray()
142    vertices.extend([(0, 0, 0), (1, 0, 0), (1, 1, 0)])
143    m = Matrix44.translate(0, 0, 1)
144    vertices.transform(m)
145    assert vertices[0] == (0, 0, 1)
146    assert vertices[1] == (1, 0, 1)
147    assert vertices[2] == (1, 1, 1)
148
149
150ROOTDICT = """0
151DICTIONARY
1525
153C
154330
1550
156100
157AcDbDictionary
158281
1591
1603
161ACAD_COLOR
162350
16373
1643
165ACAD_GROUP
166350
167D
1683
169ACAD_LAYOUT
170350
1711A
1723
173ACAD_MATERIAL
174350
17572
1763
177ACAD_MLEADERSTYLE
178350
179D7
1803
181ACAD_MLINESTYLE
182350
18317
1843
185ACAD_PLOTSETTINGS
186350
18719
1883
189ACAD_PLOTSTYLENAME
190350
191E
1923
193ACAD_SCALELIST
194350
195B6
1963
197ACAD_TABLESTYLE
198350
19986
2003
201ACAD_VISUALSTYLE
202350
20399
2043
205ACDB_RECOMPOSE_DATA
206350
20740F
2083
209AcDbVariableDictionary
210350
21166
2123
213DWGPROPS
214350
215410
216"""
217
218SPLINE = """0
219SPLINE
2205
221697
222102
223{ACAD_REACTORS
224330
2256E8
226102
227}
228330
2291F
230100
231AcDbEntity
2328
2331
234370
23520
236100
237AcDbSpline
238210
2390.0
240220
2410.0
242230
2431.0
24470
2458
24671
2473
24872
24911
25073
2517
25274
2530
25442
2550.000000001
25643
2570.0000000001
25840
2590.0
26040
2610.0
26240
2630.0
26440
2650.0
26640
2671.0
26840
2692.0
27040
2713.0
27240
2733.0
27440
2753.0
27640
2773.0
27840
2793.0
28010
2810.0
28220
2830.0
28430
2850.0
28610
28710.
28820
28910.
29030
29110.
29210
29320.
29420
29520.
29630
29720.
29810
29930.
30020
30130.
30230
30330.
30410
30540.
30620
30740.
30830
30940.
31010
31150.
31220
31350.
31430
31550.
31610
31760.
31820
31960.
32030
32160.
322"""
323