Skip to main content

ecitygml_core/model/building/
building_room.rs

1use crate::impl_abstract_unoccupied_space_traits;
2use crate::model::core::{
3    AbstractUnoccupiedSpace, AsAbstractFeatureMut, AsAbstractSpace, AsAbstractUnoccupiedSpace,
4    AsAbstractUnoccupiedSpaceMut, CityObjectKind, CityObjectRef,
5};
6use crate::operations::{Visitable, Visitor};
7use egml::model::basic::Code;
8use egml::model::geometry::Envelope;
9use nalgebra::Isometry3;
10
11#[derive(Debug, Clone, PartialEq)]
12pub struct BuildingRoom {
13    pub abstract_unoccupied_space: AbstractUnoccupiedSpace,
14    pub(crate) class: Option<Code>,
15    pub(crate) functions: Vec<Code>,
16    pub(crate) usages: Vec<Code>,
17}
18
19impl BuildingRoom {
20    pub fn new(abstract_unoccupied_space: AbstractUnoccupiedSpace) -> Self {
21        BuildingRoom {
22            abstract_unoccupied_space,
23            class: None,
24            functions: Vec::new(),
25            usages: Vec::new(),
26        }
27    }
28
29    pub fn class(&self) -> &Option<Code> {
30        &self.class
31    }
32
33    pub fn set_class(&mut self, class: Option<Code>) {
34        self.class = class;
35    }
36
37    pub fn functions(&self) -> &Vec<Code> {
38        &self.functions
39    }
40
41    pub fn set_functions(&mut self, functions: Vec<Code>) {
42        self.functions = functions;
43    }
44
45    pub fn usages(&self) -> &Vec<Code> {
46        &self.usages
47    }
48
49    pub fn set_usages(&mut self, usages: Vec<Code>) {
50        self.usages = usages;
51    }
52
53    pub fn iter_city_object<'a>(&'a self) -> impl Iterator<Item = CityObjectRef<'a>> + 'a {
54        std::iter::once(CityObjectRef::BuildingRoom(self))
55    }
56
57    pub fn refresh_bounded_by_recursive(&mut self) {
58        /*self.wall_surface
59        .iter_mut()
60        .for_each(|x| x.refresh_bounded_by_recursive());*/
61
62        let own_envelope = self.compute_envelope();
63        let envelopes: Vec<Envelope> = own_envelope
64            .as_ref()
65            .into_iter()
66            //.chain(self.wall_surface.iter().filter_map(|x| x.bounded_by()))
67            .cloned()
68            .collect();
69
70        self.set_bounded_by(Envelope::from_envelopes(&envelopes));
71    }
72
73    pub fn apply_transform_recursive(&mut self, _m: &Isometry3<f64>) {
74        // AsAbstractUnoccupiedSpace::apply_transform(&mut self.abstract_unoccupied_space, m);
75
76        /*self.wall_surface
77        .iter_mut()
78        .for_each(|x| x.apply_transform(m));*/
79    }
80}
81
82impl AsAbstractUnoccupiedSpace for BuildingRoom {
83    fn abstract_unoccupied_space(&self) -> &AbstractUnoccupiedSpace {
84        &self.abstract_unoccupied_space
85    }
86}
87
88impl AsAbstractUnoccupiedSpaceMut for BuildingRoom {
89    fn abstract_unoccupied_space_mut(&mut self) -> &mut AbstractUnoccupiedSpace {
90        &mut self.abstract_unoccupied_space
91    }
92}
93
94impl_abstract_unoccupied_space_traits!(BuildingRoom);
95
96impl From<BuildingRoom> for CityObjectKind {
97    fn from(item: BuildingRoom) -> Self {
98        CityObjectKind::BuildingRoom(item)
99    }
100}
101
102impl Visitable for BuildingRoom {
103    fn accept<V: Visitor>(&self, visitor: &mut V) {
104        visitor.visit_building_room(self);
105    }
106}