diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 126e00434..c1b7840a9 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -1283,6 +1283,7 @@ void MenuFactory::create_part_menu() [](wxCommandEvent&) { plater()->split_volume(); }, "split_parts", nullptr, []() { return plater()->can_split(false); }, m_parent); m_part_menu.AppendSeparator(); + append_menu_item_per_object_process(&m_part_menu); append_menu_item_per_object_settings(&m_part_menu); } @@ -1296,6 +1297,7 @@ void MenuFactory::create_text_part_menu() append_menu_item_simplify(menu); append_menu_items_mirror(menu); menu->AppendSeparator(); + append_menu_item_per_object_process(menu); append_menu_item_per_object_settings(menu); append_menu_item_change_type(menu); } @@ -1310,6 +1312,7 @@ void MenuFactory::create_svg_part_menu() append_menu_item_simplify(menu); append_menu_items_mirror(menu); menu->AppendSeparator(); + append_menu_item_per_object_process(menu); append_menu_item_per_object_settings(menu); append_menu_item_change_type(menu); } @@ -1338,6 +1341,7 @@ void MenuFactory::create_bbl_part_menu() append_submenu(menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "", []() { return plater()->can_split(true); }, m_parent); menu->AppendSeparator(); + append_menu_item_per_object_process(menu); append_menu_item_per_object_settings(menu); append_menu_item_change_type(menu); append_menu_item_reload_from_disk(menu); @@ -1667,6 +1671,7 @@ wxMenu* MenuFactory::multi_selection_menu() append_submenu(menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "", []() { return plater()->can_split(true); }, m_parent); } + append_menu_item_per_object_process(menu); } { @@ -1841,6 +1846,30 @@ void MenuFactory::append_menu_item_per_object_process(wxMenu* menu) selection.is_single_volume() || selection.is_multiple_volume(); }, m_parent); + + const std::vector names2 = {_L("Copy Process Settings"), _L("Copy Process Settings")}; + append_menu_item( + menu, wxID_ANY, names2[0], names2[1], [](wxCommandEvent &) { + wxGetApp().obj_list()->copy_settings_to_clipboard(); + }, "", nullptr, + []() { + Selection &selection = plater()->canvas3D()->get_selection(); + return selection.is_single_full_object() || selection.is_single_full_instance() || + selection.is_single_volume(); + }, + m_parent); + + const std::vector names3 = {_L("Paste Process Settings"), _L("Paste Process Settings")}; + append_menu_item( + menu, wxID_ANY, names3[0], names3[1], [](wxCommandEvent &) { + wxGetApp().obj_list()->paste_settings_into_list(); + }, "", nullptr, + []() { + Selection &selection = plater()->canvas3D()->get_selection(); + return selection.is_single_full_object() || selection.is_multiple_full_object() || selection.is_single_full_instance() || selection.is_multiple_full_instance() || + selection.is_single_volume() || selection.is_multiple_volume(); + }, + m_parent); } void MenuFactory::append_menu_item_per_object_settings(wxMenu* menu) diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index b6588eaa6..58ace5dda 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1227,33 +1227,41 @@ void ObjectList::copy_settings_to_clipboard() void ObjectList::paste_settings_into_list() { - wxDataViewItem item = GetSelection(); - assert(item.IsOk()); - if (m_objects_model->GetItemType(item) & itSettings) - item = m_objects_model->GetParent(item); + wxDataViewItemArray sels; + GetSelections(sels); + take_snapshot("Paste settings"); - ItemType item_type = m_objects_model->GetItemType(item); - if(!(item_type & (itObject | itVolume |itLayer))) - return; + for (auto item : sels) { - DynamicPrintConfig& config_cache = m_clipboard.get_config_cache(); - assert(!config_cache.empty()); + if (m_objects_model->GetItemType(item) & itSettings) + item = m_objects_model->GetParent(item); - auto keys = config_cache.keys(); - auto part_options = SettingsFactory::get_options(true); + ItemType item_type = m_objects_model->GetItemType(item); + if(!(item_type & (itObject | itVolume |itLayer))) + return; - for (const std::string& opt_key: keys) { - if (item_type & (itVolume | itLayer) && - std::find(part_options.begin(), part_options.end(), opt_key) == part_options.end()) - continue; // we can't to add object specific options for the part's(itVolume | itLayer) config + DynamicPrintConfig& config_cache = m_clipboard.get_config_cache(); + assert(!config_cache.empty()); - const ConfigOption* option = config_cache.option(opt_key); - if (option) - m_config->set_key_value(opt_key, option->clone()); + auto keys = config_cache.keys(); + auto part_options = SettingsFactory::get_options(true); + auto config = &get_item_config(item); + + for (const std::string& opt_key: keys) { + if (item_type & (itVolume | itLayer) && + std::find(part_options.begin(), part_options.end(), opt_key) == part_options.end()) + continue; // we can't to add object specific options for the part's(itVolume | itLayer) config + + const ConfigOption* option = config_cache.option(opt_key); + if (option) + config->set_key_value(opt_key, option->clone()); + } + + // Add settings item for object/sub-object and show them + add_settings_item(item, &config->get()); } - // Add settings item for object/sub-object and show them - show_settings(add_settings_item(item, &m_config->get())); + part_selection_changed(); } void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes)