Skip to main content

ecitygml_core/model/transportation/
road.rs

1use 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}