Skip to main content

ecitygml_core/model/relief/
tin_relief.rs

1use crate::model::core::{AsAbstractFeatureMut, CityObjectKind, CityObjectRef};
2use crate::model::relief::{
3    AbstractReliefComponent, AsAbstractReliefComponent, AsAbstractReliefComponentMut,
4};
5use crate::operations::{Visitable, Visitor};
6use egml::model::geometry::Envelope;
7use egml::model::geometry::primitives::TriangulatedSurface;
8use nalgebra::Isometry3;
9
10#[derive(Debug, Clone, PartialEq)]
11pub struct TinRelief {
12    pub(crate) abstract_relief_component: AbstractReliefComponent,
13    tin: TriangulatedSurface,
14}
15
16impl TinRelief {
17    pub fn new(
18        abstract_relief_component: AbstractReliefComponent,
19        tin: TriangulatedSurface,
20    ) -> Self {
21        Self {
22            abstract_relief_component,
23            tin,
24        }
25    }
26
27    pub fn tin(&self) -> &TriangulatedSurface {
28        &self.tin
29    }
30
31    pub fn iter_city_object<'a>(&'a self) -> impl Iterator<Item = CityObjectRef<'a>> + 'a {
32        std::iter::once(CityObjectRef::TinRelief(self))
33    }
34
35    pub fn compute_envelope(&self) -> Envelope {
36        self.tin.compute_envelope()
37    }
38
39    pub fn refresh_bounded_by_recursive(&mut self) {
40        let envelope = self.compute_envelope();
41        self.set_bounded_by(Some(envelope));
42    }
43
44    pub fn apply_transform(&mut self, m: &Isometry3<f64>) {
45        self.tin.apply_transform(m);
46    }
47}
48
49impl AsAbstractReliefComponent for TinRelief {
50    fn abstract_relief_component(&self) -> &AbstractReliefComponent {
51        &self.abstract_relief_component
52    }
53}
54
55impl AsAbstractReliefComponentMut for TinRelief {
56    fn abstract_relief_component_mut(&mut self) -> &mut AbstractReliefComponent {
57        &mut self.abstract_relief_component
58    }
59}
60
61crate::impl_abstract_relief_component_traits!(TinRelief);
62
63impl From<TinRelief> for CityObjectKind {
64    fn from(item: TinRelief) -> Self {
65        CityObjectKind::TinRelief(item)
66    }
67}
68
69impl Visitable for TinRelief {
70    fn accept<V: Visitor>(&self, visitor: &mut V) {
71        visitor.visit_tin_relief(self);
72    }
73}