egml_core/model/geometry/primitives/
solid.rs1use 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}