1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
use std::collections::BTreeSet;
use crate::{
objects::{Face, Shell},
storage::Handle,
};
/// A 3-dimensional shape, built from [`Shell`]s. Many Solids will contains only
/// one shell, but if the Solid contains cavities they will be represented by a
/// shell each, as well as a shell for the outside.
///
/// # Implementation Note
///
/// The shells that form the boundaries of the solid must not intersect. This is
/// not currently validated.
#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct Solid {
shells: BTreeSet<Handle<Shell>>,
}
impl Solid {
/// Construct an empty instance of `Solid`
pub fn new(shells: impl IntoIterator<Item = Handle<Shell>>) -> Self {
Self {
shells: shells.into_iter().collect(),
}
}
/// Access the solid's shells
pub fn shells(&self) -> impl Iterator<Item = &Handle<Shell>> {
self.shells.iter()
}
/// Find the given face in the solid
pub fn find_face(&self, face: &Handle<Face>) -> Option<Handle<Face>> {
for shell in self.shells() {
if let Some(face) = shell.find_face(face) {
return Some(face);
}
}
None
}
}