diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index 7a3cd2801..dae8a4bc3 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -418,6 +418,7 @@ void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia) get_tray_ams_and_slot_id(result.tray_id, ams_id, slot_id, tray_id); result.extruder_id = preset_page->get_extruder_id(ams_id); result.nozzle_volume_type = preset_page->get_nozzle_volume_type(result.extruder_id); + result.nozzle_diameter = preset_page->get_nozzle_diameter(result.extruder_id); } else { result.extruder_id = 0; @@ -697,7 +698,6 @@ void PressureAdvanceWizard::on_cali_start() //clean PA result curr_obj->reset_pa_cali_result(); - float nozzle_dia = -1; std::string setting_id; BedType plate_type = BedType::btDefault; @@ -710,11 +710,11 @@ void PressureAdvanceWizard::on_cali_start() return; } + float nozzle_dia = -1; preset_page->get_preset_info(nozzle_dia, plate_type); CalibrationWizard::cache_preset_info(curr_obj, nozzle_dia); - - if (nozzle_dia < 0 || plate_type == BedType::btDefault) { + if (/*nozzle_dia < 0 || */ plate_type == BedType::btDefault) { BOOST_LOG_TRIVIAL(error) << "CaliPreset: get preset info, nozzle and plate type error"; return; } @@ -738,7 +738,7 @@ void PressureAdvanceWizard::on_cali_start() calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); - calib_info.nozzle_diameter = nozzle_dia; + calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); calib_info.filament_id = item.second->filament_id; calib_info.setting_id = item.second->setting_id; calib_info.bed_temp = bed_temp; @@ -783,7 +783,7 @@ void PressureAdvanceWizard::on_cali_start() calib_info.bed_type = plate_type; calib_info.process_bar = preset_page->get_sending_progress_bar(); - calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia); + calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, preset_page->get_nozzle_diameter(calib_info.extruder_id)); calib_info.print_prest = preset_page->get_print_preset(); calib_info.filament_prest = temp_filament_preset; @@ -1189,7 +1189,7 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id); calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id); calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id); - calib_info.nozzle_diameter = nozzle_dia; + calib_info.nozzle_diameter = preset_page->get_nozzle_diameter(calib_info.extruder_id); calib_info.filament_id = item.second->filament_id; calib_info.setting_id = item.second->setting_id; calib_info.bed_temp = bed_temp; @@ -1248,7 +1248,7 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow temp_filament_preset->config = preset->config; calib_info.bed_type = plate_type; - calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia); + calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, preset_page->get_nozzle_diameter(calib_info.extruder_id)); calib_info.print_prest = preset_page->get_print_preset(); calib_info.params.mode = CalibMode::Calib_Flow_Rate; @@ -1657,7 +1657,7 @@ void MaxVolumetricSpeedWizard::on_cali_start() calib_info.bed_type = plate_type; calib_info.process_bar = preset_page->get_sending_progress_bar(); - calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, nozzle_dia); + calib_info.printer_prest = preset_page->get_printer_preset(curr_obj, preset_page->get_nozzle_diameter(calib_info.extruder_id)); calib_info.print_prest = preset_page->get_print_preset(); wxString wx_err_string; diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 113f7cf07..dd9eef7e5 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -5,6 +5,12 @@ #include "MsgDialog.hpp" #include "libslic3r/Print.hpp" +#define CALIBRATION_LABEL_SIZE wxSize(FromDIP(150), FromDIP(24)) +#define SYNC_BUTTON_SIZE (wxSize(FromDIP(50), FromDIP(50))) + +#define LEFT_EXTRUDER_ID 1 +#define RIGHT_EXTRUDER_ID 0 + namespace Slic3r { namespace GUI { static int PA_LINE = 0; static int PA_PATTERN = 1; @@ -527,63 +533,155 @@ void CalibrationPresetPage::create_selection_panel(wxWindow* parent) { auto panel_sizer = new wxBoxSizer(wxVERTICAL); - auto nozzle_combo_text = new Label(parent, _L("Nozzle Diameter")); - nozzle_combo_text->SetFont(Label::Head_14); - nozzle_combo_text->Wrap(-1); - panel_sizer->Add(nozzle_combo_text, 0, wxALL, 0); - panel_sizer->AddSpacer(FromDIP(10)); - m_comboBox_nozzle_dia = new ComboBox(parent, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); - panel_sizer->Add(m_comboBox_nozzle_dia, 0, wxALL, 0); - - m_nozzle_diameter_tips = new Label(parent, ""); - m_nozzle_diameter_tips->Hide(); - m_nozzle_diameter_tips->SetFont(Label::Body_13); - //m_nozzle_diameter_tips->SetForegroundColour(wxColour(100, 100, 100)); - m_nozzle_diameter_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); - panel_sizer->Add(m_nozzle_diameter_tips, 0, wxALL, 0); + auto sync_button_sizer = new wxBoxSizer(wxHORIZONTAL); + auto btn_sync = new Button(parent, "", "ams_nozzle_sync"); + btn_sync->SetToolTip(_L("Synchronize nozzle and AMS information")); + btn_sync->SetCornerRadius(8); + StateColor btn_sync_bg_col(std::pair(wxColour(0xCECECE), StateColor::Pressed), std::pair(wxColour(0xF8F8F8), StateColor::Hovered), + std::pair(wxColour(0xF8F8F8), StateColor::Normal)); + StateColor btn_sync_bd_col(std::pair(wxColour(0x00AE42), StateColor::Pressed), std::pair(wxColour(0x00AE42), StateColor::Hovered), + std::pair(wxColour(0xEEEEEE), StateColor::Normal)); + btn_sync->SetBackgroundColor(btn_sync_bg_col); + btn_sync->SetBorderColor(btn_sync_bd_col); + btn_sync->SetCanFocus(false); + btn_sync->SetPaddingSize({FromDIP(6), FromDIP(12)}); + btn_sync->SetMinSize(SYNC_BUTTON_SIZE); + btn_sync->SetMaxSize(SYNC_BUTTON_SIZE); + btn_sync->SetVertical(); + btn_sync->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { + if (!curr_obj) { + MessageDialog msg_dlg(nullptr, _L("Please connect the printer first before synchronizing."), wxEmptyString, wxICON_WARNING | wxOK); + msg_dlg.ShowModal(); + return; + } + on_device_connected(curr_obj); + }); + auto sync_button_text = new Label(parent, _L("Sync printer information")); + sync_button_text->SetFont(Label::Head_14); + sync_button_text->Wrap(-1); + sync_button_sizer->Add(btn_sync); + sync_button_sizer->AddSpacer(FromDIP(20)); + sync_button_sizer->Add(sync_button_text, 0, wxALIGN_CENTER_VERTICAL | wxALL, 0); + panel_sizer->Add(sync_button_sizer); panel_sizer->AddSpacer(PRESET_GAP); - // nozzle_volume_type (multi_extruder) + // single extruder { - m_nozzle_volume_type_panel = new wxPanel(parent); - m_nozzle_volume_type_panel->SetBackgroundColour(*wxWHITE); + m_single_nozzle_info_panel = new wxPanel(parent); + m_single_nozzle_info_panel->SetBackgroundColour(*wxWHITE); + auto single_nozzle_sizer = new wxBoxSizer(wxVERTICAL); + auto nozzle_combo_text = new Label(m_single_nozzle_info_panel, _L("Nozzle Diameter")); + nozzle_combo_text->SetFont(Label::Head_14); + nozzle_combo_text->Wrap(-1); + + single_nozzle_sizer->Add(nozzle_combo_text, 0, wxALL, 0); + single_nozzle_sizer->AddSpacer(FromDIP(10)); + m_comboBox_nozzle_dia = new ComboBox(m_single_nozzle_info_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + single_nozzle_sizer->Add(m_comboBox_nozzle_dia, 0, wxALL, 0); + + m_nozzle_diameter_tips = new Label(m_single_nozzle_info_panel, ""); + m_nozzle_diameter_tips->Hide(); + m_nozzle_diameter_tips->SetFont(Label::Body_13); + // m_nozzle_diameter_tips->SetForegroundColour(wxColour(100, 100, 100)); + m_nozzle_diameter_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + single_nozzle_sizer->Add(m_nozzle_diameter_tips, 0, wxALL, 0); + single_nozzle_sizer->AddSpacer(PRESET_GAP); + + m_single_nozzle_info_panel->SetSizer(single_nozzle_sizer); + panel_sizer->Add(m_single_nozzle_info_panel); + } + + // multi extruder + { + m_multi_nozzle_info_panel = new wxPanel(parent); + m_multi_nozzle_info_panel->SetBackgroundColour(*wxWHITE); auto nozzle_volume_sizer = new wxBoxSizer(wxVERTICAL); - auto nozzle_volume_type_text = new Label(m_nozzle_volume_type_panel, _L("Nozzle Volume Type")); - nozzle_volume_type_text->SetFont(Label::Head_14); - nozzle_volume_type_text->Wrap(-1); - nozzle_volume_sizer->Add(nozzle_volume_type_text, 0, wxALL, 0); - nozzle_volume_sizer->AddSpacer(FromDIP(10)); + auto nozzle_info_text = new Label(m_multi_nozzle_info_panel, _L("Nozzle Info")); + nozzle_info_text->SetFont(Label::Head_14); + nozzle_info_text->Wrap(-1); + nozzle_volume_sizer->Add(nozzle_info_text, 0, wxALL, 0); + //nozzle_volume_sizer->AddSpacer(FromDIP(10)); wxBoxSizer * type_sizer = new wxBoxSizer(wxHORIZONTAL); - m_left_nozzle_volume_type_sizer = new wxStaticBoxSizer(wxVERTICAL, m_nozzle_volume_type_panel, "Left"); - m_right_nozzle_volume_type_sizer = new wxStaticBoxSizer(wxVERTICAL, m_nozzle_volume_type_panel, "Right"); + m_left_nozzle_volume_type_sizer = new wxStaticBoxSizer(wxVERTICAL, m_multi_nozzle_info_panel, "Left"); + { + //wxBoxSizer *nozzle_diameter_sizer = new wxBoxSizer(wxHORIZONTAL); + auto nozzle_diameter_text = new Label(m_multi_nozzle_info_panel, _L("Nozzle Diameter"), 0, CALIBRATION_LABEL_SIZE); + nozzle_diameter_text->SetFont(Label::Head_14); + nozzle_diameter_text->Wrap(-1); - m_comboBox_nozzle_volume_types.clear(); + m_left_comboBox_nozzle_dia = new ComboBox(m_multi_nozzle_info_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + m_left_comboBox_nozzle_dia->Disable(); - ComboBox *nozzle_volume_type_cbx = new ComboBox(m_nozzle_volume_type_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); - m_comboBox_nozzle_volume_types.emplace_back(nozzle_volume_type_cbx); - m_left_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types.back(), 0, wxEXPAND | wxALL, 5); + m_left_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + m_left_nozzle_volume_type_sizer->Add(nozzle_diameter_text, 0, wxLEFT | wxRIGHT, 10); + m_left_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + m_left_nozzle_volume_type_sizer->Add(m_left_comboBox_nozzle_dia, 0, wxLEFT | wxRIGHT, 10); + m_left_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); - nozzle_volume_type_cbx = new ComboBox(m_nozzle_volume_type_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr,wxCB_READONLY); - m_comboBox_nozzle_volume_types.emplace_back(nozzle_volume_type_cbx); - m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types.back(), 0, wxEXPAND | wxALL, 5); + //wxBoxSizer *nozzle_volume_sizer = new wxBoxSizer(wxHORIZONTAL); + auto nozzle_volume_type_text = new Label(m_multi_nozzle_info_panel, _L("Nozzle Volume Type"), 0, CALIBRATION_LABEL_SIZE); + nozzle_volume_type_text->SetFont(Label::Head_14); + nozzle_volume_type_text->Wrap(-1); - type_sizer->Add(m_left_nozzle_volume_type_sizer, 1, wxEXPAND | wxALL, 10); - type_sizer->Add(m_right_nozzle_volume_type_sizer, 1, wxEXPAND | wxALL, 10); + m_left_comboBox_nozzle_volume = new ComboBox(m_multi_nozzle_info_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + m_left_comboBox_nozzle_volume->Disable(); + + m_left_nozzle_volume_type_sizer->Add(nozzle_volume_type_text, 0, wxLEFT | wxRIGHT, 10); + m_left_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + m_left_nozzle_volume_type_sizer->Add(m_left_comboBox_nozzle_volume, 0, wxLEFT | wxRIGHT, 10); + m_left_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + + //m_left_nozzle_volume_type_sizer->Add(nozzle_diameter_sizer); + //m_left_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + //m_left_nozzle_volume_type_sizer->Add(nozzle_volume_sizer); + } + + m_right_nozzle_volume_type_sizer = new wxStaticBoxSizer(wxVERTICAL, m_multi_nozzle_info_panel, "Right"); + { + //wxBoxSizer *nozzle_diameter_sizer = new wxBoxSizer(wxHORIZONTAL); + auto nozzle_diameter_text = new Label(m_multi_nozzle_info_panel, _L("Nozzle Diameter"), 0, CALIBRATION_LABEL_SIZE); + nozzle_diameter_text->SetFont(Label::Head_14); + nozzle_diameter_text->Wrap(-1); + + m_right_comboBox_nozzle_dia = new ComboBox(m_multi_nozzle_info_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + m_right_comboBox_nozzle_dia->Disable(); + + m_right_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + m_right_nozzle_volume_type_sizer->Add(nozzle_diameter_text, 0, wxLEFT | wxRIGHT, 10); + m_right_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + m_right_nozzle_volume_type_sizer->Add(m_right_comboBox_nozzle_dia, 0, wxLEFT | wxRIGHT, 10); + m_right_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + + //wxBoxSizer *nozzle_volume_sizer = new wxBoxSizer(wxHORIZONTAL); + auto nozzle_volume_type_text = new Label(m_multi_nozzle_info_panel, _L("Nozzle Volume Type"), 0, CALIBRATION_LABEL_SIZE); + nozzle_volume_type_text->SetFont(Label::Head_14); + nozzle_volume_type_text->Wrap(-1); + + m_right_comboBox_nozzle_volume = new ComboBox(m_multi_nozzle_info_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr, wxCB_READONLY); + m_right_comboBox_nozzle_volume->Disable(); + + m_right_nozzle_volume_type_sizer->Add(nozzle_volume_type_text, 0, wxLEFT | wxRIGHT, 10); + m_right_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + m_right_nozzle_volume_type_sizer->Add(m_right_comboBox_nozzle_volume, 0, wxLEFT | wxRIGHT, 10); + m_right_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + + //m_right_nozzle_volume_type_sizer->Add(nozzle_diameter_sizer); + //m_right_nozzle_volume_type_sizer->AddSpacer(FromDIP(5)); + //m_right_nozzle_volume_type_sizer->Add(nozzle_volume_sizer); + } + + type_sizer->Add(m_left_nozzle_volume_type_sizer, 1, wxEXPAND | wxRIGHT, 10); + type_sizer->Add(m_right_nozzle_volume_type_sizer, 1, wxEXPAND, 0); nozzle_volume_sizer->Add(type_sizer); nozzle_volume_sizer->AddSpacer(PRESET_GAP); - for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { - m_comboBox_nozzle_volume_types[i]->Bind(wxEVT_COMBOBOX, std::bind(&CalibrationPresetPage::on_select_nozzle_volume_type, this, std::placeholders::_1, i)); - m_comboBox_nozzle_volume_types[i]->Hide(); - } + m_multi_nozzle_info_panel->SetSizer(nozzle_volume_sizer); + panel_sizer->Add(m_multi_nozzle_info_panel); - m_nozzle_volume_type_panel->SetSizer(nozzle_volume_sizer); - panel_sizer->Add(m_nozzle_volume_type_panel); - - m_nozzle_volume_type_panel->Hide(); + m_multi_nozzle_info_panel->Hide(); } auto plate_type_combo_text = new Label(parent, _L("Plate Type")); @@ -661,20 +759,38 @@ void CalibrationPresetPage::init_selection_values() m_comboBox_bed_type->SetSelection(curr_selection); } - // init nozzle_volume_type for multi_extruder + // left { + for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { + m_left_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i])); + } + m_left_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); + const ConfigOptionDef *nozzle_volume_type_def = print_config_def.get("nozzle_volume_type"); if (nozzle_volume_type_def && nozzle_volume_type_def->enum_keys_map) { for (auto item : nozzle_volume_type_def->enum_labels) { - for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { - m_comboBox_nozzle_volume_types[i]->AppendString(_L(item)); - } + m_left_comboBox_nozzle_volume->AppendString(_L(item)); } } - for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { - m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtStandard)); // default for single extruder printer + m_left_comboBox_nozzle_volume->SetSelection(int(NozzleVolumeType::nvtStandard)); + } + + // right + { + for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { + m_right_comboBox_nozzle_dia->AppendString(wxString::Format("%1.1f mm", nozzle_diameter_list[i])); } + m_right_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); + + const ConfigOptionDef *nozzle_volume_type_def = print_config_def.get("nozzle_volume_type"); + if (nozzle_volume_type_def && nozzle_volume_type_def->enum_keys_map) { + for (auto item : nozzle_volume_type_def->enum_labels) { + m_right_comboBox_nozzle_volume->AppendString(_L(item)); + } + } + + m_right_comboBox_nozzle_volume->SetSelection(int(NozzleVolumeType::nvtStandard)); } } @@ -749,13 +865,39 @@ void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent) panel_sizer->Fit(parent); } +float CalibrationPresetPage::get_nozzle_diameter(int extruder_id) const +{ + float nozzle_dia = -1.f; + if (!curr_obj) + return nozzle_dia; + + if (curr_obj->is_multi_extruders()) { + if (extruder_id == LEFT_EXTRUDER_ID) { + if (m_left_comboBox_nozzle_dia->GetSelection() >= 0 && m_left_comboBox_nozzle_dia->GetSelection() < NOZZLE_LIST_COUNT) { + nozzle_dia = nozzle_diameter_list[m_left_comboBox_nozzle_dia->GetSelection()]; + } + } else if (extruder_id == RIGHT_EXTRUDER_ID) { + if (m_right_comboBox_nozzle_dia->GetSelection() >= 0 && m_right_comboBox_nozzle_dia->GetSelection() < NOZZLE_LIST_COUNT) { + nozzle_dia = nozzle_diameter_list[m_right_comboBox_nozzle_dia->GetSelection()]; + } + } + } + else if (m_comboBox_nozzle_dia->GetSelection() >= 0 && m_comboBox_nozzle_dia->GetSelection() < NOZZLE_LIST_COUNT) { + nozzle_dia = nozzle_diameter_list[m_comboBox_nozzle_dia->GetSelection()]; + } + + return nozzle_dia; +} + NozzleVolumeType CalibrationPresetPage::get_nozzle_volume_type(int extruder_id) const { - if (m_comboBox_nozzle_volume_types.size() > extruder_id) - return NozzleVolumeType(m_comboBox_nozzle_volume_types[extruder_id]->GetSelection()); - else { - return NozzleVolumeType::nvtStandard; + if (extruder_id == LEFT_EXTRUDER_ID) { + return NozzleVolumeType(m_left_comboBox_nozzle_volume->GetSelection()); } + else if (extruder_id == RIGHT_EXTRUDER_ID) { + return NozzleVolumeType(m_right_comboBox_nozzle_volume->GetSelection()); + } + return NozzleVolumeType::nvtStandard; } ExtruderType CalibrationPresetPage::get_extruder_type(int extruder_id) const @@ -1862,6 +2004,15 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) { if (!obj) return; + auto get_nozzle_diameter_list_index = [&obj](int extruder_id) -> int { + for (int i = 0; i < NOZZLE_LIST_COUNT; i++) { + if (abs(obj->m_extder_data.extders[extruder_id].current_nozzle_diameter - nozzle_diameter_list[i]) < 1e-3) { + return i; + } + } + return -1; + }; + //set flow ratio calibration type m_cali_stage_panel->set_flow_ratio_calibration_type(obj->flow_ratio_calibration_type); // set nozzle value from machine @@ -1888,59 +2039,82 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) } if (obj->is_multi_extruders()) { - for (int i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { - m_comboBox_nozzle_volume_types[i]->Show(); - if (obj->m_extder_data.extders[i].current_nozzle_flow_type != NozzleFlowType::NONE_FLOWTYPE) - m_comboBox_nozzle_volume_types[i]->SetSelection(obj->m_extder_data.extders[i].current_nozzle_flow_type - 1); - else - m_comboBox_nozzle_volume_types[i]->SetSelection(0); + for (size_t i = 0; i < obj->m_extder_data.extders.size(); ++i) { + if (i == LEFT_EXTRUDER_ID) { + int index = get_nozzle_diameter_list_index(LEFT_EXTRUDER_ID); + if ((index != -1) && m_left_comboBox_nozzle_dia->GetCount() > index) { + m_left_comboBox_nozzle_dia->SetSelection(index); + wxCommandEvent event(wxEVT_COMBOBOX); + event.SetEventObject(this); + wxPostEvent(m_left_comboBox_nozzle_dia, event); + m_left_comboBox_nozzle_dia->SetToolTip(_L("The nozzle diameter has been synchronized from the printer Settings")); + } + else { + m_left_comboBox_nozzle_dia->SetToolTip(wxEmptyString); + if (m_left_comboBox_nozzle_dia->GetCount() > NOZZLE_LIST_DEFAULT) + m_left_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); + } + + if (obj->m_extder_data.extders[i].current_nozzle_flow_type != NozzleFlowType::NONE_FLOWTYPE) { + m_left_comboBox_nozzle_volume->SetSelection(obj->m_extder_data.extders[i].current_nozzle_flow_type - 1); + } else { + m_left_comboBox_nozzle_volume->SetSelection(0); + } + } + else if (i == RIGHT_EXTRUDER_ID) { + int index = get_nozzle_diameter_list_index(RIGHT_EXTRUDER_ID); + if ((index != -1) && m_right_comboBox_nozzle_dia->GetCount() > index) { + m_right_comboBox_nozzle_dia->SetSelection(index); + wxCommandEvent event(wxEVT_COMBOBOX); + event.SetEventObject(this); + wxPostEvent(m_right_comboBox_nozzle_dia, event); + m_right_comboBox_nozzle_dia->SetToolTip(_L("The nozzle diameter has been synchronized from the printer Settings")); + } else { + m_right_comboBox_nozzle_dia->SetToolTip(wxEmptyString); + if (m_right_comboBox_nozzle_dia->GetCount() > NOZZLE_LIST_DEFAULT) + m_right_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); + } + + if (obj->m_extder_data.extders[i].current_nozzle_flow_type != NozzleFlowType::NONE_FLOWTYPE) { + m_right_comboBox_nozzle_volume->SetSelection(obj->m_extder_data.extders[i].current_nozzle_flow_type - 1); + } else { + m_right_comboBox_nozzle_volume->SetSelection(0); + } + } } if (!obj->is_main_extruder_on_left() && m_main_extruder_on_left) { m_multi_exturder_ams_sizer->Detach(m_main_sizer); m_multi_exturder_ams_sizer->Detach(m_deputy_sizer); - m_left_nozzle_volume_type_sizer->Detach(0); - m_right_nozzle_volume_type_sizer->Detach(0); m_main_sizer->GetStaticBox()->SetLabel("Right"); m_deputy_sizer->GetStaticBox()->SetLabel("Left"); m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10); m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10); - m_left_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[1]); - m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[0]); - m_main_extruder_on_left = false; } else if (obj->is_main_extruder_on_left() && !m_main_extruder_on_left) { m_multi_exturder_ams_sizer->Detach(m_main_sizer); m_multi_exturder_ams_sizer->Detach(m_deputy_sizer); - m_left_nozzle_volume_type_sizer->Detach(0); - m_right_nozzle_volume_type_sizer->Detach(0); - m_main_sizer->GetStaticBox()->SetLabel("Left"); m_deputy_sizer->GetStaticBox()->SetLabel("Right"); m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10); m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10); - m_left_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[0]); - m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[1]); - m_main_extruder_on_left = true; } - m_nozzle_volume_type_panel->Show(); + m_single_nozzle_info_panel->Hide(); + m_multi_nozzle_info_panel->Show(); m_multi_exutrder_filament_list_panel->Show(); m_filament_list_panel->Hide(); m_ext_spool_panel->Hide(); } else { - for (int i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { - m_comboBox_nozzle_volume_types[i]->Hide(); - } - - m_nozzle_volume_type_panel->Hide(); + m_single_nozzle_info_panel->Show(); + m_multi_nozzle_info_panel->Hide(); m_multi_exutrder_filament_list_panel->Hide(); } diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp index a6d4c5128..fd55464cc 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp @@ -220,6 +220,7 @@ public: void on_sys_color_changed() override; int get_extruder_id(int ams_id); + float get_nozzle_diameter(int extruder_id) const; NozzleVolumeType get_nozzle_volume_type(int extruder_id) const; ExtruderType get_extruder_type(int extruder_id) const; @@ -294,10 +295,15 @@ protected: void create_multi_extruder_filament_list_panel(wxWindow *parent); void on_select_nozzle_volume_type(wxCommandEvent &evt, size_t extruder_id); - std::vector m_comboBox_nozzle_volume_types; - wxPanel* m_nozzle_volume_type_panel{nullptr}; + wxPanel* m_single_nozzle_info_panel{nullptr}; + wxPanel* m_multi_nozzle_info_panel{nullptr}; wxPanel* m_multi_exutrder_filament_list_panel{nullptr}; + ComboBox * m_left_comboBox_nozzle_dia; + ComboBox * m_right_comboBox_nozzle_dia; + ComboBox * m_left_comboBox_nozzle_volume; + ComboBox * m_right_comboBox_nozzle_volume; + wxPanel* m_main_ams_preview_panel{nullptr}; wxPanel* m_deputy_ams_preview_panel{nullptr}; wxBoxSizer* m_main_ams_items_sizer{nullptr}; @@ -358,3 +364,4 @@ public: }} // namespace Slic3r::GUI #endif + diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index 09483e05c..7575fab70 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -1111,7 +1111,21 @@ bool CalibUtils::check_printable_status_before_cali(const MachineObject *obj, co return false; } - float diameter = obj->m_extder_data.extders[0].current_nozzle_diameter; + float cali_diameter = cali_infos.calib_datas[0].nozzle_diameter; + int extruder_id = cali_infos.calib_datas[0].extruder_id; + for (const auto& cali_info : cali_infos.calib_datas) { + if (!is_approx(cali_diameter, cali_info.nozzle_diameter)) { + error_message = _L("Calibration using nozzles of different diameters is not supported."); + return false; + } + } + + if (extruder_id >= obj->m_extder_data.extders.size()) { + error_message = _L("The number of printer extruders and the printer selected for calibration does not match."); + return false; + } + + float diameter = obj->m_extder_data.extders[extruder_id].current_nozzle_diameter; bool is_multi_extruder = obj->is_multi_extruders(); std::vector nozzle_volume_types; if (is_multi_extruder) {