Skip to main content

ecitygml_core/model/relief/
relief_feature.rs

1use crate::impl_abstract_space_boundary_traits;
2use crate::model::common::LevelOfDetail;
3use crate::model::core::{
4    AbstractSpaceBoundary, AsAbstractFeatureMut, AsAbstractSpaceBoundary,
5    AsAbstractSpaceBoundaryMut, CityObjectKind, CityObjectRef,
6};
7use crate::model::relief::ReliefComponentKind;
8use crate::operations::{Visitable, Visitor};
9use egml::model::geometry::Envelope;
10use nalgebra::Isometry3;
11
12#[derive(Debug, Clone, PartialEq)]
13pub struct ReliefFeature {
14    pub(crate) abstract_space_boundary: AbstractSpaceBoundary,
15    lod: LevelOfDetail,
16    relief_component: Vec<ReliefComponentKind>,
17}
18
19impl ReliefFeature {
20    pub fn new(abstract_space_boundary: AbstractSpaceBoundary, lod: LevelOfDetail) -> Self {
21        Self {
22            abstract_space_boundary,
23            lod,
24            relief_component: Vec::new(),
25        }
26    }
27
28    pub fn iter_city_object<'a>(&'a self) -> impl Iterator<Item = CityObjectRef<'a>> + 'a {
29        std::iter::once(CityObjectRef::ReliefFeature(self))
30    }
31
32    pub fn refresh_bounded_by_recursive(&mut self) {
33        self.relief_component
34            .iter_mut()
35            .for_each(|x| x.refresh_bounded_by_recursive());
36
37        let envelopes: Vec<Envelope> = self
38            .relief_component
39            .iter()
40            .filter_map(|x| x.bounded_by())
41            .cloned()
42            .collect();
43
44        self.set_bounded_by(Envelope::from_envelopes(&envelopes));
45    }
46
47    pub fn relief_component(&self) -> &[ReliefComponentKind] {
48        &self.relief_component
49    }
50
51    pub fn relief_component_mut(&mut self) -> &mut Vec<ReliefComponentKind> {
52        &mut self.relief_component
53    }
54
55    pub fn num_relief_components(&self) -> usize {
56        self.relief_component.len()
57    }
58
59    pub fn apply_transform_recursive(&mut self, m: &Isometry3<f64>) {
60        self.relief_component
61            .iter_mut()
62            .for_each(|x| x.apply_transform(m));
63    }
64
65    pub fn lod(&self) -> LevelOfDetail {
66        self.lod
67    }
68}
69
70impl AsAbstractSpaceBoundary for ReliefFeature {
71    fn abstract_space_boundary(&self) -> &AbstractSpaceBoundary {
72        &self.abstract_space_boundary
73    }
74}
75
76impl AsAbstractSpaceBoundaryMut for ReliefFeature {
77    fn abstract_space_boundary_mut(&mut self) -> &mut AbstractSpaceBoundary {
78        &mut self.abstract_space_boundary
79    }
80}
81
82impl_abstract_space_boundary_traits!(ReliefFeature);
83
84impl From<ReliefFeature> for CityObjectKind {
85    fn from(item: ReliefFeature) -> Self {
86        CityObjectKind::ReliefFeature(item)
87    }
88}
89
90impl Visitable for ReliefFeature {
91    fn accept<V: Visitor>(&self, visitor: &mut V) {
92        visitor.visit_relief_feature(self);
93    }
94}