ecitygml_core/model/building/
building_room.rs1use 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 let own_envelope = self.compute_envelope();
63 let envelopes: Vec<Envelope> = own_envelope
64 .as_ref()
65 .into_iter()
66 .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 }
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}