Skip to main content

ecitygml_core/model/building/
storey.rs

1use crate::impl_abstract_building_subdivision_traits;
2use crate::model::building::{
3    AbstractBuildingSubdivision, AsAbstractBuildingSubdivision, AsAbstractBuildingSubdivisionMut,
4};
5use crate::model::core::{AsAbstractFeatureMut, AsAbstractSpace, CityObjectKind, CityObjectRef};
6use crate::operations::{Visitable, Visitor};
7use egml::model::geometry::Envelope;
8use nalgebra::Isometry3;
9
10#[derive(Debug, Clone, PartialEq)]
11pub struct Storey {
12    pub abstract_building_subdivision: AbstractBuildingSubdivision,
13}
14
15impl Storey {
16    pub fn new(abstract_building_subdivision: AbstractBuildingSubdivision) -> Self {
17        Self {
18            abstract_building_subdivision,
19        }
20    }
21
22    pub fn iter_city_object<'a>(&'a self) -> impl Iterator<Item = CityObjectRef<'a>> + 'a {
23        std::iter::once(CityObjectRef::Storey(self))
24    }
25
26    pub fn refresh_bounded_by(&mut self) {
27        /*self.wall_surface
28        .iter_mut()
29        .for_each(|x| x.refresh_bounded_by_recursive());*/
30
31        let own_envelope = self.compute_envelope();
32        let envelopes: Vec<Envelope> = own_envelope
33            .as_ref()
34            .into_iter()
35            //.chain(self.wall_surface.iter().filter_map(|x| x.bounded_by()))
36            .cloned()
37            .collect();
38
39        self.set_bounded_by(Envelope::from_envelopes(&envelopes));
40    }
41
42    pub fn apply_transform_recursive(&mut self, _m: &Isometry3<f64>) {
43        // AsAbstractUnoccupiedSpace::apply_transform(&mut self.abstract_unoccupied_space, m);
44
45        /*self.wall_surface
46        .iter_mut()
47        .for_each(|x| x.apply_transform(m));*/
48    }
49}
50
51impl AsAbstractBuildingSubdivision for Storey {
52    fn abstract_building_subdivision(&self) -> &AbstractBuildingSubdivision {
53        &self.abstract_building_subdivision
54    }
55}
56
57impl AsAbstractBuildingSubdivisionMut for Storey {
58    fn abstract_building_subdivision_mut(&mut self) -> &mut AbstractBuildingSubdivision {
59        &mut self.abstract_building_subdivision
60    }
61}
62
63impl_abstract_building_subdivision_traits!(Storey);
64
65impl From<Storey> for CityObjectKind {
66    fn from(item: Storey) -> Self {
67        CityObjectKind::Storey(item)
68    }
69}
70
71impl Visitable for Storey {
72    fn accept<V: Visitor>(&self, visitor: &mut V) {
73        visitor.visit_storey(self);
74    }
75}