use indicatrix::geometry::meet_solver::SolvedTier;
use indicatrix_cut_core::Design;
use crate::gui::{
editor::auto_solve,
solid_preview::{facet_map::FacetMap, facet_selection},
};
pub(in crate::gui::editor) use facet_selection::{resubmit_facet_overlay, set_hovered_facet};
pub(super) fn facet_map_from_aligned_solve(design: &Design) -> FacetMap {
let solved = auto_solve::solid_last_solved()
.and_then(|cache| {
cache
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner)
.clone()
})
.filter(|(_, solved)| solved.len() == design.tiers.len())
.map(|(_, solved)| solved)
.unwrap_or_default();
let drawn = facet_selection::drawn_tiers();
facet_map_for_drawn_tiers(design, &solved, drawn.as_deref().map(Vec::as_slice))
}
#[must_use]
pub(super) fn facet_map_for_drawn_tiers(
design: &Design,
solved: &[SolvedTier],
drawn: Option<&[bool]>,
) -> FacetMap {
FacetMap::from_design_cut(design, solved, &[], drawn)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_cut_back_map_counts_only_the_drawn_tiers_facets() {
let design = Design::concave_fixture();
let solved = design.solve().expect("the fixture solves");
let finished = facet_map_for_drawn_tiers(&design, &solved, None);
let mut drawn = vec![false; design.tiers.len()];
drawn[0] = true;
let cut = facet_map_for_drawn_tiers(&design, &solved, Some(&drawn));
assert!(cut.facet_count() < finished.facet_count());
assert_eq!(
cut.facet_count(),
cut.preform_plane_count() + cut.facets_of_tier(0).len()
);
assert!(
cut.facets_of_tier(1).is_empty(),
"a hidden tier has no facets"
);
}
}