ecitygml_core/model/relief/
relief_feature.rs1use 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}