SLA mode: Updated object menu and "Change type" dialog

+ ObjectList: Suppress to add modifiers to the object
This commit is contained in:
YuSanka 2022-12-14 13:14:56 +01:00
parent f987caa63d
commit a3403c51cf
4 changed files with 72 additions and 99 deletions

View File

@ -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 // Update "add" items(delete old & create new) items popupmenu
for (auto& item : ADD_VOLUME_MENU_ITEMS) { for (auto& item : ADD_VOLUME_MENU_ITEMS) {
const wxString item_name = _(item.first); const wxString item_name = _(item.first);
@ -569,9 +573,11 @@ void MenuFactory::append_menu_items_add_volume(wxMenu* menu)
return; return;
} }
int type = 0; for (size_t type = 0; type < ADD_VOLUME_MENU_ITEMS.size(); type++) {
for (auto& item : ADD_VOLUME_MENU_ITEMS) { auto& item = ADD_VOLUME_MENU_ITEMS[type];
wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(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, append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second,
[type]() { [type]() {
bool can_add = type < size_t(ModelVolumeType::PARAMETER_MODIFIER) ? !obj_list()->is_selected_object_cut() : true; 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); }, m_parent);
} }
append_menu_item_layers_editing(menu); if (menu_type == mtObjectFFF)
} 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);
}
} }
wxMenuItem* MenuFactory::append_menu_item_layers_editing(wxMenu* 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_fix_through_netfabb(menu);
append_menu_item_simplify(menu); append_menu_item_simplify(menu);
append_menu_items_mirror(menu); append_menu_items_mirror(menu);
append_menu_items_split(menu);
menu->AppendSeparator();
} }
void MenuFactory::append_menu_items_split(wxMenu *menu) 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); []() { 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) void MenuFactory::append_immutable_part_menu_items(wxMenu* menu)
{ {
append_menu_items_mirror(menu); append_menu_items_mirror(menu);
@ -1184,8 +1125,8 @@ void MenuFactory::init(wxWindow* parent)
m_parent = parent; m_parent = parent;
create_default_menu(); create_default_menu();
create_object_menu(); create_common_object_menu(&m_object_menu);
create_sla_object_menu(); create_common_object_menu(&m_sla_object_menu);
create_part_menu(); create_part_menu();
create_text_part_menu(); create_text_part_menu();
create_instance_menu(); create_instance_menu();
@ -1194,7 +1135,7 @@ void MenuFactory::init(wxWindow* parent)
void MenuFactory::update() void MenuFactory::update()
{ {
update_default_menu(); update_default_menu();
update_object_menu(); update_objects_menu();
} }
wxMenu* MenuFactory::default_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() void MenuFactory::update_default_menu()

View File

@ -41,7 +41,7 @@ public:
void init(wxWindow* parent); void init(wxWindow* parent);
void update(); void update();
void update_object_menu(); void update_objects_menu();
void update_default_menu(); void update_default_menu();
void sys_color_changed(); void sys_color_changed();
@ -79,8 +79,6 @@ private:
void create_default_menu(); void create_default_menu();
void create_common_object_menu(wxMenu *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_immutable_part_menu_items(wxMenu* menu);
void append_mutable_part_menu_items(wxMenu* menu); void append_mutable_part_menu_items(wxMenu* menu);
void create_part_menu(); void create_part_menu();
@ -89,8 +87,7 @@ private:
wxMenu* append_submenu_add_generic(wxMenu* menu, ModelVolumeType type); 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_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_volume(MenuType type);
void append_menu_items_add_sla_volume(wxMenu* menu);
wxMenuItem* append_menu_item_layers_editing(wxMenu* menu); wxMenuItem* append_menu_item_layers_editing(wxMenu* menu);
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);

View File

@ -2992,7 +2992,8 @@ wxDataViewItemArray ObjectList::add_volumes_to_object_in_list(size_t obj_idx, st
int volume_idx{ -1 }; int volume_idx{ -1 };
for (const ModelVolume* volume : object->volumes) { for (const ModelVolume* volume : object->volumes) {
++volume_idx; ++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; continue;
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item,
from_u8(volume->name), from_u8(volume->name),
@ -4262,17 +4263,32 @@ void ObjectList::change_part_type()
} }
const bool is_cut_object = obj->is_cut(); const bool is_cut_object = obj->is_cut();
wxArrayString names; wxArrayString names;
if (!is_cut_object) std::vector<ModelVolumeType> types;
for (const wxString& type : { _L("Part"), _L("Negative Volume") }) types.reserve(5);
names.Add(type); if (!is_cut_object) {
names.Add(_L("Modifier")); for (const wxString& name : { _L("Part"), _L("Negative Volume") })
if (!volume->text_configuration.has_value())
for (const wxString& name : { _L("Support Blocker"), _L("Support Enforcer") })
names.Add(name); 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; if (printer_technology() != ptSLA) {
auto new_type = ModelVolumeType(type_shift + wxGetApp().GetSingleChoiceIndex(_L("Type:"), _L("Select type of part"), names, int(type) - type_shift)); 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) if (new_type == type || new_type == ModelVolumeType::INVALID)
return; return;
@ -4357,8 +4373,9 @@ void ObjectList::update_object_list_by_printer_technology()
m_objects_model->GetChildren(wxDataViewItem(nullptr), object_items); m_objects_model->GetChildren(wxDataViewItem(nullptr), object_items);
for (auto& object_item : object_items) { for (auto& object_item : object_items) {
const int obj_idx = m_objects_model->GetObjectIdByItem(object_item);
// update custom supports info // 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 for object
update_settings_item_and_selection(object_item, sel); update_settings_item_and_selection(object_item, sel);
@ -4366,10 +4383,26 @@ void ObjectList::update_object_list_by_printer_technology()
// Update settings for Volumes // Update settings for Volumes
wxDataViewItemArray all_object_subitems; wxDataViewItemArray all_object_subitems;
m_objects_model->GetChildren(object_item, all_object_subitems); m_objects_model->GetChildren(object_item, all_object_subitems);
bool was_selected_some_subitem = false;
for (auto item : all_object_subitems) for (auto item : all_object_subitems)
if (m_objects_model->GetItemType(item) & itVolume) if (m_objects_model->GetItemType(item) & itVolume) {
// update settings for volume if (sel.Index(item) != wxNOT_FOUND) {
update_settings_item_and_selection(item, sel); 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 // Update Layers Items
wxDataViewItem layers_item = m_objects_model->GetLayerRootItem(object_item); wxDataViewItem layers_item = m_objects_model->GetLayerRootItem(object_item);
@ -4411,6 +4444,8 @@ void ObjectList::update_object_list_by_printer_technology()
// restore selection: // restore selection:
SetSelections(sel); SetSelections(sel);
m_prevent_canvas_selection_update = false; m_prevent_canvas_selection_update = false;
update_selections_on_canvas();
} }
void ObjectList::instances_to_separated_object(const int obj_idx, const std::set<int>& inst_idxs) void ObjectList::instances_to_separated_object(const int obj_idx, const std::set<int>& inst_idxs)

View File

@ -1529,7 +1529,6 @@ void Sidebar::update_mode()
p->object_list->unselect_objects(); p->object_list->unselect_objects();
p->object_list->update_selections(); p->object_list->update_selections();
// p->object_list->update_object_menu();
Layout(); Layout();
} }