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