egml_core/model/geometry/primitives/
solid.rs

1use crate::error::Error;
2use crate::model::base::Gml;
3use crate::model::geometry::{DirectPosition, LinearRing};
4use crate::operations::geometry::Geometry;
5use nalgebra::Isometry3;
6use rayon::prelude::*;
7
8#[derive(Debug, Clone, PartialEq)]
9pub struct Solid {
10    pub gml: Gml,
11    members: Vec<LinearRing>,
12}
13
14impl Solid {
15    pub fn new(gml: Gml, members: Vec<LinearRing>) -> Result<Self, Error> {
16        if members.is_empty() {
17            return Err(Error::MustNotBeEmpty("solid"));
18        }
19
20        Ok(Self { gml, members })
21    }
22
23    pub fn members(&self) -> &Vec<LinearRing> {
24        self.members.as_ref()
25    }
26
27    pub fn set_members(&mut self, val: Vec<LinearRing>) -> Result<(), Error> {
28        if val.is_empty() {
29            return Err(Error::MustNotBeEmpty("solid"));
30        }
31        self.members = val;
32        Ok(())
33    }
34}
35
36impl Geometry for Solid {
37    fn points(&self) -> Vec<&DirectPosition> {
38        self.members.iter().fold(Vec::new(), |mut acc, x| {
39            acc.extend(x.points().iter());
40            acc
41        })
42    }
43
44    fn apply_transform(&mut self, m: &Isometry3<f64>) {
45        self.members.par_iter_mut().for_each(|p| {
46            p.apply_transform(m);
47        });
48    }
49}