From c990314567383d3bfff72ac11df6471e0a10f315 Mon Sep 17 00:00:00 2001 From: "chunmao.guo" Date: Wed, 18 Dec 2024 19:28:14 +0800 Subject: [PATCH] ENH: printer nozzle diameter select Change-Id: Ibf8b74e1f93a7c387db3f0fb5e6e733165322322 Jira: STUDIO-9140 --- resources/images/page_down.svg | 3 + resources/images/page_up.svg | 3 + src/libslic3r/Preset.cpp | 11 +++ src/libslic3r/Preset.hpp | 2 + src/libslic3r/PresetBundle.cpp | 22 ++++- src/libslic3r/PresetBundle.hpp | 3 +- src/slic3r/GUI/Plater.cpp | 129 +++++++++++++++++++++++++--- src/slic3r/GUI/PresetComboBoxes.cpp | 93 ++++++++++---------- src/slic3r/GUI/PresetComboBoxes.hpp | 4 +- 9 files changed, 205 insertions(+), 65 deletions(-) create mode 100644 resources/images/page_down.svg create mode 100644 resources/images/page_up.svg diff --git a/resources/images/page_down.svg b/resources/images/page_down.svg new file mode 100644 index 000000000..7841fee1f --- /dev/null +++ b/resources/images/page_down.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/images/page_up.svg b/resources/images/page_up.svg new file mode 100644 index 000000000..615317ceb --- /dev/null +++ b/resources/images/page_up.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 5f15698e6..91360486a 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2677,6 +2677,17 @@ size_t PresetCollection::first_visible_idx() const return first_visible; } +std::vector PresetCollection::diameters_of_selected_printer() +{ + std::set diameters; + auto printer_model = m_edited_preset.config.opt_string("printer_model"); + for (auto &preset : m_presets) { + if (preset.config.opt_string("printer_model") == printer_model) + diameters.insert(preset.config.opt_string("printer_variant")); + } + return std::vector{diameters.begin(), diameters.end()}; +} + void PresetCollection::set_default_suppressed(bool default_suppressed) { if (m_default_suppressed != default_suppressed) { diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 038ad0b85..e43adf6cd 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -623,6 +623,8 @@ public: // Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible. size_t first_compatible_idx() const { return this->first_compatible_idx([](const Preset&) -> int { return 0; }); } + std::vector diameters_of_selected_printer(); + // Return index of the first visible preset. Certainly at least the '- default -' preset shall be visible. // Return the first visible preset. Certainly at least the '- default -' preset shall be visible. Preset& first_visible() { return this->preset(this->first_visible_idx()); } diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 2d3bb269a..6a68e4e33 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1922,7 +1922,7 @@ std::vector> PresetBundle::get_extruder_filament return filament_infos; } -std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str) +std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str, bool system_only) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " " << __LINE__ << "printer_type: " << printer_type << "nozzle_diameter_str" << nozzle_diameter_str; std::set printer_names; @@ -1937,7 +1937,7 @@ std::set PresetBundle::get_printer_names_by_printer_type_and_nozzle std::ostringstream stream; for (auto printer_it = this->printers.begin(); printer_it != this->printers.end(); printer_it++) { - if (!printer_it->is_system) continue; + if (system_only && !printer_it->is_system) continue; ConfigOption * printer_model_opt = printer_it->config.option("printer_model"); ConfigOptionString *printer_model_str = dynamic_cast(printer_model_opt); @@ -2020,6 +2020,24 @@ bool PresetBundle::check_filament_temp_equation_by_printer_type_and_nozzle_for_m return is_equation; } +Preset *PresetBundle::get_similar_printer_preset(std::string printer_model, std::string printer_variant) +{ + if (printer_model.empty()) + printer_model = printers.get_selected_preset().config.opt_string("printer_model"); + auto printer_variant_old = printers.get_selected_preset().config.opt_string("printer_variant"); + auto printer_names = get_printer_names_by_printer_type_and_nozzle(printer_model, printer_variant.empty() ? printer_variant_old : printer_variant, !printer_model.empty()); + if (printer_names.empty()) + return nullptr; + auto prefer_printer = printers.get_selected_preset().name; + if (!printer_variant.empty()) + boost::replace_all(prefer_printer, printer_variant_old, printer_variant); + else if (auto n = prefer_printer.find(printer_variant_old); n != std::string::npos) + prefer_printer = printer_model + " " + printer_variant_old + prefer_printer.substr(n + printer_variant_old.length()); + if (printer_names.count(prefer_printer) == 0) + prefer_printer = *printer_names.begin(); + return printers.find_preset(prefer_printer, false, true); +} + //BBS: check whether this is the only edited filament bool PresetBundle::is_the_only_edited_filament(unsigned int filament_index) { diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 37c8d185f..7ed7f4e26 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -107,7 +107,7 @@ public: std::vector> get_extruder_filament_info() const; - std::set get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str); + std::set get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str, bool system_only = true); bool check_filament_temp_equation_by_printer_type_and_nozzle_for_mas_tray(const std::string &printer_type, std::string & nozzle_diameter_str, std::string & setting_id, @@ -115,6 +115,7 @@ public: std::string & nozzle_temp_min, std::string & nozzle_temp_max, std::string & preset_setting_id); + Preset * get_similar_printer_preset(std::string printer_model, std::string printer_variant); PresetCollection prints; PresetCollection sla_prints; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c9edcad35..ac9e26865 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -318,6 +318,7 @@ struct ExtruderGroup : StaticGroup ExtruderGroup(wxWindow * parent, int index, wxString const &title); wxStaticBoxSizer *sizer = nullptr; ScalableButton * btn_edit = nullptr; + ComboBox * combo_diameter = nullptr; ComboBox * combo_nozzle = nullptr; AMSPreview * ams[4] = {nullptr}; wxStaticText *ams_not_installed_msg{nullptr}; @@ -326,6 +327,7 @@ struct ExtruderGroup : StaticGroup bool is_upward{false}; int ams_n4 = 0; int ams_n1 = 0; + wxString diameter; void set_ams_count(int n4, int n1) { @@ -340,6 +342,7 @@ struct ExtruderGroup : StaticGroup { if (btn_edit) btn_edit->msw_rescale(); + combo_diameter->Rescale(); combo_nozzle->Rescale(); } }; @@ -437,6 +440,7 @@ struct Sidebar::priv void can_search(); void sync_extruder_list(); + bool switch_diameter(bool single); #ifdef _WIN32 wxString btn_reslice_tip; @@ -837,9 +841,16 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title ShowBadge(true); // Nozzle + wxStaticText *label_diameter = new wxStaticText(this, wxID_ANY, _L("Diameter")); + label_diameter->SetFont(Label::Body_14); + label_diameter->SetForegroundColour("#262E30"); + label_diameter->SetMinSize({FromDIP(80), -1}); + auto combo_diameter = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); + this->combo_diameter = combo_diameter; wxStaticText *label_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle")); label_nozzle->SetFont(Label::Body_14); label_nozzle->SetForegroundColour("#262E30"); + label_nozzle->SetMinSize({FromDIP(80), -1}); auto combo_nozzle = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); combo_nozzle->GetDropDown().SetUseContentWidth(true); combo_nozzle->Bind(wxEVT_COMBOBOX, [this, index, combo_nozzle](wxCommandEvent &evt) { @@ -852,6 +863,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS")); label_ams->SetFont(Label::Body_14); label_ams->SetForegroundColour("#262E30"); + //label_ams->SetMinSize({FromDIP(70), -1}); if (index >= 0) { btn_edit = new ScalableButton(this, wxID_ANY, "dot"); btn_edit->SetBackgroundColour(*wxWHITE); @@ -866,7 +878,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title }); auto hovered = std::make_shared(); - for (wxWindow *w : std::initializer_list{this, label_nozzle, combo_nozzle, btn_edit, label_ams}) { + for (wxWindow *w : std::initializer_list{this, label_diameter, combo_diameter, label_nozzle, combo_nozzle, btn_edit, label_ams}) { w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, this](wxMouseEvent &evt) { *hovered = w; btn_edit->SetBitmap_("edit"); }); w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, this](wxMouseEvent &evt) { if (*hovered == w) { btn_edit->SetBitmap_("dot"); *hovered = nullptr; } }); } @@ -890,24 +902,32 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title hsizer_ams->Add(btn_edit, 0, 0); up_down_btn = new ScalableButton(this, wxID_ANY, "dot"); + up_down_btn->SetBackgroundColour(*wxWHITE); up_down_btn->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [this, index](auto &evt) { is_upward = !is_upward; update_ams(); }); + wxBoxSizer *hsizer_diameter = new wxBoxSizer(wxHORIZONTAL); + hsizer_diameter->Add(label_diameter, 0, wxALIGN_CENTER); + hsizer_diameter->Add(combo_diameter, 1, wxEXPAND); wxBoxSizer * hsizer_nozzle = new wxBoxSizer(wxHORIZONTAL); - hsizer_nozzle->Add(label_nozzle, 2, wxALIGN_CENTER); - hsizer_nozzle->Add(combo_nozzle, 3, wxEXPAND); + hsizer_nozzle->Add(label_nozzle, 0, wxALIGN_CENTER); + hsizer_nozzle->Add(combo_nozzle, 1, wxEXPAND); if (index < 0) { wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL); - hsizer->Add(hsizer_ams, 1, wxLEFT | wxTOP | wxBOTTOM | wxALIGN_CENTER, FromDIP(4)); - hsizer->Add(hsizer_nozzle, 1, wxALL | wxALIGN_CENTER, FromDIP(4)); - hsizer->AddSpacer(FromDIP(4)); + hsizer->Add(hsizer_ams, 1, wxLEFT | wxTOP | wxBOTTOM | wxALIGN_CENTER, FromDIP(2)); + wxBoxSizer *vsizer_extruder = new wxBoxSizer(wxVERTICAL); + vsizer_extruder->Add(hsizer_diameter, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2)); + vsizer_extruder->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2)); + hsizer->Add(vsizer_extruder, 1, wxALL | wxALIGN_CENTER, FromDIP(2)); + hsizer->AddSpacer(FromDIP(2)); // Avoid badge this->sizer = hsizer; } else { wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL); - vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(4)); - vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(4)); + vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2)); + vsizer->Add(hsizer_diameter, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2)); + vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2)); this->sizer = vsizer; } @@ -966,6 +986,9 @@ void ExtruderGroup::update_ams() for (; i < 4; ++i) { ams[i]->Close(); } if (display_capacity < 0) { up_down_btn->Show(); + static ScalableBitmap down(this, "page_down", 16); + static ScalableBitmap up(this, "page_up", 16); + up_down_btn->SetBitmap(is_upward ? up.bmp() : down.bmp()); } else { up_down_btn->Hide(); } @@ -980,16 +1003,61 @@ void ExtruderGroup::update_ams() } for (size_t i = 0; i < 4; ++i) { if (ams[i]->IsShown()) - hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(4)); + hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(2)); } if (up_down_btn->IsShown()) { - hsizer_ams->AddStretchSpacer(1); - hsizer_ams->Add(up_down_btn, 0, wxALIGN_CENTER); + if (btn_edit) + hsizer_ams->AddStretchSpacer(1); + hsizer_ams->Add(up_down_btn, 0, wxALIGN_CENTER | wxLEFT, FromDIP(2)); } sizer->Layout(); } +struct DiameterMessageDialog : MessageDialog +{ + DiameterMessageDialog(wxWindow * parent, wxString diameter_left, wxString diameter_right) + : MessageDialog(parent, _L("The software does not support using different diameter of nozzles for one print. " + "If the left and right nozzles are inconsistent, we can only proceed with single-head printing. " + "Please confirm which nozzle you would like to use for this project."), _L("Switch diameter"), wxYES_NO | wxNO_DEFAULT) + { + add_button(wxID_YES, false, wxString::Format(_L("Left nozzle: %smm"), diameter_left)); + add_button(wxID_NO, true, wxString::Format(_L("Right nozzle: %smm"), diameter_right)); + } +}; + +bool Sidebar::priv::switch_diameter(bool single) +{ + wxString diameter; + if (single) { + diameter = single_extruder->combo_diameter->GetValue(); + } else { + auto diameter_left = left_extruder->combo_diameter->GetValue(); + auto diameter_right = right_extruder->combo_diameter->GetValue(); + if (diameter_left != diameter_right) { + DiameterMessageDialog dlg(this->plater, diameter_left, diameter_right); + int result = dlg.ShowModal(); + if (result == wxID_YES) + diameter = diameter_left; + else if (result == wxID_NO) + diameter = diameter_right; + else + return false; + } + else { + diameter = diameter_left; + } + } + auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, diameter.ToStdString()); + if (preset == nullptr) { + MessageDialog dlg(this->plater, _L(""), _L("")); + dlg.ShowModal(); + return false; + } + preset->is_visible = true; // force visible + return wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); +} + void Sidebar::priv::sync_extruder_list() { MachineObject *obj = wxGetApp().getDeviceManager()->get_selected_machine(); @@ -1314,6 +1382,19 @@ Sidebar::Sidebar(Plater *parent) p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left")); p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right")); p->single_extruder = new ExtruderGroup(p->m_panel_printer_content, -1, ""); + auto switch_diameter = [this](wxCommandEvent & evt) { + auto extruder = dynamic_cast(dynamic_cast(evt.GetEventObject())->GetParent()); + auto result = p->switch_diameter(extruder == p->single_extruder); + if (result) { + extruder->combo_diameter->SetSelection(evt.GetInt()); + extruder->diameter = evt.GetString(); + } else { + extruder->combo_diameter->SetValue(extruder->diameter); + } + }; + p->left_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter); + p->right_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter); + p->single_extruder->combo_diameter->Bind(wxEVT_COMBOBOX, switch_diameter); p->vsizer_printer = new wxBoxSizer(wxVERTICAL); p->layout_printer(true, true); @@ -1878,11 +1959,27 @@ void Sidebar::update_presets(Preset::Type preset_type) } extruder.combo_nozzle->SetSelection(select); }; + auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); + auto diameter = printer_preset.config.opt_string("printer_variant"); + auto update_extruder_diameter = [&diameters, &diameter](ExtruderGroup & extruder) { + extruder.combo_diameter->Clear(); + int select = -1; + for (size_t i = 0; i < diameters.size(); ++i) { + if (diameters[i] == diameter) + select = extruder.combo_diameter->GetCount(); + extruder.combo_diameter->Append(diameters[i], {}); + } + extruder.combo_diameter->SetSelection(select); + extruder.diameter = diameter; + }; if (is_dual_extruder) { update_extruder_variant(*p->left_extruder, 0); update_extruder_variant(*p->right_extruder, 1); + update_extruder_diameter(*p->left_extruder); + update_extruder_diameter(*p->right_extruder); } else { update_extruder_variant(*p->single_extruder, 0); + update_extruder_diameter(*p->single_extruder); } Layout(); @@ -7345,6 +7442,16 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt) else physical_printers.unselect_printer(); + if (combo->is_selected_printer_model()) { + auto preset = wxGetApp().preset_bundle->get_similar_printer_preset(preset_name, {}); + if (preset == nullptr) { + MessageDialog dlg(this->sidebar, _L(""), _L("")); + dlg.ShowModal(); + } + preset->is_visible = true; // force visible + preset_name = preset->name; + } + update_objects_position_when_select_preset([this, &preset_type, &preset_name]() { wxWindowUpdateLocker noUpdates2(sidebar->filament_panel()); wxGetApp().get_tab(preset_type)->select_preset(preset_name); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index d2df49178..3b3daa71b 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -661,6 +661,13 @@ bool PresetComboBox::is_selected_physical_printer() return marker == LABEL_ITEM_PHYSICAL_PRINTER; } +bool PresetComboBox::is_selected_printer_model() +{ + auto selected_item = this->GetSelection(); + auto marker = reinterpret_cast(this->GetClientData(selected_item)); + return marker == LABEL_ITEM_PRINTER_MODELS; +} + bool PresetComboBox::selection_is_changed_according_to_physical_printers() { if (m_type != Preset::TYPE_PRINTER || !is_selected_physical_printer()) @@ -984,18 +991,6 @@ void PlaterPresetComboBox::show_edit_menu() wxGetApp().plater()->PopupMenu(menu); } -wxString PlaterPresetComboBox::get_preset_group_name(const Preset &preset) -{ - wxString group_name; - if (preset.is_system) { - wxString name = get_preset_name(preset); - if (name.size() > 12) { - group_name = name.SubString(0, name.size() - 11); - } - } - return group_name; -} - wxString PlaterPresetComboBox::get_preset_name(const Preset& preset) { return from_u8(preset.label(false)); @@ -1042,23 +1037,14 @@ void PlaterPresetComboBox::update() // and draw a red flag in front of the selected preset. bool wide_icons = selected_preset && !selected_preset->is_compatible; - struct PresetItemInfo - { - wxString name; - wxString group_name; - wxBitmap *bitmap; - - PresetItemInfo(wxString name_, wxString group_name_, wxBitmap * bitmap_): name(name_), group_name(group_name_), bitmap(bitmap_) {} - }; - - std::vector nonsys_presets; + std::map nonsys_presets; //BBS: add project embedded presets logic - std::vector project_embedded_presets; - std::vector system_presets; + std::map project_embedded_presets; + std::map system_presets; + std::unordered_set system_printer_models; std::map preset_descriptions; std::map preset_filament_vendors; std::map preset_filament_types; - //BBS: move system to the end wxString selected_system_preset; wxString selected_user_preset; @@ -1082,12 +1068,7 @@ void PlaterPresetComboBox::update() continue; bool single_bar = false; - const wxString name = get_preset_name(preset); - - wxString group_name; - if (m_type == Preset::TYPE_PRINTER) - group_name = get_preset_group_name(preset); - + wxString name = get_preset_name(preset); if (m_type == Preset::TYPE_FILAMENT) { #if 0 @@ -1110,7 +1091,16 @@ void PlaterPresetComboBox::update() if (preset.is_default || preset.is_system) { //BBS: move system to the end - system_presets.emplace_back(PresetItemInfo(name, group_name, bmp)); + if (m_type == Preset::TYPE_PRINTER) { + auto printer_model = preset.config.opt_string("printer_model"); + name = from_u8(printer_model); + if (system_printer_models.count(printer_model) == 0) { + system_presets.emplace(name, bmp); + system_printer_models.insert(printer_model); + } + } else { + system_presets.emplace(name, bmp); + } if (is_selected) { tooltip = get_tooltip(preset); selected_system_preset = name; @@ -1124,7 +1114,7 @@ void PlaterPresetComboBox::update() //BBS: add project embedded preset logic else if (preset.is_project_embedded) { - project_embedded_presets.emplace_back(PresetItemInfo(name, group_name, bmp)); + project_embedded_presets.emplace(name, bmp); if (is_selected) { selected_user_preset = name; tooltip = wxString::FromUTF8(preset.name.c_str()); @@ -1132,7 +1122,7 @@ void PlaterPresetComboBox::update() } else { - nonsys_presets.emplace_back(PresetItemInfo(name, group_name, bmp)); + nonsys_presets.emplace(name, bmp); if (is_selected) { selected_user_preset = name; //BBS set tooltip @@ -1154,40 +1144,43 @@ void PlaterPresetComboBox::update() std::vector first_vendors = {"Bambu Lab", "Generic"}; std::vector first_types = {"PLA", "PETG", "ABS", "TPU"}; auto add_presets = [this, &preset_descriptions, &filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types] - (std::vector presets, wxString const &selected, std::string const &group) { + (std::map const &presets, wxString const &selected, std::string const &group) { if (!presets.empty()) { set_label_marker(Append(separator(group), wxNullBitmap)); if (m_type == Preset::TYPE_FILAMENT) { - std::sort(presets.begin(), presets.end(), [&filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types] - (const PresetItemInfo& l, const PresetItemInfo& r) { + std::vector::value_type const*> list(presets.size(), nullptr); + std::transform(presets.begin(), presets.end(), list.begin(), [](auto & pair) { return &pair; }); + std::sort(list.begin(), list.end(), [&filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types](auto *l, auto *r) { { // Compare order - auto iter1 = std::find(filament_orders.begin(), filament_orders.end(), l.name); - auto iter2 = std::find(filament_orders.begin(), filament_orders.end(), r.name); + auto iter1 = std::find(filament_orders.begin(), filament_orders.end(), l->first); + auto iter2 = std::find(filament_orders.begin(), filament_orders.end(), r->first); if (iter1 != iter2) return iter1 < iter2; } { // Compare vendor - auto iter1 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[l.name]); - auto iter2 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[r.name]); + auto iter1 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[l->first]); + auto iter2 = std::find(first_vendors.begin(), first_vendors.end(), preset_filament_vendors[r->first]); if (iter1 != iter2) return iter1 < iter2; } { // Compare type - auto iter1 = std::find(first_types.begin(), first_types.end(), preset_filament_types[l.name]); - auto iter2 = std::find(first_types.begin(), first_types.end(), preset_filament_types[r.name]); + auto iter1 = std::find(first_types.begin(), first_types.end(), preset_filament_types[l->first]); + auto iter2 = std::find(first_types.begin(), first_types.end(), preset_filament_types[r->first]); if (iter1 != iter2) return iter1 < iter2; } - return l.name < r.name; + return l->first < r->first; }); - for (auto it = presets.begin(); it != presets.end(); ++it) { - SetItemTooltip(Append(it->name, *it->bitmap), preset_descriptions[it->name]); - validate_selection(it->name == selected); + for (auto it : list) { + SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]); + validate_selection(it->first == selected); } } else { - for (auto it = presets.begin(); it != presets.end(); ++it) { - SetItemTooltip(Append(it->name, *it->bitmap, it->group_name), preset_descriptions[it->name]); - validate_selection(it->name == selected); + for (std::map::const_iterator it = presets.begin(); it != presets.end(); ++it) { + SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]); + if (group == "System presets") + set_label_marker(GetCount() - 1, LABEL_ITEM_PRINTER_MODELS); + validate_selection(it->first == selected); } } } diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index 94d1400f4..552cb91d5 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -40,6 +40,7 @@ public: enum LabelItemType { LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01, + LABEL_ITEM_PRINTER_MODELS, LABEL_ITEM_DISABLED, LABEL_ITEM_MARKER, LABEL_ITEM_PHYSICAL_PRINTERS, @@ -58,6 +59,8 @@ public: bool is_selected_physical_printer(); + bool is_selected_printer_model(); + // Return true, if physical printer was selected // and next internal selection was accomplished bool selection_is_changed_according_to_physical_printers(); @@ -187,7 +190,6 @@ public: void show_add_menu(); void show_edit_menu(); - wxString get_preset_group_name(const Preset &preset); wxString get_preset_name(const Preset& preset) override; void update() override; void msw_rescale() override;