ENH: copy/paste object settings (menu)

Change-Id: If5f6f75102fbd43f652a96d01f9edd4676fa3152
Jira: STUDIO-11666
This commit is contained in:
chunmao.guo 2025-05-13 14:23:32 +08:00 committed by lane.wei
parent 8308fe3964
commit 59cee48fbf
2 changed files with 57 additions and 20 deletions

View File

@ -1283,6 +1283,7 @@ void MenuFactory::create_part_menu()
[](wxCommandEvent&) { plater()->split_volume(); }, "split_parts", nullptr, [](wxCommandEvent&) { plater()->split_volume(); }, "split_parts", nullptr,
[]() { return plater()->can_split(false); }, m_parent); []() { return plater()->can_split(false); }, m_parent);
m_part_menu.AppendSeparator(); m_part_menu.AppendSeparator();
append_menu_item_per_object_process(&m_part_menu);
append_menu_item_per_object_settings(&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_item_simplify(menu);
append_menu_items_mirror(menu); append_menu_items_mirror(menu);
menu->AppendSeparator(); menu->AppendSeparator();
append_menu_item_per_object_process(menu);
append_menu_item_per_object_settings(menu); append_menu_item_per_object_settings(menu);
append_menu_item_change_type(menu); append_menu_item_change_type(menu);
} }
@ -1310,6 +1312,7 @@ void MenuFactory::create_svg_part_menu()
append_menu_item_simplify(menu); append_menu_item_simplify(menu);
append_menu_items_mirror(menu); append_menu_items_mirror(menu);
menu->AppendSeparator(); menu->AppendSeparator();
append_menu_item_per_object_process(menu);
append_menu_item_per_object_settings(menu); append_menu_item_per_object_settings(menu);
append_menu_item_change_type(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"), "", append_submenu(menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "",
[]() { return plater()->can_split(true); }, m_parent); []() { return plater()->can_split(true); }, m_parent);
menu->AppendSeparator(); menu->AppendSeparator();
append_menu_item_per_object_process(menu);
append_menu_item_per_object_settings(menu); append_menu_item_per_object_settings(menu);
append_menu_item_change_type(menu); append_menu_item_change_type(menu);
append_menu_item_reload_from_disk(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"), "", append_submenu(menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "",
[]() { return plater()->can_split(true); }, m_parent); []() { 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_single_volume() ||
selection.is_multiple_volume(); selection.is_multiple_volume();
}, m_parent); }, m_parent);
const std::vector<wxString> 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<wxString> 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) void MenuFactory::append_menu_item_per_object_settings(wxMenu* menu)

View File

@ -1227,8 +1227,12 @@ void ObjectList::copy_settings_to_clipboard()
void ObjectList::paste_settings_into_list() void ObjectList::paste_settings_into_list()
{ {
wxDataViewItem item = GetSelection(); wxDataViewItemArray sels;
assert(item.IsOk()); GetSelections(sels);
take_snapshot("Paste settings");
for (auto item : sels) {
if (m_objects_model->GetItemType(item) & itSettings) if (m_objects_model->GetItemType(item) & itSettings)
item = m_objects_model->GetParent(item); item = m_objects_model->GetParent(item);
@ -1241,6 +1245,7 @@ void ObjectList::paste_settings_into_list()
auto keys = config_cache.keys(); auto keys = config_cache.keys();
auto part_options = SettingsFactory::get_options(true); auto part_options = SettingsFactory::get_options(true);
auto config = &get_item_config(item);
for (const std::string& opt_key: keys) { for (const std::string& opt_key: keys) {
if (item_type & (itVolume | itLayer) && if (item_type & (itVolume | itLayer) &&
@ -1249,11 +1254,14 @@ void ObjectList::paste_settings_into_list()
const ConfigOption* option = config_cache.option(opt_key); const ConfigOption* option = config_cache.option(opt_key);
if (option) if (option)
m_config->set_key_value(opt_key, option->clone()); config->set_key_value(opt_key, option->clone());
} }
// Add settings item for object/sub-object and show them // Add settings item for object/sub-object and show them
show_settings(add_settings_item(item, &m_config->get())); add_settings_item(item, &config->get());
}
part_selection_changed();
} }
void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes) void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes)