brep_app/
delete_selection.rs1use crate::document::Documents;
16use brep_render::engine_state::EngineState;
17
18#[derive(Clone, Debug, PartialEq, Eq)]
20pub enum DeleteTarget {
21 Sketch,
23 Sketch3d,
25 Ecad(crate::workbench::ecad::Target),
27 SheetObject(String),
29 PmiAnnotation(String),
31 Constraint(String),
33 Component(String),
35 Feature(String),
37}
38
39impl DeleteTarget {
40 pub fn kind(&self) -> &'static str {
42 match self {
43 DeleteTarget::Sketch => "sketch",
44 DeleteTarget::Sketch3d => "sketch3d",
45 DeleteTarget::Ecad(_) => "ecad",
46 DeleteTarget::SheetObject(_) => "sheetObject",
47 DeleteTarget::PmiAnnotation(_) => "pmiAnnotation",
48 DeleteTarget::Constraint(_) => "constraint",
49 DeleteTarget::Component(_) => "component",
50 DeleteTarget::Feature(_) => "feature",
51 }
52 }
53
54 pub fn id(&self) -> Option<&str> {
56 match self {
57 DeleteTarget::SheetObject(id)
58 | DeleteTarget::PmiAnnotation(id)
59 | DeleteTarget::Constraint(id)
60 | DeleteTarget::Component(id)
61 | DeleteTarget::Feature(id) => Some(id),
62 _ => None,
63 }
64 }
65}
66
67pub fn target(docs: &Documents) -> Option<DeleteTarget> {
70 let engine = docs.engine();
71 if engine.ref_select_active() {
72 return None;
75 }
76 if engine.sketch_mode() {
77 return Some(DeleteTarget::Sketch);
78 }
79 if engine.sketch3d_mode() {
80 return Some(DeleteTarget::Sketch3d);
81 }
82 if let Some(target) = crate::workbench::ecad::Target::of_workbench(&engine.settings.workbench) {
83 return Some(DeleteTarget::Ecad(target));
84 }
85 if engine.sheet_open().is_some() {
86 return engine.sheet_selected_object().map(|id| DeleteTarget::SheetObject(id.to_string()));
87 }
88 if engine.pmi_workbench_entered() {
89 return engine.pmi_selected_annotation().map(|id| DeleteTarget::PmiAnnotation(id.to_string()));
90 }
91 model_target(engine)
92}
93
94pub(crate) fn model_target(engine: &EngineState) -> Option<DeleteTarget> {
96 let constraints_shown = crate::workbench::panel_visible(
97 &engine.settings.workbench,
98 crate::workbench::assembly::CONSTRAINTS_PANEL_ID,
99 &crate::workbench::ButtonState::of(engine),
100 );
101 if let Some(id) = engine.selected_constraint().filter(|_| constraints_shown) {
102 return Some(DeleteTarget::Constraint(id));
103 }
104 if let Some(id) = crate::panels::context_bar::component_action_target_of(engine) {
105 return Some(DeleteTarget::Component(id));
106 }
107 engine.selected_feature().map(|id| DeleteTarget::Feature(id.to_string()))
108}
109
110pub fn apply(docs: &mut Documents, target: &DeleteTarget) -> Result<(), String> {
113 match target {
114 DeleteTarget::Ecad(target) => {
115 docs.active_mut().ecad.selection_key(*target, true);
116 Ok(())
117 }
118 other => apply_engine(docs.engine_mut(), other),
119 }
120}
121
122pub(crate) fn apply_engine(engine: &mut EngineState, target: &DeleteTarget) -> Result<(), String> {
126 match target {
127 DeleteTarget::Sketch => {
128 engine.sketch_delete_selection();
129 Ok(())
130 }
131 DeleteTarget::Sketch3d => {
132 engine.sketch3d_delete_selection();
133 Ok(())
134 }
135 DeleteTarget::Ecad(_) => Err("the eCAD editor's selection is deleted in its editor".into()),
136 DeleteTarget::SheetObject(id) => crate::panels::sheets::delete_held_object(engine, id),
137 DeleteTarget::PmiAnnotation(id) => crate::panels::pmi::delete_annotation(engine, id),
138 DeleteTarget::Constraint(id) => {
139 let result = engine.assembly_remove_constraint(id);
140 engine.constraint_deselect();
141 result
142 }
143 DeleteTarget::Component(id) => {
144 if id.contains(':') {
145 return Err(format!(
146 "'{id}' is a part inside a sub-assembly: open that sub-assembly to delete it"
147 ));
148 }
149 crate::panels::component_actions::run_component_action(
150 engine,
151 crate::panels::component_actions::ComponentAction::Delete,
152 id,
153 );
154 Ok(())
155 }
156 DeleteTarget::Feature(id) => {
157 engine.delete_feature(id);
158 Ok(())
159 }
160 }
161}
162
163pub fn delete_selection(docs: &mut Documents) -> Result<Option<DeleteTarget>, String> {
165 let Some(target) = target(docs) else {
166 return Ok(None);
167 };
168 apply(docs, &target)?;
169 Ok(Some(target))
170}
171