ENH: printer nozzle diameter select
Change-Id: Ibf8b74e1f93a7c387db3f0fb5e6e733165322322 Jira: STUDIO-9140
This commit is contained in:
parent
27c99677ed
commit
c990314567
|
@ -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 |
|
@ -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 |
|
@ -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) {
|
||||
|
|
|
@ -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()); }
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue