#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct SelectionProbe {
pub solids: usize,
pub sketches: usize,
pub faces: usize,
pub edges: usize,
pub planes: usize,
pub vertices: usize,
pub components: usize,
pub all_component: bool,
pub all_sheet_metal: bool,
}
impl SelectionProbe {
pub fn has_profile(&self) -> bool {
self.faces > 0 || self.sketches > 0
}
}
pub static FEATURE_APPLICABILITY: &[(&str, fn(&SelectionProbe) -> bool)] = &[
("D", super::features::datum::context_applicable),
("P", super::features::plane::context_applicable),
("P.CU", super::features::cube::context_applicable),
("P.CY", super::features::cylinder::context_applicable),
("P.CO", super::features::cone::context_applicable),
("P.S", super::features::sphere::context_applicable),
("P.T", super::features::torus::context_applicable),
("P.PY", super::features::pyramid::context_applicable),
("IMPORT3D", super::features::import3d::context_applicable),
("S", super::features::sketch::context_applicable),
("SP", super::features::spline::context_applicable),
("PORT", super::features::port::context_applicable),
("HX", super::features::helix::context_applicable),
("E", super::features::extrude::context_applicable),
("B", super::features::boolean::context_applicable),
("F", super::features::fillet::context_applicable),
("CH", super::features::chamfer::context_applicable),
("O.S", super::features::offset_shell::context_applicable),
("O.F", super::features::offset_face::context_applicable),
("PF", super::features::push_face::context_applicable),
("DF", super::features::delete_face::context_applicable),
("THK", super::features::thicken::context_applicable),
("SM.TAB", super::features::sheet_metal_tab::context_applicable),
("SM.CF", super::features::sheet_metal_contour_flange::context_applicable),
("SM.F", super::features::sheet_metal_flange::context_applicable),
("SM.HEM", super::features::sheet_metal_hem::context_applicable),
("SM.FILLET", super::features::sheet_metal_corner::context_applicable),
("SM.CHAMFER", super::features::sheet_metal_corner::context_applicable),
("SM.CUTOUT", super::features::sheet_metal_cutout::context_applicable),
("LOFT", super::features::loft::context_applicable),
("M", super::features::mirror::context_applicable),
("SPL", super::features::split::context_applicable),
("R", super::features::revolve::context_applicable),
("RIB", super::features::rib::context_applicable),
("SW", super::features::sweep::context_applicable),
("SWP", super::features::path_sweep::context_applicable),
("H", super::features::hole::context_applicable),
("TU", super::features::tube::context_applicable),
("XFORM", super::features::transform::context_applicable),
("PATTERN", super::features::pattern::context_applicable),
("ACOMP", super::features::assembly_component::context_applicable),
];
pub fn feature_context_applicable(type_id: &str, probe: &SelectionProbe) -> bool {
FEATURE_APPLICABILITY
.iter()
.find(|(id, _)| *id == type_id)
.is_some_and(|(_, applicable)| applicable(probe))
}