From 68545b2a810a3bc821c2fb512897cc3a5170e585 Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Tue, 8 Oct 2024 10:53:39 +0800 Subject: [PATCH] FIX:allow single cutter selected at 3D view jira: none Change-Id: I2b90dace9f4288bd8077617a526fc3b5cf6543b7 --- src/slic3r/GUI/GUI_Factories.cpp | 18 +++++++++++++++++- src/slic3r/GUI/GUI_Factories.hpp | 1 + src/slic3r/GUI/GUI_ObjectList.cpp | 10 ++++++++-- src/slic3r/GUI/Plater.cpp | 9 +++++++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index c66139ea3..931e1bb96 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -486,6 +486,18 @@ void MenuFactory::append_menu_item_delete(wxMenu* menu) #endif } +void MenuFactory::append_menu_item_delete_all_cutter(wxMenu *menu) +{ +#ifdef __WINDOWS__ + append_menu_item( + menu, wxID_ANY, _L("Delete all cutter") + "\t" + _L("Del"), _L("Delete all cutter"), [](wxCommandEvent &) { plater()->remove_selected(); }, "menu_delete", nullptr, + []() { return plater()->can_delete(); }, m_parent); +#else + append_menu_item( + menu, wxID_ANY, _L("Delete all cutter") + "\tBackSpace", _L("Delete all cutter"), [](wxCommandEvent &) { plater()->remove_selected(); }, "", nullptr, + []() { return plater()->can_delete(); }, m_parent); +#endif +} void MenuFactory::append_menu_item_edit_text(wxMenu *menu) { @@ -716,6 +728,10 @@ wxMenuItem* MenuFactory::append_menu_item_change_type(wxMenu* menu) return append_menu_item(menu, wxID_ANY, _L("Change type"), "", [](wxCommandEvent&) { obj_list()->change_part_type(); }, "", menu, []() { + const Selection &selection = plater()->canvas3D()->get_selection(); + if (selection.get_volume_idxs().size() != 1) { + return false; + } wxDataViewItem item = obj_list()->GetSelection(); return item.IsOk() || obj_list()->GetModel()->GetItemType(item) == itVolume; }, m_parent); @@ -1340,7 +1356,7 @@ void MenuFactory::create_bbl_assemble_part_menu() void MenuFactory::create_cut_cutter_menu() { wxMenu *menu = &m_cut_cutter_menu; - append_menu_item_delete(menu); + append_menu_item_delete_all_cutter(menu); append_menu_item_change_type(menu); } diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp index 18147383b..d83921761 100644 --- a/src/slic3r/GUI/GUI_Factories.hpp +++ b/src/slic3r/GUI/GUI_Factories.hpp @@ -147,6 +147,7 @@ private: void append_menu_item_change_extruder(wxMenu* menu); void append_menu_item_set_visible(wxMenu* menu); void append_menu_item_delete(wxMenu* menu); + void append_menu_item_delete_all_cutter(wxMenu *menu); void append_menu_item_scale_selection_to_fit_print_volume(wxMenu* menu); void append_menu_items_convert_unit(wxMenu* menu); // Add "Conver/Revert..." menu items (from/to inches/meters) after "Reload From Disk" void append_menu_items_flush_options(wxMenu* menu); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index f708e485e..07b933ab7 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -4791,8 +4791,6 @@ void ObjectList::update_selections_on_canvas() if (sel_cnt == 1) { wxDataViewItem item = GetSelection(); - if (m_objects_model->GetInfoItemType(item) == InfoItemType::CutConnectors) - selection.remove_all(); if (m_objects_model->GetItemType(item) & (itSettings | itInstanceRoot | itLayerRoot | itLayer)) add_to_selection(m_objects_model->GetParent(item), selection, instance_idx, mode); @@ -4829,6 +4827,9 @@ void ObjectList::update_selections_on_canvas() // to avoid lost of some volumes in selection // check non-selected volumes only if selection mode wasn't changed // OR there is no single selection + if (is_connectors_item_selected() && !selection.is_empty()) { + return; + } if (selection.get_mode() == mode || !single_selection) volume_idxs = selection.get_unselected_volume_idxs_from(volume_idxs); Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Add selected to list", UndoRedo::SnapshotType::Selection); @@ -5137,6 +5138,11 @@ void ObjectList::fix_cut_selection() m_prevent_list_events = false; } + auto canvas_type = wxGetApp().plater()->get_current_canvas3D()->get_canvas_type(); + if (canvas_type == GLCanvas3D::ECanvasType::CanvasView3D && is_connectors_item_selected()) { + Selection &selection = wxGetApp().plater()->get_view3D_canvas3D()->get_selection(); + selection.remove_all(); + } } bool ObjectList::fix_cut_selection(wxDataViewItemArray &sels) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 65051be87..d0a92db6a 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -7454,8 +7454,13 @@ void Plater::priv::on_right_click(RBtnEvent& evt) menu = menus.part_menu(); } } - } else - menu = menus.multi_selection_menu(); + } else { + if (selection.is_any_cut_volume()) { + menu = menus.cut_connector_menu(); + } else { + menu = menus.multi_selection_menu(); + } + } } } }