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