1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
use super::{CoordPos, Direction, TopologyPosition};
use std::fmt;
#[derive(Clone)]
pub(crate) struct Label {
geometry_topologies: [TopologyPosition; 2],
}
impl fmt::Debug for Label {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"Label {{ A: {:?}, B: {:?} }}",
&self.geometry_topologies[0], &self.geometry_topologies[1]
)
}
}
impl Label {
pub fn empty_line_or_point() -> Label {
Label {
geometry_topologies: [
TopologyPosition::empty_line_or_point(),
TopologyPosition::empty_line_or_point(),
],
}
}
pub fn empty_area() -> Self {
Self {
geometry_topologies: [
TopologyPosition::empty_area(),
TopologyPosition::empty_area(),
],
}
}
pub fn new(geom_index: usize, position: TopologyPosition) -> Self {
let mut label = match position {
TopologyPosition::LineOrPoint { .. } => Self::empty_line_or_point(),
TopologyPosition::Area { .. } => Self::empty_area(),
};
label.geometry_topologies[geom_index] = position;
label
}
pub fn flip(&mut self) {
self.geometry_topologies[0].flip();
self.geometry_topologies[1].flip();
}
pub fn position(&self, geom_index: usize, direction: Direction) -> Option<CoordPos> {
self.geometry_topologies[geom_index].get(direction)
}
pub fn on_position(&self, geom_index: usize) -> Option<CoordPos> {
self.geometry_topologies[geom_index].get(Direction::On)
}
pub fn set_position(&mut self, geom_index: usize, direction: Direction, position: CoordPos) {
self.geometry_topologies[geom_index].set_position(direction, position);
}
pub fn set_on_position(&mut self, geom_index: usize, position: CoordPos) {
self.geometry_topologies[geom_index].set_position(Direction::On, position);
}
pub fn set_all_positions(&mut self, geom_index: usize, position: CoordPos) {
self.geometry_topologies[geom_index].set_all_positions(position)
}
pub fn set_all_positions_if_empty(&mut self, geom_index: usize, postion: CoordPos) {
self.geometry_topologies[geom_index].set_all_positions_if_empty(postion)
}
pub fn geometry_count(&self) -> usize {
self.geometry_topologies
.iter()
.filter(|location| !location.is_empty())
.count()
}
pub fn is_empty(&self, geom_index: usize) -> bool {
self.geometry_topologies[geom_index].is_empty()
}
pub fn is_any_empty(&self, geom_index: usize) -> bool {
self.geometry_topologies[geom_index].is_any_empty()
}
pub fn is_area(&self) -> bool {
self.geometry_topologies[0].is_area() || self.geometry_topologies[1].is_area()
}
pub fn is_geom_area(&self, geom_index: usize) -> bool {
self.geometry_topologies[geom_index].is_area()
}
pub fn is_line(&self, geom_index: usize) -> bool {
self.geometry_topologies[geom_index].is_line()
}
}