diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 0250d2164b..6dece9a224 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -532,8 +532,12 @@ void MenuFactory::append_menu_item_add_text(wxMenu* menu, ModelVolumeType type, } } -void MenuFactory::append_menu_items_add_volume(wxMenu* menu) +void MenuFactory::append_menu_items_add_volume(MenuType menu_type) { + wxMenu* menu = menu_type == mtObjectFFF ? &m_object_menu : menu_type == mtObjectSLA ? &m_sla_object_menu : nullptr; + if (!menu) + return; + // Update "add" items(delete old & create new) items popupmenu for (auto& item : ADD_VOLUME_MENU_ITEMS) { const wxString item_name = _(item.first); @@ -569,9 +573,11 @@ void MenuFactory::append_menu_items_add_volume(wxMenu* menu) return; } - int type = 0; - for (auto& item : ADD_VOLUME_MENU_ITEMS) { - wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type++)); + for (size_t type = 0; type < ADD_VOLUME_MENU_ITEMS.size(); type++) { + auto& item = ADD_VOLUME_MENU_ITEMS[type]; + if (menu_type == mtObjectSLA && ModelVolumeType(type) == ModelVolumeType::PARAMETER_MODIFIER) + continue; + wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type)); append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, [type]() { bool can_add = type < size_t(ModelVolumeType::PARAMETER_MODIFIER) ? !obj_list()->is_selected_object_cut() : true; @@ -579,56 +585,8 @@ void MenuFactory::append_menu_items_add_volume(wxMenu* menu) }, m_parent); } - append_menu_item_layers_editing(menu); -} - -void MenuFactory::append_menu_items_add_sla_volume(wxMenu *menu) -{ - // Update "add" items(delete old & create new) settings popupmenu - for (auto& item : ADD_VOLUME_MENU_ITEMS) { - const auto settings_id = menu->FindItem(_(item.first)); - if (settings_id != wxNOT_FOUND) - menu->Destroy(settings_id); - } - - const ConfigOptionMode mode = wxGetApp().get_mode(); - - if (mode == comAdvanced) { - append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].first), "", - [](wxCommandEvent&) { obj_list()->load_subobject(ModelVolumeType::MODEL_PART); }, - ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second, nullptr, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); - } else { - auto& item = ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)]; - - wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::MODEL_PART); - append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); - } - - { - auto& item = ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::NEGATIVE_VOLUME)]; - - wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::NEGATIVE_VOLUME); - append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); - } - - { - auto& item = ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)]; - - wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::SUPPORT_ENFORCER); - append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); - } - - { - auto& item = ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)]; - - wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::SUPPORT_BLOCKER); - append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, - []() { return obj_list()->is_instance_or_object_selected(); }, m_parent); - } + if (menu_type == mtObjectFFF) + append_menu_item_layers_editing(menu); } wxMenuItem* MenuFactory::append_menu_item_layers_editing(wxMenu* menu) @@ -1086,6 +1044,9 @@ void MenuFactory::create_common_object_menu(wxMenu* menu) append_menu_item_fix_through_netfabb(menu); append_menu_item_simplify(menu); append_menu_items_mirror(menu); + + append_menu_items_split(menu); + menu->AppendSeparator(); } void MenuFactory::append_menu_items_split(wxMenu *menu) @@ -1105,26 +1066,6 @@ void MenuFactory::append_menu_items_split(wxMenu *menu) []() { return plater()->can_split(true); }, m_parent); } -void MenuFactory::create_object_menu() -{ - create_common_object_menu(&m_object_menu); - - append_menu_items_split(&m_object_menu); - m_object_menu.AppendSeparator(); - - // "Height range Modifier" and "Add (volumes)" menu items will be added later in append_menu_items_add_volume() -} - -void MenuFactory::create_sla_object_menu() -{ - create_common_object_menu(&m_sla_object_menu); - append_menu_items_split(&m_sla_object_menu); - - m_sla_object_menu.AppendSeparator(); - append_menu_items_add_sla_volume(&m_sla_object_menu); - m_sla_object_menu.AppendSeparator(); -} - void MenuFactory::append_immutable_part_menu_items(wxMenu* menu) { append_menu_items_mirror(menu); @@ -1184,8 +1125,8 @@ void MenuFactory::init(wxWindow* parent) m_parent = parent; create_default_menu(); - create_object_menu(); - create_sla_object_menu(); + create_common_object_menu(&m_object_menu); + create_common_object_menu(&m_sla_object_menu); create_part_menu(); create_text_part_menu(); create_instance_menu(); @@ -1194,7 +1135,7 @@ void MenuFactory::init(wxWindow* parent) void MenuFactory::update() { update_default_menu(); - update_object_menu(); + update_objects_menu(); } wxMenu* MenuFactory::default_menu() @@ -1331,9 +1272,10 @@ void MenuFactory::update_menu_items_instance_manipulation(MenuType type) } } -void MenuFactory::update_object_menu() +void MenuFactory::update_objects_menu() { - append_menu_items_add_volume(&m_object_menu); + append_menu_items_add_volume(mtObjectFFF); + append_menu_items_add_volume(mtObjectSLA); } void MenuFactory::update_default_menu() diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp index 34725d6c14..515311d0de 100644 --- a/src/slic3r/GUI/GUI_Factories.hpp +++ b/src/slic3r/GUI/GUI_Factories.hpp @@ -41,7 +41,7 @@ public: void init(wxWindow* parent); void update(); - void update_object_menu(); + void update_objects_menu(); void update_default_menu(); void sys_color_changed(); @@ -79,8 +79,6 @@ private: void create_default_menu(); void create_common_object_menu(wxMenu *menu); - void create_object_menu(); - void create_sla_object_menu(); void append_immutable_part_menu_items(wxMenu* menu); void append_mutable_part_menu_items(wxMenu* menu); void create_part_menu(); @@ -89,8 +87,7 @@ private: wxMenu* append_submenu_add_generic(wxMenu* menu, ModelVolumeType type); void append_menu_item_add_text(wxMenu* menu, ModelVolumeType type, bool is_submenu_item = true); - void append_menu_items_add_volume(wxMenu* menu); - void append_menu_items_add_sla_volume(wxMenu* menu); + void append_menu_items_add_volume(MenuType type); wxMenuItem* append_menu_item_layers_editing(wxMenu* menu); wxMenuItem* append_menu_item_settings(wxMenu* menu); wxMenuItem* append_menu_item_change_type(wxMenu* menu); diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 8c15464100..a5ddcf94c5 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2992,7 +2992,8 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st int volume_idx{ -1 }; for (const ModelVolume* volume : object->volumes) { ++volume_idx; - if (object->is_cut() && volume->is_cut_connector()) + if ((object->is_cut() && volume->is_cut_connector()) || + (printer_technology() == ptSLA && volume->type() == ModelVolumeType::PARAMETER_MODIFIER)) continue; const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, from_u8(volume->name), @@ -4262,17 +4263,32 @@ void ObjectList::change_part_type() } const bool is_cut_object = obj->is_cut(); - wxArrayString names; - if (!is_cut_object) - for (const wxString& type : { _L("Part"), _L("Negative Volume") }) - names.Add(type); - names.Add(_L("Modifier")); - if (!volume->text_configuration.has_value()) - for (const wxString& name : { _L("Support Blocker"), _L("Support Enforcer") }) + wxArrayString names; + std::vector types; + types.reserve(5); + if (!is_cut_object) { + for (const wxString& name : { _L("Part"), _L("Negative Volume") }) names.Add(name); + for (const ModelVolumeType type_id : { ModelVolumeType::MODEL_PART, ModelVolumeType::NEGATIVE_VOLUME }) + types.emplace_back(type_id); + } - const int type_shift = is_cut_object ? 2 : 0; - auto new_type = ModelVolumeType(type_shift + wxGetApp().GetSingleChoiceIndex(_L("Type:"), _L("Select type of part"), names, int(type) - type_shift)); + if (printer_technology() != ptSLA) { + names.Add(_L("Modifier")); + types.emplace_back(ModelVolumeType::PARAMETER_MODIFIER); + } + + if (!volume->text_configuration.has_value()) { + for (const wxString& name : { _L("Support Blocker"), _L("Support Enforcer") }) + names.Add(name); + for (const ModelVolumeType type_id : { ModelVolumeType::SUPPORT_BLOCKER, ModelVolumeType::SUPPORT_ENFORCER }) + types.emplace_back(type_id); + } + + int selection = 0; + if (auto it = std::find(types.begin(), types.end(), type); it != types.end()) + selection = it - types.begin(); + const auto new_type = types[wxGetApp().GetSingleChoiceIndex(_L("Type:"), _L("Select type of part"), names, selection)]; if (new_type == type || new_type == ModelVolumeType::INVALID) return; @@ -4357,8 +4373,9 @@ void ObjectList::update_object_list_by_printer_technology() m_objects_model->GetChildren(wxDataViewItem(nullptr), object_items); for (auto& object_item : object_items) { + const int obj_idx = m_objects_model->GetObjectIdByItem(object_item); // update custom supports info - update_info_items(m_objects_model->GetObjectIdByItem(object_item), &sel); + update_info_items(obj_idx, &sel); // Update Settings Item for object update_settings_item_and_selection(object_item, sel); @@ -4366,10 +4383,26 @@ void ObjectList::update_object_list_by_printer_technology() // Update settings for Volumes wxDataViewItemArray all_object_subitems; m_objects_model->GetChildren(object_item, all_object_subitems); + + bool was_selected_some_subitem = false; for (auto item : all_object_subitems) - if (m_objects_model->GetItemType(item) & itVolume) - // update settings for volume - update_settings_item_and_selection(item, sel); + if (m_objects_model->GetItemType(item) & itVolume) { + if (sel.Index(item) != wxNOT_FOUND) { + sel.Remove(item); + was_selected_some_subitem = true; + } + else if (const wxDataViewItem vol_settings_item = m_objects_model->GetSettingsItem(item); + sel.Index(vol_settings_item) != wxNOT_FOUND) { + sel.Remove(vol_settings_item); + was_selected_some_subitem = true; + break; + } + } + if (was_selected_some_subitem) + sel.Add(object_item); + + // Update volumes list in respect to the print mode + add_volumes_to_object_in_list(obj_idx); // Update Layers Items wxDataViewItem layers_item = m_objects_model->GetLayerRootItem(object_item); @@ -4411,6 +4444,8 @@ void ObjectList::update_object_list_by_printer_technology() // restore selection: SetSelections(sel); m_prevent_canvas_selection_update = false; + + update_selections_on_canvas(); } void ObjectList::instances_to_separated_object(const int obj_idx, const std::set& inst_idxs) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 734f6140ec..8a9e934853 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1529,7 +1529,6 @@ void Sidebar::update_mode() p->object_list->unselect_objects(); p->object_list->update_selections(); -// p->object_list->update_object_menu(); Layout(); }