ecitygml_core/model/transportation/
road.rs1use crate::model::core::{
2 AbstractSpace, AsAbstractFeature, AsAbstractFeatureMut, AsAbstractSpace, AsAbstractSpaceMut,
3 CityObjectKind, CityObjectRef,
4};
5use crate::model::transportation::{Intersection, Section};
6use crate::operations::{Visitable, Visitor};
7use egml::model::geometry::Envelope;
8use nalgebra::Isometry3;
9
10#[derive(Debug, Clone, PartialEq)]
11pub struct Road {
12 pub(crate) abstract_space: AbstractSpace,
13 pub section: Vec<Section>,
14 pub intersection: Vec<Intersection>,
15}
16
17impl Road {
18 pub fn new(abstract_space: AbstractSpace) -> Self {
19 Self {
20 abstract_space,
21 section: Default::default(),
22 intersection: Default::default(),
23 }
24 }
25
26 pub fn iter_city_object<'a>(&'a self) -> impl Iterator<Item = CityObjectRef<'a>> + 'a {
27 std::iter::once(CityObjectRef::Road(self))
28 .chain(self.section.iter().flat_map(|x| x.iter_city_object()))
29 .chain(self.intersection.iter().flat_map(|x| x.iter_city_object()))
30 }
31
32 pub fn refresh_bounded_by_recursive(&mut self) {
33 self.section
34 .iter_mut()
35 .for_each(|x| x.refresh_bounded_by_recursive());
36 self.intersection
37 .iter_mut()
38 .for_each(|x| x.refresh_bounded_by_recursive());
39
40 let own_envelope = self.compute_envelope();
41 let envelopes: Vec<Envelope> = own_envelope
42 .as_ref()
43 .into_iter()
44 .chain(self.section.iter().filter_map(|x| x.bounded_by()))
45 .chain(self.intersection.iter().filter_map(|x| x.bounded_by()))
46 .cloned()
47 .collect();
48
49 self.set_bounded_by(Envelope::from_envelopes(&envelopes));
50 }
51
52 pub fn apply_transform_recursive(&mut self, m: &Isometry3<f64>) {
53 self.abstract_space.apply_transform(m);
54
55 self.section
56 .iter_mut()
57 .for_each(|x| x.apply_transform_recursive(m));
58 self.intersection
59 .iter_mut()
60 .for_each(|x| x.apply_transform_recursive(m));
61 }
62}
63
64impl AsAbstractSpace for Road {
65 fn abstract_space(&self) -> &AbstractSpace {
66 &self.abstract_space
67 }
68}
69
70impl AsAbstractSpaceMut for Road {
71 fn abstract_space_mut(&mut self) -> &mut AbstractSpace {
72 &mut self.abstract_space
73 }
74}
75
76crate::impl_abstract_space_traits!(Road);
77
78impl From<Road> for CityObjectKind {
79 fn from(item: Road) -> Self {
80 CityObjectKind::Road(item)
81 }
82}
83
84impl Visitable for Road {
85 fn accept<V: Visitor>(&self, visitor: &mut V) {
86 visitor.visit_road(self);
87 self.section.iter().for_each(|x| x.accept(visitor));
88 self.intersection.iter().for_each(|x| x.accept(visitor));
89 }
90}