mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-22 04:35:17 +00:00
ENH: printer nozzle diameter select
Change-Id: Ibf8b74e1f93a7c387db3f0fb5e6e733165322322 Jira: STUDIO-9140 (cherry picked from commit c990314567383d3bfff72ac11df6471e0a10f315)
This commit is contained in:
@@ -2617,6 +2617,17 @@ size_t PresetCollection::first_visible_idx() const
|
|||||||
return first_visible;
|
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)
|
void PresetCollection::set_default_suppressed(bool default_suppressed)
|
||||||
{
|
{
|
||||||
if (m_default_suppressed != default_suppressed) {
|
if (m_default_suppressed != default_suppressed) {
|
||||||
|
|||||||
@@ -649,6 +649,8 @@ public:
|
|||||||
// Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible.
|
// 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; }); }
|
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 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.
|
// Return the first visible preset. Certainly at least the '- default -' preset shall be visible.
|
||||||
Preset& first_visible() { return this->preset(this->first_visible_idx()); }
|
Preset& first_visible() { return this->preset(this->first_visible_idx()); }
|
||||||
|
|||||||
@@ -2336,7 +2336,7 @@ std::vector<std::vector<DynamicPrintConfig>> PresetBundle::get_extruder_filament
|
|||||||
return filament_infos;
|
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)
|
||||||
{
|
{
|
||||||
std::set<std::string> printer_names;
|
std::set<std::string> printer_names;
|
||||||
if ("0.0" == nozzle_diameter_str || nozzle_diameter_str.empty()) {
|
if ("0.0" == nozzle_diameter_str || nozzle_diameter_str.empty()) {
|
||||||
@@ -2345,7 +2345,7 @@ std::set<std::string> PresetBundle::get_printer_names_by_printer_type_and_nozzle
|
|||||||
std::ostringstream stream;
|
std::ostringstream stream;
|
||||||
|
|
||||||
for (auto printer_it = this->printers.begin(); printer_it != this->printers.end(); printer_it++) {
|
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");
|
ConfigOption * printer_model_opt = printer_it->config.option("printer_model");
|
||||||
ConfigOptionString *printer_model_str = dynamic_cast<ConfigOptionString *>(printer_model_opt);
|
ConfigOptionString *printer_model_str = dynamic_cast<ConfigOptionString *>(printer_model_opt);
|
||||||
@@ -2427,6 +2427,24 @@ bool PresetBundle::check_filament_temp_equation_by_printer_type_and_nozzle_for_m
|
|||||||
return is_equation;
|
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
|
//BBS: check whether this is the only edited filament
|
||||||
bool PresetBundle::is_the_only_edited_filament(unsigned int filament_index)
|
bool PresetBundle::is_the_only_edited_filament(unsigned int filament_index)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ public:
|
|||||||
|
|
||||||
std::vector<std::vector<DynamicPrintConfig>> get_extruder_filament_info() const;
|
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,
|
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 & nozzle_diameter_str,
|
||||||
std::string & setting_id,
|
std::string & setting_id,
|
||||||
@@ -187,6 +187,7 @@ public:
|
|||||||
std::string & nozzle_temp_min,
|
std::string & nozzle_temp_min,
|
||||||
std::string & nozzle_temp_max,
|
std::string & nozzle_temp_max,
|
||||||
std::string & preset_setting_id);
|
std::string & preset_setting_id);
|
||||||
|
Preset * get_similar_printer_preset(std::string printer_model, std::string printer_variant);
|
||||||
|
|
||||||
PresetCollection prints;
|
PresetCollection prints;
|
||||||
PresetCollection sla_prints;
|
PresetCollection sla_prints;
|
||||||
|
|||||||
@@ -361,6 +361,7 @@ struct ExtruderGroup : StaticGroup
|
|||||||
ExtruderGroup(wxWindow * parent, int index, wxString const &title);
|
ExtruderGroup(wxWindow * parent, int index, wxString const &title);
|
||||||
wxStaticBoxSizer *sizer = nullptr;
|
wxStaticBoxSizer *sizer = nullptr;
|
||||||
ScalableButton * btn_edit = nullptr;
|
ScalableButton * btn_edit = nullptr;
|
||||||
|
ComboBox * combo_diameter = nullptr;
|
||||||
ComboBox * combo_flow = nullptr;
|
ComboBox * combo_flow = nullptr;
|
||||||
AMSPreview * ams[4] = {nullptr};
|
AMSPreview * ams[4] = {nullptr};
|
||||||
wxStaticText *ams_not_installed_msg{nullptr};
|
wxStaticText *ams_not_installed_msg{nullptr};
|
||||||
@@ -373,6 +374,7 @@ struct ExtruderGroup : StaticGroup
|
|||||||
size_t ams_n1 = 0;
|
size_t ams_n1 = 0;
|
||||||
std::vector<AMSinfo> ams_4;
|
std::vector<AMSinfo> ams_4;
|
||||||
std::vector<AMSinfo> ams_1;
|
std::vector<AMSinfo> ams_1;
|
||||||
|
wxString diameter;
|
||||||
|
|
||||||
void set_ams_count(int n4, int n1)
|
void set_ams_count(int n4, int n1)
|
||||||
{
|
{
|
||||||
@@ -395,6 +397,7 @@ struct ExtruderGroup : StaticGroup
|
|||||||
btn_edit->msw_rescale();
|
btn_edit->msw_rescale();
|
||||||
btn_up->msw_rescale();
|
btn_up->msw_rescale();
|
||||||
btn_down->msw_rescale();
|
btn_down->msw_rescale();
|
||||||
|
combo_diameter->Rescale();
|
||||||
combo_flow->Rescale();
|
combo_flow->Rescale();
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
ams[i]->msw_rescale();
|
ams[i]->msw_rescale();
|
||||||
@@ -496,6 +499,7 @@ struct Sidebar::priv
|
|||||||
void can_search();
|
void can_search();
|
||||||
|
|
||||||
bool sync_extruder_list(bool &only_external_material);
|
bool sync_extruder_list(bool &only_external_material);
|
||||||
|
bool switch_diameter(bool single);
|
||||||
void update_sync_status(const MachineObject* obj);
|
void update_sync_status(const MachineObject* obj);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -956,6 +960,12 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
|
|||||||
SetBorderColor(wxColour(0xEEEEEE));
|
SetBorderColor(wxColour(0xEEEEEE));
|
||||||
ShowBadge(true);
|
ShowBadge(true);
|
||||||
// Nozzle
|
// Nozzle
|
||||||
|
wxStaticText *label_diameter = new wxStaticText(this, wxID_ANY, _L("Diameter"));
|
||||||
|
label_diameter->SetFont(Label::Body_14);
|
||||||
|
label_diameter->SetForegroundColour("#262E30");
|
||||||
|
if (index >= 0) 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_flow = new wxStaticText(this, wxID_ANY, _L("Flow"));
|
wxStaticText *label_flow = new wxStaticText(this, wxID_ANY, _L("Flow"));
|
||||||
label_flow->SetFont(Label::Body_14);
|
label_flow->SetFont(Label::Body_14);
|
||||||
label_flow->SetForegroundColour("#262E30");
|
label_flow->SetForegroundColour("#262E30");
|
||||||
@@ -974,6 +984,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
|
|||||||
wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS"));
|
wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS"));
|
||||||
label_ams->SetFont(Label::Body_14);
|
label_ams->SetFont(Label::Body_14);
|
||||||
label_ams->SetForegroundColour("#262E30");
|
label_ams->SetForegroundColour("#262E30");
|
||||||
|
//label_ams->SetMinSize({FromDIP(70), -1});
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
btn_edit = new ScalableButton(this, wxID_ANY, "dot");
|
btn_edit = new ScalableButton(this, wxID_ANY, "dot");
|
||||||
btn_edit->SetBackgroundColour(*wxWHITE);
|
btn_edit->SetBackgroundColour(*wxWHITE);
|
||||||
@@ -988,7 +999,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
|
|||||||
});
|
});
|
||||||
|
|
||||||
auto hovered = std::make_shared<wxWindow *>();
|
auto hovered = std::make_shared<wxWindow *>();
|
||||||
for (wxWindow *w : std::initializer_list<wxWindow *>{this, label_flow, combo_flow, btn_edit, label_ams}) {
|
for (wxWindow *w : std::initializer_list<wxWindow *>{this, label_diameter, combo_diameter, label_flow, combo_flow, btn_edit, label_ams}) {
|
||||||
w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, this](wxMouseEvent &evt) { *hovered = w; btn_edit->SetBitmap_("edit"); });
|
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; } });
|
w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, this](wxMouseEvent &evt) { if (*hovered == w) { btn_edit->SetBitmap_("dot"); *hovered = nullptr; } });
|
||||||
}
|
}
|
||||||
@@ -1027,21 +1038,25 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
|
|||||||
update_ams();
|
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);
|
wxBoxSizer * hsizer_nozzle = new wxBoxSizer(wxHORIZONTAL);
|
||||||
hsizer_nozzle->Add(label_flow, 2, wxALIGN_CENTER);
|
hsizer_nozzle->Add(label_flow, 0, wxALIGN_CENTER);
|
||||||
hsizer_nozzle->Add(combo_flow, 3, wxEXPAND);
|
hsizer_nozzle->Add(combo_flow, 1, wxEXPAND);
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
label_ams->Hide();
|
label_ams->Hide();
|
||||||
ams_not_installed_msg->Hide();
|
ams_not_installed_msg->Hide();
|
||||||
wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL);
|
wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL);
|
||||||
|
hsizer->Add(hsizer_diameter, 1, wxEXPAND | wxTOP| wxBOTTOM, FromDIP(8));
|
||||||
hsizer->Add(hsizer_nozzle, 1, wxEXPAND | wxALL, FromDIP(8));
|
hsizer->Add(hsizer_nozzle, 1, wxEXPAND | wxALL, FromDIP(8));
|
||||||
hsizer->AddSpacer(FromDIP(4));
|
hsizer->AddSpacer(FromDIP(2)); // Avoid badge
|
||||||
this->sizer = hsizer;
|
this->sizer = hsizer;
|
||||||
} else {
|
} else {
|
||||||
wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL);
|
wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL);
|
||||||
vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(4));
|
vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2));
|
||||||
vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(4));
|
vsizer->Add(hsizer_diameter, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(2));
|
||||||
|
vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(2));
|
||||||
this->sizer = vsizer;
|
this->sizer = vsizer;
|
||||||
}
|
}
|
||||||
AMSCountPopupWindow::UpdateAMSCount(index < 0 ? 0 : index, this);
|
AMSCountPopupWindow::UpdateAMSCount(index < 0 ? 0 : index, this);
|
||||||
@@ -1099,6 +1114,7 @@ void ExtruderGroup::update_ams()
|
|||||||
hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(1));
|
hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(1));
|
||||||
}
|
}
|
||||||
if (btn_up->IsShown() || btn_down->IsShown()) {
|
if (btn_up->IsShown() || btn_down->IsShown()) {
|
||||||
|
if (btn_edit)
|
||||||
hsizer_ams->AddStretchSpacer(1);
|
hsizer_ams->AddStretchSpacer(1);
|
||||||
if (btn_up->IsShown() && btn_down->IsShown()) {
|
if (btn_up->IsShown() && btn_down->IsShown()) {
|
||||||
auto vsizer_btn = new wxBoxSizer(wxVERTICAL);
|
auto vsizer_btn = new wxBoxSizer(wxVERTICAL);
|
||||||
@@ -1137,6 +1153,50 @@ void ExtruderGroup::sync_ams(MachineObject const *obj, std::vector<Ams *> const
|
|||||||
update_ams();
|
update_ams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
bool Sidebar::priv::sync_extruder_list(bool &only_external_material)
|
bool Sidebar::priv::sync_extruder_list(bool &only_external_material)
|
||||||
{
|
{
|
||||||
auto printer_tab = dynamic_cast<TabPrinter *>(wxGetApp().get_tab(Preset::TYPE_PRINTER));
|
auto printer_tab = dynamic_cast<TabPrinter *>(wxGetApp().get_tab(Preset::TYPE_PRINTER));
|
||||||
@@ -1652,6 +1712,19 @@ Sidebar::Sidebar(Plater *parent)
|
|||||||
p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left Nozzle"));
|
p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left Nozzle"));
|
||||||
p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right Nozzle"));
|
p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right Nozzle"));
|
||||||
p->single_extruder = new ExtruderGroup(p->m_panel_printer_content, -1, _L("Nozzle"));
|
p->single_extruder = new ExtruderGroup(p->m_panel_printer_content, -1, _L("Nozzle"));
|
||||||
|
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->vsizer_printer = new wxBoxSizer(wxVERTICAL);
|
||||||
p->layout_printer(true, true);
|
p->layout_printer(true, true);
|
||||||
@@ -2238,13 +2311,29 @@ void Sidebar::update_presets(Preset::Type preset_type)
|
|||||||
|
|
||||||
bool is_dual_extruder = nozzle_diameter->size() == 2;
|
bool is_dual_extruder = nozzle_diameter->size() == 2;
|
||||||
p->layout_printer(isBBL, is_dual_extruder);
|
p->layout_printer(isBBL, is_dual_extruder);
|
||||||
|
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;
|
||||||
|
};
|
||||||
auto image_path = get_cur_select_bed_image();
|
auto image_path = get_cur_select_bed_image();
|
||||||
if (is_dual_extruder) {
|
if (is_dual_extruder) {
|
||||||
AMSCountPopupWindow::UpdateAMSCount(0, p->left_extruder);
|
AMSCountPopupWindow::UpdateAMSCount(0, p->left_extruder);
|
||||||
AMSCountPopupWindow::UpdateAMSCount(1, p->right_extruder);
|
AMSCountPopupWindow::UpdateAMSCount(1, p->right_extruder);
|
||||||
|
update_extruder_diameter(*p->left_extruder);
|
||||||
|
update_extruder_diameter(*p->right_extruder);
|
||||||
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 48));
|
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 48));
|
||||||
} else {
|
} else {
|
||||||
AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder);
|
AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder);
|
||||||
|
update_extruder_diameter(*p->single_extruder);
|
||||||
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 32));
|
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8215,6 +8304,16 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
|
|||||||
else
|
else
|
||||||
physical_printers.unselect_printer();
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
std::string old_preset_name = wxGetApp().preset_bundle->printers.get_edited_preset().name;
|
std::string old_preset_name = wxGetApp().preset_bundle->printers.get_edited_preset().name;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -718,6 +718,13 @@ bool PresetComboBox::is_selected_physical_printer()
|
|||||||
return marker == LABEL_ITEM_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()
|
bool PresetComboBox::selection_is_changed_according_to_physical_printers()
|
||||||
{
|
{
|
||||||
if (m_type != Preset::TYPE_PRINTER || !is_selected_physical_printer())
|
if (m_type != Preset::TYPE_PRINTER || !is_selected_physical_printer())
|
||||||
@@ -1049,18 +1056,6 @@ void PlaterPresetComboBox::show_edit_menu()
|
|||||||
wxGetApp().plater()->PopupMenu(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)
|
wxString PlaterPresetComboBox::get_preset_name(const Preset& preset)
|
||||||
{
|
{
|
||||||
return from_u8(preset.label(false));
|
return from_u8(preset.label(false));
|
||||||
@@ -1113,21 +1108,12 @@ void PlaterPresetComboBox::update()
|
|||||||
// and draw a red flag in front of the selected preset.
|
// and draw a red flag in front of the selected preset.
|
||||||
bool wide_icons = selected_preset && !selected_preset->is_compatible;
|
bool wide_icons = selected_preset && !selected_preset->is_compatible;
|
||||||
|
|
||||||
struct PresetItemInfo
|
std::map<wxString, wxBitmap*> nonsys_presets;
|
||||||
{
|
|
||||||
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;
|
|
||||||
//BBS: add project embedded presets logic
|
//BBS: add project embedded presets logic
|
||||||
std::vector<PresetItemInfo> project_embedded_presets;
|
std::map<wxString, wxBitmap*> project_embedded_presets;
|
||||||
std::vector<PresetItemInfo> system_presets;
|
std::map<wxString, wxBitmap *> system_presets;
|
||||||
|
std::unordered_set<std::string> system_printer_models;
|
||||||
std::map<wxString, wxString> preset_descriptions;
|
std::map<wxString, wxString> preset_descriptions;
|
||||||
|
|
||||||
//BBS: move system to the end
|
//BBS: move system to the end
|
||||||
wxString selected_system_preset;
|
wxString selected_system_preset;
|
||||||
wxString selected_user_preset;
|
wxString selected_user_preset;
|
||||||
@@ -1158,11 +1144,7 @@ void PlaterPresetComboBox::update()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool single_bar = false;
|
bool single_bar = false;
|
||||||
|
wxString name = get_preset_name(preset);
|
||||||
wxString group_name;
|
|
||||||
if (m_type == Preset::TYPE_PRINTER)
|
|
||||||
group_name = get_preset_group_name(preset);
|
|
||||||
|
|
||||||
if (m_type == Preset::TYPE_FILAMENT)
|
if (m_type == Preset::TYPE_FILAMENT)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@@ -1179,12 +1161,20 @@ void PlaterPresetComboBox::update()
|
|||||||
wxBitmap* bmp = get_bmp(preset);
|
wxBitmap* bmp = get_bmp(preset);
|
||||||
assert(bmp);
|
assert(bmp);
|
||||||
|
|
||||||
const wxString name = get_preset_name(preset);
|
|
||||||
preset_descriptions.emplace(name, from_u8(preset.description));
|
preset_descriptions.emplace(name, from_u8(preset.description));
|
||||||
|
|
||||||
if (preset.is_default || preset.is_system) {
|
if (preset.is_default || preset.is_system) {
|
||||||
//BBS: move system to the end
|
//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) {
|
if (is_selected) {
|
||||||
tooltip = get_tooltip(preset);
|
tooltip = get_tooltip(preset);
|
||||||
selected_system_preset = name;
|
selected_system_preset = name;
|
||||||
@@ -1198,7 +1188,7 @@ void PlaterPresetComboBox::update()
|
|||||||
//BBS: add project embedded preset logic
|
//BBS: add project embedded preset logic
|
||||||
else if (preset.is_project_embedded)
|
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) {
|
if (is_selected) {
|
||||||
selected_user_preset = name;
|
selected_user_preset = name;
|
||||||
tooltip = wxString::FromUTF8(preset.name.c_str());
|
tooltip = wxString::FromUTF8(preset.name.c_str());
|
||||||
@@ -1206,7 +1196,7 @@ void PlaterPresetComboBox::update()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nonsys_presets.emplace_back(PresetItemInfo(name, group_name, bmp));
|
nonsys_presets.emplace(name, bmp);
|
||||||
if (is_selected) {
|
if (is_selected) {
|
||||||
selected_user_preset = name;
|
selected_user_preset = name;
|
||||||
//BBS set tooltip
|
//BBS set tooltip
|
||||||
@@ -1226,12 +1216,12 @@ void PlaterPresetComboBox::update()
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto add_presets = [this, &preset_descriptions, &selected_in_ams]
|
auto add_presets = [this, &preset_descriptions, &selected_in_ams]
|
||||||
(std::vector<PresetItemInfo> const &presets, wxString const &selected, std::string const &group) {
|
(std::map<wxString, wxBitmap *> const &presets, wxString const &selected, std::string const &group) {
|
||||||
if (!presets.empty()) {
|
if (!presets.empty()) {
|
||||||
set_label_marker(Append(separator(group), wxNullBitmap));
|
set_label_marker(Append(separator(group), wxNullBitmap));
|
||||||
for (auto it = presets.begin(); it != presets.end(); ++it) {
|
for (std::map<wxString, wxBitmap *>::const_iterator it = presets.begin(); it != presets.end(); ++it) {
|
||||||
SetItemTooltip(Append(it->name, *it->bitmap), preset_descriptions[it->name]);
|
SetItemTooltip(Append(it->first, *it->second), preset_descriptions[it->first]);
|
||||||
bool is_selected = it->name == selected;
|
bool is_selected = it->first == selected;
|
||||||
validate_selection(is_selected);
|
validate_selection(is_selected);
|
||||||
if (is_selected && selected_in_ams) {
|
if (is_selected && selected_in_ams) {
|
||||||
SetFlag(GetCount() - 1, (int) FilamentAMSType::FROM_AMS);
|
SetFlag(GetCount() - 1, (int) FilamentAMSType::FROM_AMS);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public:
|
|||||||
|
|
||||||
enum LabelItemType {
|
enum LabelItemType {
|
||||||
LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01,
|
LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01,
|
||||||
|
LABEL_ITEM_PRINTER_MODELS,
|
||||||
LABEL_ITEM_DISABLED,
|
LABEL_ITEM_DISABLED,
|
||||||
LABEL_ITEM_MARKER,
|
LABEL_ITEM_MARKER,
|
||||||
LABEL_ITEM_PHYSICAL_PRINTERS,
|
LABEL_ITEM_PHYSICAL_PRINTERS,
|
||||||
@@ -63,6 +64,8 @@ public:
|
|||||||
|
|
||||||
bool is_selected_physical_printer();
|
bool is_selected_physical_printer();
|
||||||
|
|
||||||
|
bool is_selected_printer_model();
|
||||||
|
|
||||||
// Return true, if physical printer was selected
|
// Return true, if physical printer was selected
|
||||||
// and next internal selection was accomplished
|
// and next internal selection was accomplished
|
||||||
bool selection_is_changed_according_to_physical_printers();
|
bool selection_is_changed_according_to_physical_printers();
|
||||||
@@ -197,7 +200,6 @@ public:
|
|||||||
void show_add_menu();
|
void show_add_menu();
|
||||||
void show_edit_menu();
|
void show_edit_menu();
|
||||||
|
|
||||||
wxString get_preset_group_name(const Preset &preset);
|
|
||||||
wxString get_preset_name(const Preset& preset) override;
|
wxString get_preset_name(const Preset& preset) override;
|
||||||
void update() override;
|
void update() override;
|
||||||
void msw_rescale() override;
|
void msw_rescale() override;
|
||||||
|
|||||||
Reference in New Issue
Block a user