ecitygml-core 0.0.1-alpha.13

Core primitives and operations for processing CityGML data.
Documentation
use crate::impl_abstract_space_boundary_traits;
use crate::model::common::LevelOfDetail;
use crate::model::core::{
    AbstractSpaceBoundary, AsAbstractFeatureMut, AsAbstractSpaceBoundary,
    AsAbstractSpaceBoundaryMut, CityObjectKind, CityObjectRef,
};
use crate::model::relief::ReliefComponentKind;
use crate::operations::{Visitable, Visitor};
use egml::model::geometry::Envelope;

#[derive(Debug, Clone, PartialEq)]
pub struct ReliefFeature {
    pub(crate) abstract_space_boundary: AbstractSpaceBoundary,
    lod: LevelOfDetail,
    relief_component: Vec<ReliefComponentKind>,
}

impl ReliefFeature {
    pub fn new(abstract_space_boundary: AbstractSpaceBoundary, lod: LevelOfDetail) -> Self {
        Self {
            abstract_space_boundary,
            lod,
            relief_component: Vec::new(),
        }
    }

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

    pub fn refresh_bounded_by_recursive(&mut self) {
        self.relief_component
            .iter_mut()
            .for_each(|x| x.refresh_bounded_by_recursive());

        let envelopes: Vec<&Envelope> = self
            .relief_component
            .iter()
            .filter_map(|x| x.bounded_by())
            .collect();

        self.set_bounded_by(Envelope::from_envelopes(&envelopes));
    }

    pub fn relief_component(&self) -> &[ReliefComponentKind] {
        &self.relief_component
    }

    pub fn relief_component_mut(&mut self) -> &mut Vec<ReliefComponentKind> {
        &mut self.relief_component
    }

    pub fn num_relief_components(&self) -> usize {
        self.relief_component.len()
    }

    pub fn lod(&self) -> LevelOfDetail {
        self.lod
    }
}

impl AsAbstractSpaceBoundary for ReliefFeature {
    fn abstract_space_boundary(&self) -> &AbstractSpaceBoundary {
        &self.abstract_space_boundary
    }
}

impl AsAbstractSpaceBoundaryMut for ReliefFeature {
    fn abstract_space_boundary_mut(&mut self) -> &mut AbstractSpaceBoundary {
        &mut self.abstract_space_boundary
    }
}

impl_abstract_space_boundary_traits!(ReliefFeature);

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

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