Fix of Crash when trying to select extruders for multiple parts (#3657)

This commit is contained in:
YuSanka 2020-02-14 13:27:01 +01:00
parent cd937d62b5
commit 3f27802c0a
3 changed files with 33 additions and 17 deletions

View file

@ -1541,7 +1541,8 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
// If there are selected more then one instance but not all of them // If there are selected more then one instance but not all of them
// don't add settings menu items // don't add settings menu items
const Selection& selection = scene_selection(); const Selection& selection = scene_selection();
if (selection.is_multiple_full_instance() && !selection.is_single_full_object()) if (selection.is_multiple_full_instance() && !selection.is_single_full_object() ||
selection.is_multiple_volume() || selection.is_mixed() ) // more than one volume(part) is selected on the scene
return nullptr; return nullptr;
const auto sel_vol = get_selected_model_volume(); const auto sel_vol = get_selected_model_volume();
@ -1560,6 +1561,8 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
// Add frequently settings // Add frequently settings
const ItemType item_type = m_objects_model->GetItemType(GetSelection()); const ItemType item_type = m_objects_model->GetItemType(GetSelection());
if (item_type == itUndef)
return nullptr;
const bool is_object_settings = item_type & itObject || item_type & itInstance || selection.is_single_full_object(); const bool is_object_settings = item_type & itObject || item_type & itInstance || selection.is_single_full_object();
create_freq_settings_popupmenu(menu, is_object_settings); create_freq_settings_popupmenu(menu, is_object_settings);
@ -1577,11 +1580,14 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
return menu->Append(menu_item); return menu->Append(menu_item);
} }
wxMenuItem* ObjectList::append_menu_item_change_type(wxMenu* menu) wxMenuItem* ObjectList::append_menu_item_change_type(wxMenu* menu, wxWindow* parent/* = nullptr*/)
{ {
return append_menu_item(menu, wxID_ANY, _(L("Change type")), "", return append_menu_item(menu, wxID_ANY, _(L("Change type")), "",
[this](wxCommandEvent&) { change_part_type(); }, "", menu); [this](wxCommandEvent&) { change_part_type(); }, "", menu,
[this]() {
wxDataViewItem item = GetSelection();
return item.IsOk() || m_objects_model->GetItemType(item) == itVolume;
}, parent);
} }
wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent) wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent)
@ -1656,19 +1662,27 @@ void ObjectList::append_menu_item_reload_from_disk(wxMenu* menu) const
[]() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater());
} }
void ObjectList::append_menu_item_change_extruder(wxMenu* menu) const void ObjectList::append_menu_item_change_extruder(wxMenu* menu)
{ {
const wxString name = _(L("Change extruder")); const std::vector<wxString> names = {_(L("Change extruder")), _(L("Set extruder for selected items")) };
// Delete old menu item // Delete old menu item
const int item_id = menu->FindItem(name); for (const wxString& name : names) {
if (item_id != wxNOT_FOUND) const int item_id = menu->FindItem(name);
menu->Destroy(item_id); if (item_id != wxNOT_FOUND)
menu->Destroy(item_id);
}
const int extruders_cnt = extruders_count(); const int extruders_cnt = extruders_count();
const wxDataViewItem item = GetSelection(); if (extruders_cnt <= 1)
if (item && extruders_cnt > 1) return;
if (!GetSelection().IsOk())
append_menu_item(menu, wxID_ANY, names[1],
_(L("Select extruder number for selected objects and/or parts")),
[this](wxCommandEvent&) { extruder_selection(); }, "", menu);
else
{ {
DynamicPrintConfig& config = get_item_config(item); DynamicPrintConfig& config = get_item_config(GetSelection());
const int initial_extruder = !config.has("extruder") ? 0 : const int initial_extruder = !config.has("extruder") ? 0 :
config.option<ConfigOptionInt>("extruder")->value; config.option<ConfigOptionInt>("extruder")->value;
@ -1683,7 +1697,7 @@ void ObjectList::append_menu_item_change_extruder(wxMenu* menu) const
[this, i](wxCommandEvent&) { set_extruder_for_selected_items(i); }, menu)->Check(i == initial_extruder); [this, i](wxCommandEvent&) { set_extruder_for_selected_items(i); }, menu)->Check(i == initial_extruder);
} }
menu->AppendSubMenu(extruder_selection_menu, name, _(L("Select new extruder for the object/part"))); menu->AppendSubMenu(extruder_selection_menu, names[0], _(L("Select new extruder for the object/part")));
} }
} }
@ -3159,7 +3173,9 @@ void ObjectList::update_selections()
for (auto obj_ins : objects_content_list) { for (auto obj_ins : objects_content_list) {
if (obj_ins.first == glv_obj_idx) { if (obj_ins.first == glv_obj_idx) {
if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end()) { if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end() &&
!selection.is_from_single_instance() ) // a case when volumes of different types are selected
{
if (glv_ins_idx == 0 && (*m_objects)[glv_obj_idx]->instances.size() == 1) if (glv_ins_idx == 0 && (*m_objects)[glv_obj_idx]->instances.size() == 1)
sels.Add(m_objects_model->GetItemById(glv_obj_idx)); sels.Add(m_objects_model->GetItemById(glv_obj_idx));
else else

View file

@ -241,14 +241,14 @@ public:
wxMenuItem* append_menu_item_split(wxMenu* menu); wxMenuItem* append_menu_item_split(wxMenu* menu);
wxMenuItem* append_menu_item_layers_editing(wxMenu* menu, wxWindow* parent); wxMenuItem* append_menu_item_layers_editing(wxMenu* menu, wxWindow* parent);
wxMenuItem* append_menu_item_settings(wxMenu* menu); wxMenuItem* append_menu_item_settings(wxMenu* menu);
wxMenuItem* append_menu_item_change_type(wxMenu* menu); wxMenuItem* append_menu_item_change_type(wxMenu* menu, wxWindow* parent = nullptr);
wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent); wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent);
wxMenuItem* append_menu_item_printable(wxMenu* menu, wxWindow* parent); wxMenuItem* append_menu_item_printable(wxMenu* menu, wxWindow* parent);
void append_menu_items_osx(wxMenu* menu); void append_menu_items_osx(wxMenu* menu);
wxMenuItem* append_menu_item_fix_through_netfabb(wxMenu* menu); wxMenuItem* append_menu_item_fix_through_netfabb(wxMenu* menu);
void append_menu_item_export_stl(wxMenu* menu) const; void append_menu_item_export_stl(wxMenu* menu) const;
void append_menu_item_reload_from_disk(wxMenu* menu) const; void append_menu_item_reload_from_disk(wxMenu* menu) const;
void append_menu_item_change_extruder(wxMenu* menu) const; void append_menu_item_change_extruder(wxMenu* menu);
void append_menu_item_delete(wxMenu* menu); void append_menu_item_delete(wxMenu* menu);
void append_menu_item_scale_selection_to_fit_print_volume(wxMenu* menu); void append_menu_item_scale_selection_to_fit_print_volume(wxMenu* menu);
void create_object_popupmenu(wxMenu *menu); void create_object_popupmenu(wxMenu *menu);

View file

@ -4029,7 +4029,7 @@ bool Plater::priv::complit_init_part_menu()
part_menu.AppendSeparator(); part_menu.AppendSeparator();
auto obj_list = sidebar->obj_list(); auto obj_list = sidebar->obj_list();
obj_list->append_menu_item_change_type(&part_menu); obj_list->append_menu_item_change_type(&part_menu, q);
return true; return true;
} }