mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-17 02:22:17 +00:00
ENH: printer nozzle diameter select
Change-Id: Ibf8b74e1f93a7c387db3f0fb5e6e733165322322 Jira: STUDIO-9140 (cherry picked from commit c990314567383d3bfff72ac11df6471e0a10f315)
This commit is contained in:
@@ -361,6 +361,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_flow = nullptr;
|
||||
AMSPreview * ams[4] = {nullptr};
|
||||
wxStaticText *ams_not_installed_msg{nullptr};
|
||||
@@ -373,6 +374,7 @@ struct ExtruderGroup : StaticGroup
|
||||
size_t ams_n1 = 0;
|
||||
std::vector<AMSinfo> ams_4;
|
||||
std::vector<AMSinfo> ams_1;
|
||||
wxString diameter;
|
||||
|
||||
void set_ams_count(int n4, int n1)
|
||||
{
|
||||
@@ -395,6 +397,7 @@ struct ExtruderGroup : StaticGroup
|
||||
btn_edit->msw_rescale();
|
||||
btn_up->msw_rescale();
|
||||
btn_down->msw_rescale();
|
||||
combo_diameter->Rescale();
|
||||
combo_flow->Rescale();
|
||||
for (int i = 0; i < 4; ++i)
|
||||
ams[i]->msw_rescale();
|
||||
@@ -496,6 +499,7 @@ struct Sidebar::priv
|
||||
void can_search();
|
||||
|
||||
bool sync_extruder_list(bool &only_external_material);
|
||||
bool switch_diameter(bool single);
|
||||
void update_sync_status(const MachineObject* obj);
|
||||
|
||||
#ifdef _WIN32
|
||||
@@ -956,6 +960,12 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
|
||||
SetBorderColor(wxColour(0xEEEEEE));
|
||||
ShowBadge(true);
|
||||
// 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"));
|
||||
label_flow->SetFont(Label::Body_14);
|
||||
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"));
|
||||
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);
|
||||
@@ -988,7 +999,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_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_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();
|
||||
});
|
||||
|
||||
|
||||
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_flow, 2, wxALIGN_CENTER);
|
||||
hsizer_nozzle->Add(combo_flow, 3, wxEXPAND);
|
||||
hsizer_nozzle->Add(label_flow, 0, wxALIGN_CENTER);
|
||||
hsizer_nozzle->Add(combo_flow, 1, wxEXPAND);
|
||||
if (index < 0) {
|
||||
label_ams->Hide();
|
||||
ams_not_installed_msg->Hide();
|
||||
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->AddSpacer(FromDIP(4));
|
||||
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;
|
||||
}
|
||||
AMSCountPopupWindow::UpdateAMSCount(index < 0 ? 0 : index, this);
|
||||
@@ -1099,7 +1114,8 @@ void ExtruderGroup::update_ams()
|
||||
hsizer_ams->Add(this->ams[i], 0, wxLEFT, FromDIP(1));
|
||||
}
|
||||
if (btn_up->IsShown() || btn_down->IsShown()) {
|
||||
hsizer_ams->AddStretchSpacer(1);
|
||||
if (btn_edit)
|
||||
hsizer_ams->AddStretchSpacer(1);
|
||||
if (btn_up->IsShown() && btn_down->IsShown()) {
|
||||
auto vsizer_btn = new wxBoxSizer(wxVERTICAL);
|
||||
auto size = btn_up->GetSize();
|
||||
@@ -1137,6 +1153,50 @@ void ExtruderGroup::sync_ams(MachineObject const *obj, std::vector<Ams *> const
|
||||
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)
|
||||
{
|
||||
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->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"));
|
||||
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);
|
||||
@@ -2238,13 +2311,29 @@ void Sidebar::update_presets(Preset::Type preset_type)
|
||||
|
||||
bool is_dual_extruder = nozzle_diameter->size() == 2;
|
||||
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();
|
||||
if (is_dual_extruder) {
|
||||
AMSCountPopupWindow::UpdateAMSCount(0, p->left_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));
|
||||
} else {
|
||||
AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder);
|
||||
update_extruder_diameter(*p->single_extruder);
|
||||
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
|
||||
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;
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user