truck-modeling 0.6.0

integrated modeling algorithms by geometry and topology
Documentation
use crate::topo_impls::*;
use crate::topo_traits::*;
use truck_topology::*;

impl<P: Clone, C: Clone, S: Clone> MultiSweep<P, C, S> for Vertex<P> {
    type Swept = Wire<P, C>;
    fn multi_sweep<
        FP: Fn(&P) -> P,
        FC: Fn(&C) -> C,
        FS: Fn(&S) -> S,
        CP: Fn(&P, &P) -> C,
        CE: Fn(&C, &C) -> S,
    >(
        &self,
        point_mapping: &FP,
        _: &FC,
        _: &FS,
        connect_points: &CP,
        _: &CE,
        division: usize,
    ) -> Self::Swept {
        let mut vertex = self.clone();
        (0..division)
            .map(move |_| {
                let new_vertex = vertex.mapped(point_mapping);
                let edge = connect_vertices(&vertex, &new_vertex, connect_points);
                vertex = new_vertex;
                edge
            })
            .collect()
    }
}

impl<P: Clone, C: Clone, S: Clone> MultiSweep<P, C, S> for Edge<P, C> {
    type Swept = Shell<P, C, S>;
    fn multi_sweep<
        FP: Fn(&P) -> P,
        FC: Fn(&C) -> C,
        FS: Fn(&S) -> S,
        CP: Fn(&P, &P) -> C,
        CE: Fn(&C, &C) -> S,
    >(
        &self,
        point_mapping: &FP,
        curve_mapping: &FC,
        _: &FS,
        connect_points: &CP,
        connect_curves: &CE,
        division: usize,
    ) -> Self::Swept {
        let mut edge = self.clone();
        (0..division)
            .map(move |_| {
                let new_edge = edge.mapped(point_mapping, curve_mapping);
                let face = connect_edges(&edge, &new_edge, connect_points, connect_curves);
                edge = new_edge;
                face
            })
            .collect()
    }
}

impl<P: Clone, C: Clone, S: Clone> MultiSweep<P, C, S> for Wire<P, C> {
    type Swept = Shell<P, C, S>;
    fn multi_sweep<
        FP: Fn(&P) -> P,
        FC: Fn(&C) -> C,
        FS: Fn(&S) -> S,
        CP: Fn(&P, &P) -> C,
        CE: Fn(&C, &C) -> S,
    >(
        &self,
        point_mapping: &FP,
        curve_mapping: &FC,
        _: &FS,
        connect_points: &CP,
        connect_curves: &CE,
        division: usize,
    ) -> Self::Swept {
        let mut wire = self.clone();
        (0..division)
            .flat_map(move |_| {
                let new_wire = wire.mapped(point_mapping, curve_mapping);
                let shell: Vec<_> =
                    connect_wires(&wire, &new_wire, connect_points, connect_curves).collect();
                wire = new_wire;
                shell
            })
            .collect()
    }
}

impl<P: Clone, C: Clone, S: Clone> MultiSweep<P, C, S> for Face<P, C, S> {
    type Swept = Solid<P, C, S>;
    fn multi_sweep<
        FP: Fn(&P) -> P,
        FC: Fn(&C) -> C,
        FS: Fn(&S) -> S,
        CP: Fn(&P, &P) -> C,
        CE: Fn(&C, &C) -> S,
    >(
        &self,
        point_mapping: &FP,
        curve_mapping: &FC,
        surface_mapping: &FS,
        connect_points: &CP,
        connect_curves: &CE,
        division: usize,
    ) -> Self::Swept {
        let mut shell = Shell::from(vec![self.inverse()]);
        let mut face_cursor = self.clone();
        shell.extend((0..division).flat_map(|_| {
            let seiling = face_cursor.mapped(point_mapping, curve_mapping, surface_mapping);
            let biter0 = face_cursor.boundary_iters().into_iter().flatten();
            let biter1 = seiling.boundary_iters().into_iter().flatten();
            let vec: Vec<_> =
                connect_raw_wires(biter0, biter1, connect_points, connect_curves).collect();
            face_cursor = seiling;
            vec
        }));
        shell.push(face_cursor);
        Solid::debug_new(vec![shell])
    }
}

impl<P: Clone, C: Clone, S: Clone> MultiSweep<P, C, S> for Shell<P, C, S> {
    type Swept = Vec<Result<Solid<P, C, S>>>;
    fn multi_sweep<
        FP: Fn(&P) -> P,
        FC: Fn(&C) -> C,
        FS: Fn(&S) -> S,
        CP: Fn(&P, &P) -> C,
        CE: Fn(&C, &C) -> S,
    >(
        &self,
        point_mapping: &FP,
        curve_mapping: &FC,
        surface_mapping: &FS,
        connect_points: &CP,
        connect_curves: &CE,
        division: usize,
    ) -> Self::Swept {
        self.connected_components()
            .into_iter()
            .map(move |shell| {
                let mut bdry: Shell<P, C, S> = shell.face_iter().map(Face::inverse).collect();
                let mut shell_cursor = shell;
                bdry.extend((0..division).flat_map(|_| {
                    let seiling =
                        shell_cursor.mapped(point_mapping, curve_mapping, surface_mapping);
                    let bdries0 = shell_cursor.extract_boundaries();
                    let bdries1 = seiling.extract_boundaries();
                    let biter0 = bdries0.iter().flat_map(Wire::edge_iter);
                    let biter1 = bdries1.iter().flat_map(Wire::edge_iter);
                    let vec: Vec<_> =
                        connect_wires(biter0, biter1, connect_points, connect_curves).collect();
                    shell_cursor = seiling;
                    vec
                }));
                bdry.append(&mut shell_cursor);
                Solid::try_new(vec![bdry])
            })
            .collect()
    }
}