1# Copyright (c) 2020 Manfred Moitzi
2# License: MIT License
3import pytest
4import math
5import ezdxf
6from ezdxf.entities.lwpolyline import LWPolyline
7
8POINTS = [(0, 0), (1, 0, 1), (2, 0), (3, 0)]
9
10
11@pytest.fixture
12def lwpolyline():
13    entity = LWPolyline.new(dxfattribs={'layer': 'LAY', 'color': 1})
14    entity.set_points(POINTS, format='xyb')
15    return entity
16
17
18@pytest.fixture(scope='module')
19def msp():
20    doc = ezdxf.new()
21    return doc.modelspace()
22
23
24def test_virtual_entities(lwpolyline):
25    result = list(lwpolyline.virtual_entities())
26    assert len(result) == 3
27
28    e = result[0]
29    assert e.dxftype() == 'LINE'
30    assert e.dxf.layer == 'LAY'
31    assert e.dxf.color == 1
32    assert e.dxf.start == (0, 0)
33    assert e.dxf.end == (1, 0)
34
35    e = result[1]
36    assert e.dxftype() == 'ARC'
37    assert e.dxf.layer == 'LAY'
38    assert e.dxf.color == 1
39    assert e.dxf.center == (1.5, 0)
40    assert e.dxf.radius == 0.5
41    assert math.isclose(e.dxf.start_angle, 180, abs_tol=1e-12)
42    assert math.isclose(e.dxf.end_angle, 0, abs_tol=1e-12)
43
44    assert e.start_point.isclose((1, 0))
45    assert e.end_point.isclose((2, 0))
46
47    e = result[2]
48    assert e.dxftype() == 'LINE'
49    assert e.dxf.layer == 'LAY'
50    assert e.dxf.color == 1
51    assert e.dxf.start == (2, 0)
52    assert e.dxf.end == (3, 0)
53
54
55def test_virtual_entities_elevation(lwpolyline):
56    lwpolyline = lwpolyline.translate(1, 1, 1)
57    assert lwpolyline.dxf.elevation == 1
58    result = list(lwpolyline.virtual_entities())
59    assert len(result) == 3
60    e = result[0]
61    assert e.dxftype() == 'LINE'
62    assert e.dxf.start == (1, 1, 1)
63    assert e.dxf.end == (2, 1, 1)
64
65    e = result[1]
66    assert e.dxftype() == 'ARC'
67    assert e.dxf.center == (2.5, 1, 1)
68    assert e.dxf.radius == 0.5
69    assert math.isclose(e.dxf.start_angle, 180, abs_tol=1e-12)
70    assert math.isclose(e.dxf.end_angle, 0, abs_tol=1e-12)
71
72    assert e.start_point.isclose((2, 1, 1))
73    assert e.end_point.isclose((3, 1, 1))
74
75    e = result[2]
76    assert e.dxftype() == 'LINE'
77    assert e.dxf.start == (3, 1, 1)
78    assert e.dxf.end == (4, 1, 1)
79
80
81def test_closed_polyline():
82    lwpolyline = LWPolyline.new()
83    # Create a circle by LWPOLYLINE:
84    lwpolyline.set_points([(0, 0, 1), (1, 0, 1)], format='xyb')
85    lwpolyline.close(True)
86
87    result = list(lwpolyline.virtual_entities())
88    assert len(result) == 2
89
90    e = result[0]
91    assert e.dxftype() == 'ARC'
92    assert e.dxf.center.isclose((0.5, 0))
93    assert e.dxf.radius == 0.5
94    assert math.isclose(e.dxf.start_angle, 180, abs_tol=1e-12)
95    assert math.isclose(e.dxf.end_angle, 0, abs_tol=1e-12)
96
97    e = result[1]
98    assert e.dxftype() == 'ARC'
99    assert e.dxf.center.isclose((0.5, 0))
100    assert e.dxf.radius == 0.5
101    assert math.isclose(e.dxf.start_angle, 0, abs_tol=1e-12)
102    assert math.isclose(abs(e.dxf.end_angle), 180, abs_tol=1e-12)
103
104
105def test_explode_entities(msp):
106    lwpolyline = msp.add_lwpolyline(POINTS, format='xyb')
107    assert len(msp) == 1
108    result = lwpolyline.explode()
109    assert lwpolyline.is_alive is False
110    assert len(msp) == 3  # LINE, ARC, LINE
111    assert len(result) == 3
112    assert msp[-1] is result[2]
113    assert msp[-2] is result[1]
114    assert msp[-3] is result[0]
115