ecitygml-core 0.0.1-alpha.13

Core primitives and operations for processing CityGML data.
Documentation
use crate::model::core::{AsAbstractFeatureMut, CityObjectKind, CityObjectRef};
use crate::model::relief::{
    AbstractReliefComponent, AsAbstractReliefComponent, AsAbstractReliefComponentMut,
};
use crate::operations::{Visitable, Visitor};
use egml::model::geometry::Envelope;
use egml::model::geometry::primitives::TriangulatedSurface;

#[derive(Debug, Clone, PartialEq)]
pub struct TinRelief {
    pub(crate) abstract_relief_component: AbstractReliefComponent,
    tin: TriangulatedSurface,
}

impl TinRelief {
    pub fn new(
        abstract_relief_component: AbstractReliefComponent,
        tin: TriangulatedSurface,
    ) -> Self {
        Self {
            abstract_relief_component,
            tin,
        }
    }

    pub fn tin(&self) -> &TriangulatedSurface {
        &self.tin
    }

    pub fn iter_city_object<'a>(&'a self) -> impl Iterator<Item = CityObjectRef<'a>> + 'a {
        std::iter::once(CityObjectRef::TinRelief(self))
    }

    pub fn compute_envelope(&self) -> Envelope {
        self.tin.compute_envelope()
    }

    pub fn refresh_bounded_by_recursive(&mut self) {
        let envelope = self.compute_envelope();
        self.set_bounded_by(Some(envelope));
    }
}

impl AsAbstractReliefComponent for TinRelief {
    fn abstract_relief_component(&self) -> &AbstractReliefComponent {
        &self.abstract_relief_component
    }
}

impl AsAbstractReliefComponentMut for TinRelief {
    fn abstract_relief_component_mut(&mut self) -> &mut AbstractReliefComponent {
        &mut self.abstract_relief_component
    }
}

crate::impl_abstract_relief_component_traits!(TinRelief);

impl From<TinRelief> for CityObjectKind {
    fn from(item: TinRelief) -> Self {
        CityObjectKind::TinRelief(item)
    }
}

impl Visitable for TinRelief {
    fn accept<V: Visitor>(&self, visitor: &mut V) {
        visitor.visit_tin_relief(self);
    }
}