brep_kernel/feature_pipeline/
context_offer.rs1#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
25pub struct SelectionProbe {
26 pub solids: usize,
27 pub sketches: usize,
28 pub faces: usize,
29 pub edges: usize,
30 pub planes: usize,
35 pub vertices: usize,
38 pub components: usize,
40 pub all_component: bool,
45 pub all_sheet_metal: bool,
51}
52
53impl SelectionProbe {
54 pub fn has_profile(&self) -> bool {
57 self.faces > 0 || self.sketches > 0
58 }
59}
60
61pub static FEATURE_APPLICABILITY: &[(&str, fn(&SelectionProbe) -> bool)] = &[
66 ("D", super::features::datum::context_applicable),
67 ("P", super::features::plane::context_applicable),
68 ("P.CU", super::features::cube::context_applicable),
69 ("P.CY", super::features::cylinder::context_applicable),
70 ("P.CO", super::features::cone::context_applicable),
71 ("P.S", super::features::sphere::context_applicable),
72 ("P.T", super::features::torus::context_applicable),
73 ("P.PY", super::features::pyramid::context_applicable),
74 ("NS", super::features::nurbs_solid::context_applicable),
75 ("IMPORT3D", super::features::import3d::context_applicable),
76 ("S", super::features::sketch::context_applicable),
77 ("S3D", super::features::sketch3d::context_applicable),
78 ("SP", super::features::spline::context_applicable),
79 ("WP", super::features::waypoint::context_applicable),
80 ("HX", super::features::helix::context_applicable),
81 ("E", super::features::extrude::context_applicable),
82 ("B", super::features::boolean::context_applicable),
83 ("F", super::features::fillet::context_applicable),
84 ("CH", super::features::chamfer::context_applicable),
85 ("O.S", super::features::offset_shell::context_applicable),
86 ("O.F", super::features::offset_face::context_applicable),
87 ("PF", super::features::push_face::context_applicable),
88 ("TF", super::features::transform_face::context_applicable),
89 ("DF", super::features::delete_face::context_applicable),
90 ("RFS", super::features::refit_faces::context_applicable),
91 ("THK", super::features::thicken::context_applicable),
92 ("SM.TAB", super::features::sheet_metal_tab::context_applicable),
93 ("SM.CF", super::features::sheet_metal_contour_flange::context_applicable),
94 ("SM.F", super::features::sheet_metal_flange::context_applicable),
95 ("SM.HEM", super::features::sheet_metal_hem::context_applicable),
96 ("SM.CLOSED_CORNER", super::features::sheet_metal_closed_corner::context_applicable),
97 ("SM.MIRROR", super::features::sheet_metal_mirror::context_applicable),
98 ("SM.FILLET", super::features::sheet_metal_corner::context_applicable),
99 ("SM.CHAMFER", super::features::sheet_metal_corner::context_applicable),
100 ("SM.CUTOUT", super::features::sheet_metal_cutout::context_applicable),
101 ("LOFT", super::features::loft::context_applicable),
102 ("M", super::features::mirror::context_applicable),
103 ("SPL", super::features::split::context_applicable),
104 ("R", super::features::revolve::context_applicable),
105 ("RIB", super::features::rib::context_applicable),
106 ("SW", super::features::sweep::context_applicable),
107 ("SWP", super::features::path_sweep::context_applicable),
108 ("H", super::features::hole::context_applicable),
109 ("TU", super::features::tube::context_applicable),
110 ("XFORM", super::features::transform::context_applicable),
111 ("PATTERN", super::features::pattern::context_applicable),
112 ("ACOMP", super::features::assembly_component::context_applicable),
113 ("APAT", super::features::assembly_pattern::context_applicable),
114];
115
116pub fn feature_context_applicable(type_id: &str, probe: &SelectionProbe) -> bool {
119 FEATURE_APPLICABILITY
120 .iter()
121 .find(|(id, _)| *id == type_id)
122 .is_some_and(|(_, applicable)| applicable(probe))
123}
124