ENH: printer nozzle diameter select

Change-Id: Ibf8b74e1f93a7c387db3f0fb5e6e733165322322
Jira: STUDIO-9140
This commit is contained in:
chunmao.guo 2024-12-18 19:28:14 +08:00 committed by lane.wei
parent 27c99677ed
commit c990314567
9 changed files with 205 additions and 65 deletions

View File

@ -0,0 +1,3 @@
<svg width="17" height="17" viewBox="0 0 17 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.48881 14.3817C7.05222 14.3817 5.67447 13.811 4.65865 12.7952C3.64283 11.7793 3.07214 10.4016 3.07214 8.96501C3.07214 7.52842 3.64283 6.15067 4.65865 5.13484C5.67447 4.11902 7.05222 3.54834 8.48881 3.54834C9.9254 3.54834 11.3032 4.11902 12.319 5.13484C13.3348 6.15067 13.9055 7.52842 13.9055 8.96501C13.9055 10.4016 13.3348 11.7793 12.319 12.7952C11.3032 13.811 9.9254 14.3817 8.48881 14.3817ZM8.48881 2.29834C6.7207 2.29834 5.02501 3.00072 3.77477 4.25096C2.52452 5.5012 1.82214 7.1969 1.82214 8.96501C1.82214 10.7331 2.52452 12.4288 3.77477 13.6791C5.02501 14.9293 6.7207 15.6317 8.48881 15.6317C10.2569 15.6317 11.9526 14.9293 13.2029 13.6791C14.4531 12.4288 15.1555 10.7331 15.1555 8.96501C15.1555 7.1969 14.4531 5.5012 13.2029 4.25096C11.9526 3.00072 10.2569 2.29834 8.48881 2.29834ZM5.33777 8.57438L8.0461 11.2827C8.29089 11.5275 8.68673 11.5275 8.92891 11.2827L11.6399 8.57438C11.8846 8.32959 11.8846 7.93376 11.6399 7.69157C11.3951 7.44938 10.9992 7.44678 10.757 7.69157L8.49141 9.95719L6.22579 7.69157C5.981 7.44678 5.58516 7.44678 5.34298 7.69157C5.10079 7.93636 5.09819 8.33219 5.34298 8.57438H5.33777Z" fill="#6B6B6B"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg width="16" height="17" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.00016 3.2666C9.43675 3.2666 10.8145 3.83728 11.8303 4.85311C12.8461 5.86893 13.4168 7.24668 13.4168 8.68327C13.4168 10.1199 12.8461 11.4976 11.8303 12.5134C10.8145 13.5293 9.43675 14.0999 8.00016 14.0999C6.56357 14.0999 5.18582 13.5293 4.17 12.5134C3.15418 11.4976 2.5835 10.1199 2.5835 8.68327C2.5835 7.24668 3.15418 5.86893 4.17 4.85311C5.18582 3.83728 6.56357 3.2666 8.00016 3.2666ZM8.00016 15.3499C9.76827 15.3499 11.464 14.6476 12.7142 13.3973C13.9645 12.1471 14.6668 10.4514 14.6668 8.68327C14.6668 6.91516 13.9645 5.21947 12.7142 3.96922C11.464 2.71898 9.76827 2.0166 8.00016 2.0166C6.23205 2.0166 4.53636 2.71898 3.28612 3.96922C2.03588 5.21947 1.3335 6.91516 1.3335 8.68327C1.3335 10.4514 2.03588 12.1471 3.28612 13.3973C4.53636 14.6476 6.23205 15.3499 8.00016 15.3499ZM11.1512 9.07389L8.44287 6.36556C8.19808 6.12077 7.80225 6.12077 7.56006 6.36556L4.84912 9.07389C4.60433 9.31869 4.60433 9.71452 4.84912 9.95671C5.09391 10.1989 5.48975 10.2015 5.73193 9.95671L7.99756 7.69108L10.2632 9.95671C10.508 10.2015 10.9038 10.2015 11.146 9.95671C11.3882 9.71191 11.3908 9.31608 11.146 9.07389H11.1512Z" fill="#6B6B6B"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -2677,6 +2677,17 @@ size_t PresetCollection::first_visible_idx() const
return first_visible;
}
std::vector<std::string> PresetCollection::diameters_of_selected_printer()
{
std::set<std::string> 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<std::string>{diameters.begin(), diameters.end()};
}
void PresetCollection::set_default_suppressed(bool default_suppressed)
{
if (m_default_suppressed != default_suppressed) {

View File

@ -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<std::string> 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()); }

View File

@ -1922,7 +1922,7 @@ std::vector<std::vector<DynamicPrintConfig>> PresetBundle::get_extruder_filament
return filament_infos;
}
std::set<std::string> PresetBundle::get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str)
std::set<std::string> 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<std::string> printer_names;
@ -1937,7 +1937,7 @@ std::set<std::string> 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<ConfigOptionString *>(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)
{

View File

@ -107,7 +107,7 @@ public:
std::vector<std::vector<DynamicPrintConfig>> get_extruder_filament_info() const;
std::set<std::string> get_printer_names_by_printer_type_and_nozzle(const std::string &printer_type, std::string nozzle_diameter_str);
std::set<std::string> 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;

View File

@ -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<wxWindow *>();
for (wxWindow *w : std::initializer_list<wxWindow *>{this, label_nozzle, combo_nozzle, btn_edit, label_ams}) {
for (wxWindow *w : std::initializer_list<wxWindow *>{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<ExtruderGroup *>(dynamic_cast<ComboBox *>(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);

View File

@ -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<Marker>(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<PresetItemInfo> nonsys_presets;
std::map<wxString, wxBitmap*> nonsys_presets;
//BBS: add project embedded presets logic
std::vector<PresetItemInfo> project_embedded_presets;
std::vector<PresetItemInfo> system_presets;
std::map<wxString, wxBitmap*> project_embedded_presets;
std::map<wxString, wxBitmap *> system_presets;
std::unordered_set<std::string> system_printer_models;
std::map<wxString, wxString> preset_descriptions;
std::map<wxString, std::string> preset_filament_vendors;
std::map<wxString, std::string> 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<std::string> first_vendors = {"Bambu Lab", "Generic"};
std::vector<std::string> 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<PresetItemInfo> presets, wxString const &selected, std::string const &group) {
(std::map<wxString, wxBitmap *> 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<std::map<wxString, wxBitmap *>::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<wxString, wxBitmap *>::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);
}
}
}

View File

@ -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;