use crate::document::Documents;
use brep_render::engine_state::EngineState;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum DeleteTarget {
Sketch,
Sketch3d,
Ecad(crate::workbench::ecad::Target),
SheetObject(String),
PmiAnnotation(String),
Constraint(String),
Component(String),
Feature(String),
}
impl DeleteTarget {
pub fn kind(&self) -> &'static str {
match self {
DeleteTarget::Sketch => "sketch",
DeleteTarget::Sketch3d => "sketch3d",
DeleteTarget::Ecad(_) => "ecad",
DeleteTarget::SheetObject(_) => "sheetObject",
DeleteTarget::PmiAnnotation(_) => "pmiAnnotation",
DeleteTarget::Constraint(_) => "constraint",
DeleteTarget::Component(_) => "component",
DeleteTarget::Feature(_) => "feature",
}
}
pub fn id(&self) -> Option<&str> {
match self {
DeleteTarget::SheetObject(id)
| DeleteTarget::PmiAnnotation(id)
| DeleteTarget::Constraint(id)
| DeleteTarget::Component(id)
| DeleteTarget::Feature(id) => Some(id),
_ => None,
}
}
}
pub fn target(docs: &Documents) -> Option<DeleteTarget> {
let engine = docs.engine();
if engine.ref_select_active() {
return None;
}
if engine.sketch_mode() {
return Some(DeleteTarget::Sketch);
}
if engine.sketch3d_mode() {
return Some(DeleteTarget::Sketch3d);
}
if let Some(target) = crate::workbench::ecad::Target::of_workbench(&engine.settings.workbench) {
return Some(DeleteTarget::Ecad(target));
}
if engine.sheet_open().is_some() {
return engine.sheet_selected_object().map(|id| DeleteTarget::SheetObject(id.to_string()));
}
if engine.pmi_workbench_entered() {
return engine.pmi_selected_annotation().map(|id| DeleteTarget::PmiAnnotation(id.to_string()));
}
model_target(engine)
}
pub(crate) fn model_target(engine: &EngineState) -> Option<DeleteTarget> {
let constraints_shown = crate::workbench::panel_visible(
&engine.settings.workbench,
crate::workbench::assembly::CONSTRAINTS_PANEL_ID,
&crate::workbench::ButtonState::of(engine),
);
if let Some(id) = engine.selected_constraint().filter(|_| constraints_shown) {
return Some(DeleteTarget::Constraint(id));
}
if let Some(id) = crate::panels::context_bar::component_action_target_of(engine) {
return Some(DeleteTarget::Component(id));
}
engine.selected_feature().map(|id| DeleteTarget::Feature(id.to_string()))
}
pub fn apply(docs: &mut Documents, target: &DeleteTarget) -> Result<(), String> {
match target {
DeleteTarget::Ecad(target) => {
docs.active_mut().ecad.selection_key(*target, true);
Ok(())
}
other => apply_engine(docs.engine_mut(), other),
}
}
pub(crate) fn apply_engine(engine: &mut EngineState, target: &DeleteTarget) -> Result<(), String> {
match target {
DeleteTarget::Sketch => {
engine.sketch_delete_selection();
Ok(())
}
DeleteTarget::Sketch3d => {
engine.sketch3d_delete_selection();
Ok(())
}
DeleteTarget::Ecad(_) => Err("the eCAD editor's selection is deleted in its editor".into()),
DeleteTarget::SheetObject(id) => crate::panels::sheets::delete_held_object(engine, id),
DeleteTarget::PmiAnnotation(id) => crate::panels::pmi::delete_annotation(engine, id),
DeleteTarget::Constraint(id) => {
let result = engine.assembly_remove_constraint(id);
engine.constraint_deselect();
result
}
DeleteTarget::Component(id) => {
if id.contains(':') {
return Err(format!(
"'{id}' is a part inside a sub-assembly: open that sub-assembly to delete it"
));
}
crate::panels::component_actions::run_component_action(
engine,
crate::panels::component_actions::ComponentAction::Delete,
id,
);
Ok(())
}
DeleteTarget::Feature(id) => {
engine.delete_feature(id);
Ok(())
}
}
}
pub fn delete_selection(docs: &mut Documents) -> Result<Option<DeleteTarget>, String> {
let Some(target) = target(docs) else {
return Ok(None);
};
apply(docs, &target)?;
Ok(Some(target))
}