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> ClosedSweep<P, C, S> for Vertex<P> {
    fn closed_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();
        let mut wire: Wire<P, C> = (1..division)
            .map(|_| {
                let new_vertex = vertex.mapped(point_mapping);
                let edge = connect_vertices(&vertex, &new_vertex, connect_points);
                vertex = new_vertex;
                edge
            })
            .collect();
        wire.push_back(connect_vertices(&vertex, self, connect_points));
        wire
    }
}

impl<P: Clone, C: Clone, S: Clone> ClosedSweep<P, C, S> for Edge<P, C> {
    fn closed_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();
        let mut shell: Shell<P, C, S> = (1..division)
            .map(|_| {
                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();
        shell.push(connect_edges(&edge, self, connect_points, connect_curves));
        shell
    }
}

impl<P: Clone, C: Clone, S: Clone> ClosedSweep<P, C, S> for Wire<P, C> {
    fn closed_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();
        let mut shell: Shell<P, C, S> = (1..division)
            .flat_map(|_| {
                let new_wire = wire.mapped(point_mapping, curve_mapping);
                let vec: Vec<_> =
                    connect_wires(&wire, &new_wire, connect_points, connect_curves).collect();
                wire = new_wire;
                vec
            })
            .collect();
        shell.extend(connect_wires(&wire, self, connect_points, connect_curves));
        shell
    }
}

impl<P: Clone, C: Clone, S: Clone> ClosedSweep<P, C, S> for Face<P, C, S> {
    fn closed_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 {
        Solid::debug_new(
            self.boundaries()
                .iter()
                .map(move |wire| {
                    wire.closed_sweep(
                        point_mapping,
                        curve_mapping,
                        surface_mapping,
                        connect_points,
                        connect_curves,
                        division,
                    )
                })
                .collect(),
        )
    }
}

impl<P: Clone, C: Clone, S: Clone> ClosedSweep<P, C, S> for Shell<P, C, S> {
    fn closed_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| {
                Solid::try_new(
                    shell
                        .extract_boundaries()
                        .iter()
                        .map(|wire| {
                            wire.closed_sweep(
                                point_mapping,
                                curve_mapping,
                                surface_mapping,
                                connect_points,
                                connect_curves,
                                division,
                            )
                        })
                        .collect(),
                )
            })
            .collect()
    }
}