From 11f61abefaca6f0810e76266e50729432a3aa15e Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Fri, 16 Aug 2024 14:54:34 +0800 Subject: [PATCH] ENH: calib support multi_extruder(UI part) jira: none Change-Id: I3009c2f8b601dc078cfed787dc3531fc1d4848d6 --- src/libslic3r/Calib.hpp | 1 + src/libslic3r/ParameterUtils.cpp | 32 ++ src/libslic3r/ParameterUtils.hpp | 2 + src/slic3r/GUI/CalibrationWizard.cpp | 22 + src/slic3r/GUI/CalibrationWizardPage.cpp | 12 + src/slic3r/GUI/CalibrationWizardPage.hpp | 9 +- .../GUI/CalibrationWizardPresetPage.cpp | 540 +++++++++++++++++- .../GUI/CalibrationWizardPresetPage.hpp | 37 ++ src/slic3r/GUI/OptionsGroup.cpp | 52 -- src/slic3r/GUI/OptionsGroup.hpp | 2 - src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/Utils/CalibUtils.cpp | 28 +- src/slic3r/Utils/CalibUtils.hpp | 2 + 13 files changed, 656 insertions(+), 85 deletions(-) diff --git a/src/libslic3r/Calib.hpp b/src/libslic3r/Calib.hpp index 9ab766497..b6d2fdf96 100644 --- a/src/libslic3r/Calib.hpp +++ b/src/libslic3r/Calib.hpp @@ -56,6 +56,7 @@ public: int ams_id = 0; int slot_id = 0; int bed_temp; + ExtruderType extruder_type{ExtruderType::etDirectDrive}; NozzleVolumeType nozzle_volume_type = NozzleVolumeType::nvtNormal; int nozzle_temp; float nozzle_diameter; diff --git a/src/libslic3r/ParameterUtils.cpp b/src/libslic3r/ParameterUtils.cpp index 8254346c5..f160fa2d7 100644 --- a/src/libslic3r/ParameterUtils.cpp +++ b/src/libslic3r/ParameterUtils.cpp @@ -44,4 +44,36 @@ void get_other_layers_print_sequence(const std::vector &cust } } +int get_index_for_extruder_parameter(const DynamicPrintConfig &config, const std::string &opt_key, int cur_extruder_id, ExtruderType extruder_type, NozzleVolumeType nozzle_volume_type) +{ + std::string id_name, variant_name; + unsigned int stride = 1; + if (printer_options_with_variant_1.count(opt_key) > 0) { // printer parameter + id_name = "printer_extruder_id"; + variant_name = "printer_extruder_variant"; + } else if (printer_options_with_variant_2.count(opt_key) > 0) { + id_name = "printer_extruder_id"; + variant_name = "printer_extruder_variant"; + stride = 2; + } else if (filament_options_with_variant.count(opt_key) > 0) { + // filament don't use id anymore + // id_name = "filament_extruder_id"; + variant_name = "filament_extruder_variant"; + } else if (print_options_with_variant.count(opt_key) > 0) { + id_name = "print_extruder_id"; + variant_name = "print_extruder_variant"; + } else { + return 0; + } + + // variant index + int variant_index = config.get_index_for_extruder(cur_extruder_id + 1, id_name, extruder_type, nozzle_volume_type, variant_name, stride); + if (variant_index < 0) { + assert(false); + return 0; + } + + return variant_index; +} + }; // namespace Slic3r diff --git a/src/libslic3r/ParameterUtils.hpp b/src/libslic3r/ParameterUtils.hpp index 090fd8d80..795e7ff61 100644 --- a/src/libslic3r/ParameterUtils.hpp +++ b/src/libslic3r/ParameterUtils.hpp @@ -3,12 +3,14 @@ #include #include +#include "PrintConfig.hpp" namespace Slic3r { using LayerPrintSequence = std::pair, std::vector>; std::vector get_other_layers_print_sequence(int sequence_nums, const std::vector &sequence); void get_other_layers_print_sequence(const std::vector &customize_sequences, int &sequence_nums, std::vector &sequence); +extern int get_index_for_extruder_parameter(const DynamicPrintConfig &config, const std::string &opt_key, int cur_extruder_id, ExtruderType extruder_type, NozzleVolumeType nozzle_volume_type); } // namespace Slic3r #endif // slic3r_Parameter_Utils_hpp_ diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index a86162413..37d2de7e0 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -19,6 +19,12 @@ static const wxString NA_STR = _L("N/A"); static const float MIN_PA_K_VALUE_STEP = 0.001; static const int MAX_PA_HISTORY_RESULTS_NUMS = 16; +void get_ams_id_and_slot_id(int tray_id, int& ams_id, int& slot_id) +{ + ams_id = tray_id / 4; + slot_id = tray_id % 4; +} + std::map get_cached_selected_filament(MachineObject* obj) { std::map selected_filament_map; if (!obj) return selected_filament_map; @@ -592,6 +598,10 @@ void PressureAdvanceWizard::on_cali_start() } X1CCalibInfos::X1CCalibInfo calib_info; + get_ams_id_and_slot_id(item.first, calib_info.ams_id, calib_info.slot_id); + 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.tray_id = item.first; calib_info.nozzle_diameter = nozzle_dia; calib_info.filament_id = item.second->filament_id; @@ -626,6 +636,10 @@ void PressureAdvanceWizard::on_cali_start() CalibInfo calib_info; calib_info.dev_id = curr_obj->dev_id; + get_ams_id_and_slot_id(selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id); + 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.extruder_id = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]"; Preset *preset = selected_filaments.begin()->second; Preset * temp_filament_preset = new Preset(preset->type, preset->name + "_temp"); @@ -992,6 +1006,10 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow X1CCalibInfos::X1CCalibInfo calib_info; calib_info.tray_id = item.first; + get_ams_id_and_slot_id(item.first, calib_info.ams_id, calib_info.slot_id); + 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.extruder_id = preset_page->get_nozzle_volume_type(calib_info.extruder_id); calib_info.nozzle_diameter = nozzle_dia; calib_info.filament_id = item.second->filament_id; calib_info.setting_id = item.second->setting_id; @@ -1043,6 +1061,10 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow if (!selected_filaments.empty()) { calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]"; + get_ams_id_and_slot_id(selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id); + 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); Preset* preset = selected_filaments.begin()->second; temp_filament_preset = new Preset(preset->type, preset->name + "_temp"); temp_filament_preset->config = preset->config; diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp index 89bd52576..d07a04ad8 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPage.cpp @@ -275,6 +275,18 @@ FilamentComboBox::FilamentComboBox(wxWindow* parent, const wxPoint& pos, const w main_sizer->Fit(this); } +void FilamentComboBox::ShowPanel() +{ + this->Show(); + m_radioBox->Show(); +} + +void FilamentComboBox::HidePanel() +{ + this->Hide(); + m_radioBox->Hide(); +} + void FilamentComboBox::set_select_mode(CalibrationFilamentMode mode) { m_mode = mode; diff --git a/src/slic3r/GUI/CalibrationWizardPage.hpp b/src/slic3r/GUI/CalibrationWizardPage.hpp index e9c682082..2909bd05e 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPage.hpp @@ -98,6 +98,9 @@ public: virtual void SetValue(bool value, bool send_event = true); void msw_rescale(); + void ShowPanel(); + void HidePanel(); + protected: int m_tray_id { -1 }; std::string m_tray_name; @@ -160,7 +163,7 @@ protected: std::vector m_text_steps; }; -class CaliPagePicture : public wxPanel +class CaliPagePicture : public wxPanel { public: CaliPagePicture(wxWindow* parent, @@ -232,7 +235,7 @@ private: CaliPageActionType m_action_type; }; -class CaliPageSendingPanel : public wxPanel +class CaliPageSendingPanel : public wxPanel { public: CaliPageSendingPanel(wxWindow* parent, @@ -277,7 +280,7 @@ protected: std::vector m_action_btns; }; -class CalibrationWizardPage : public wxPanel +class CalibrationWizardPage : public wxPanel { public: CalibrationWizardPage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL); diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index b70f9506c..44ff5785a 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -489,6 +489,8 @@ CalibrationPresetPage::CalibrationPresetPage( m_page_type = CaliPageType::CALI_PAGE_PRESET; m_cali_filament_mode = CalibrationFilamentMode::CALI_MODEL_SINGLE; m_top_sizer = new wxBoxSizer(wxVERTICAL); + m_extrder_types.resize(2, ExtruderType::etDirectDrive); + m_extruder_nozzle_types.resize(2, NozzleVolumeType::nvtBigTraffic); create_page(this); @@ -512,6 +514,16 @@ void CalibrationPresetPage::on_sys_color_changed() m_ams_sync_button->msw_rescale(); } +int CalibrationPresetPage::get_extruder_id(int ams_id) +{ + if (m_ams_id_to_extruder_id_map.find(ams_id) != m_ams_id_to_extruder_id_map.end()) { + return m_ams_id_to_extruder_id_map[ams_id]; + } + else { + return -1; + } +} + void CalibrationPresetPage::create_selection_panel(wxWindow* parent) { auto panel_sizer = new wxBoxSizer(wxVERTICAL); @@ -533,6 +545,48 @@ void CalibrationPresetPage::create_selection_panel(wxWindow* parent) panel_sizer->AddSpacer(PRESET_GAP); + // nozzle_volume_type (multi_extruder) + { + m_nozzle_volume_type_panel = new wxPanel(parent); + + 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)); + + 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_comboBox_nozzle_volume_types.clear(); + + 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); + + 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); + + 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); + + 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_nozzle_volume_type_panel->SetSizer(nozzle_volume_sizer); + panel_sizer->Add(m_nozzle_volume_type_panel); + + m_nozzle_volume_type_panel->Hide(); + } + auto plate_type_combo_text = new Label(parent, _L("Plate Type")); plate_type_combo_text->SetFont(Label::Head_14); plate_type_combo_text->Wrap(-1); @@ -607,6 +661,22 @@ void CalibrationPresetPage::init_selection_values() } m_comboBox_bed_type->SetSelection(curr_selection); } + + // init nozzle_volume_type for multi_extruder + { + 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)); + } + } + } + + for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { + m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtBigTraffic)); + } + } } void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent) @@ -680,6 +750,164 @@ void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent) panel_sizer->Fit(parent); } +NozzleVolumeType CalibrationPresetPage::get_nozzle_volume_type(int extruder_id) const +{ + return NozzleVolumeType(m_comboBox_nozzle_volume_types[extruder_id]->GetSelection()); +} + +ExtruderType CalibrationPresetPage::get_extruder_type(int extruder_id) const +{ + return ExtruderType(m_extrder_types[extruder_id]); +} + +void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow *parent) +{ + m_multi_extruder_ams_panel_sizer = new wxBoxSizer(wxVERTICAL); + + m_filament_list_tips = new Label( + parent, + _L("Tips for calibration material: \n- Materials that can share same hot bed temperature\n- Different filament brand and family(Brand = Bambu, Family = Basic, Matte)")); + m_filament_list_tips->Hide(); + m_filament_list_tips->SetFont(Label::Body_13); + m_filament_list_tips->SetForegroundColour(wxColour(145, 145, 145)); + m_filament_list_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH); + m_multi_extruder_ams_panel_sizer->Add(m_filament_list_tips, 0, wxBOTTOM, FromDIP(10)); + + { + // 1. Preview item + m_main_sizer = new wxStaticBoxSizer(wxVERTICAL, parent, "Main"); + m_main_ams_preview_panel = new wxPanel(parent); + auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL); + for (int i = 0; i < 5; i++) { // most connect 4 ams(multi + single) + AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector{}}; + if (i == 4) + temp_info.ams_type = AMSModel::EXT_AMS; + auto preview_ams_item = new AMSPreview(m_main_ams_preview_panel, wxID_ANY, temp_info); + m_main_ams_preview_list.push_back(preview_ams_item); + size_t index = m_main_ams_preview_list.size() - 1; + preview_ams_item->Bind(wxEVT_LEFT_DOWN, [this, index](wxMouseEvent &e) { + update_multi_extruder_filament_combobox(m_main_ams_preview_list[index]->m_amsinfo.ams_id, 0); + e.Skip(); + }); + ams_items_sizer->Add(preview_ams_item, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6)); + } + m_main_ams_preview_panel->SetSizer(ams_items_sizer); + m_main_sizer->Add(m_main_ams_preview_panel); + + // 2. AMS item + m_main_ams_items_sizer = new wxBoxSizer(wxVERTICAL); + for (int i = 0; i < 4; i++) { // 4 slots + auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL); + wxRadioButton *radio_btn = new wxRadioButton(m_multi_exutrder_filament_list_panel, wxID_ANY, ""); + CheckBox * check_box = new CheckBox(m_multi_exutrder_filament_list_panel); + check_box->SetBackgroundColour(*wxWHITE); + FilamentComboBox *fcb = new FilamentComboBox(m_multi_exutrder_filament_list_panel); + fcb->SetRadioBox(radio_btn); + fcb->SetCheckBox(check_box); + fcb->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER); + filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); + filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER); + m_main_ams_items_sizer->Add(filament_comboBox_sizer, 0); + + fcb->Bind(EVT_CALI_TRAY_CHANGED, &CalibrationPresetPage::on_select_tray, this); + m_main_filament_comboBox_list.emplace_back(fcb); + + radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent &evt) { + wxCommandEvent event(EVT_CALI_TRAY_CHANGED); + event.SetEventObject(this); + wxPostEvent(this, event); + }); + check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &evt) { + wxCommandEvent event(EVT_CALI_TRAY_CHANGED); + event.SetEventObject(this); + wxPostEvent(this, event); + evt.Skip(); + }); + + if (i == 0) + radio_btn->SetValue(true); + } + + m_main_sizer->Add(m_main_ams_items_sizer, 1, wxEXPAND | wxALL, 10); + } + + { + // 1. Preview item + m_deputy_sizer = new wxStaticBoxSizer(wxVERTICAL, parent, "Deputy"); + m_deputy_ams_preview_panel = new wxPanel(parent); + auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL); + for (int i = 0; i < 5; i++) { // most connect 4 ams(multi + single) + 1 vt_slot + AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector{}}; + if (i == 4) + temp_info.ams_type = AMSModel::EXT_AMS; + auto preview_ams_item = new AMSPreview(m_deputy_ams_preview_panel, wxID_ANY, temp_info); + m_deputy_ams_preview_list.push_back(preview_ams_item); + size_t index = m_deputy_ams_preview_list.size() - 1; + preview_ams_item->Bind(wxEVT_LEFT_DOWN, [this, index](wxMouseEvent &e) { + update_multi_extruder_filament_combobox(m_deputy_ams_preview_list[index]->m_amsinfo.ams_id, 1); + e.Skip(); + }); + ams_items_sizer->Add(preview_ams_item, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6)); + } + + m_deputy_ams_preview_panel->SetSizer(ams_items_sizer); + m_deputy_sizer->Add(m_deputy_ams_preview_panel); + + // 2. AMS item + m_deputy_ams_items_sizer = new wxBoxSizer(wxVERTICAL); + for (int i = 0; i < 4; ++i) { // 4 slots + auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL); + wxRadioButton *radio_btn = new wxRadioButton(m_multi_exutrder_filament_list_panel, wxID_ANY, ""); + CheckBox * check_box = new CheckBox(m_multi_exutrder_filament_list_panel); + check_box->SetBackgroundColour(*wxWHITE); + FilamentComboBox *fcb = new FilamentComboBox(m_multi_exutrder_filament_list_panel); + fcb->SetRadioBox(radio_btn); + fcb->SetCheckBox(check_box); + fcb->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE); + filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER); + filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8)); + filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER); + m_deputy_ams_items_sizer->Add(filament_comboBox_sizer, 0); + + fcb->Bind(EVT_CALI_TRAY_CHANGED, &CalibrationPresetPage::on_select_tray, this); + m_deputy_filament_comboBox_list.emplace_back(fcb); + + radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent &evt) { + wxCommandEvent event(EVT_CALI_TRAY_CHANGED); + event.SetEventObject(this); + wxPostEvent(this, event); + }); + check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &evt) { + wxCommandEvent event(EVT_CALI_TRAY_CHANGED); + event.SetEventObject(this); + wxPostEvent(this, event); + evt.Skip(); + }); + } + + m_deputy_sizer->Add(m_deputy_ams_items_sizer, 1, wxEXPAND | wxALL, 10); + } + + m_multi_exturder_ams_sizer = new wxBoxSizer(wxHORIZONTAL); + if (m_main_extruder_on_left) { + m_main_sizer->GetStaticBox()->SetLabel("Left"); + m_deputy_sizer->GetStaticBox()->SetLabel("Right"); + m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL, 10); + m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL, 10); + } + else { + m_main_sizer->GetStaticBox()->SetLabel("Right"); + m_deputy_sizer->GetStaticBox()->SetLabel("Left"); + m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL, 10); + m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL, 10); + } + m_multi_extruder_ams_panel_sizer->Add(m_multi_exturder_ams_sizer); + + parent->SetSizer(m_multi_extruder_ams_panel_sizer); + m_multi_extruder_ams_panel_sizer->Fit(parent); +} + void CalibrationPresetPage::create_ext_spool_panel(wxWindow* parent) { auto panel_sizer = new wxBoxSizer(wxHORIZONTAL); @@ -746,6 +974,10 @@ void CalibrationPresetPage::create_page(wxWindow* parent) m_filament_list_panel->SetBackgroundColour(*wxWHITE); create_filament_list_panel(m_filament_list_panel); + m_multi_exutrder_filament_list_panel = new wxPanel(parent); + m_multi_exutrder_filament_list_panel->SetBackgroundColour(*wxWHITE); + create_multi_extruder_filament_list_panel(m_multi_exutrder_filament_list_panel); + if (m_cali_mode == CalibMode::Calib_PA_Line || m_cali_mode == CalibMode::Calib_PA_Pattern) { wxArrayString pa_cali_modes; pa_cali_modes.push_back(_L("Line")); @@ -781,6 +1013,7 @@ void CalibrationPresetPage::create_page(wxWindow* parent) m_top_sizer->Add(m_selection_panel, 0); m_top_sizer->Add(m_filament_list_panel, 0); + m_top_sizer->Add(m_multi_exutrder_filament_list_panel, 0); m_top_sizer->Add(m_ext_spool_panel, 0); m_top_sizer->Add(m_pa_cali_method_combox, 0); m_top_sizer->Add(m_custom_range_panel, 0); @@ -881,6 +1114,10 @@ void CalibrationPresetPage::on_select_nozzle(wxCommandEvent& evt) update_combobox_filaments(curr_obj); } +void CalibrationPresetPage::on_select_nozzle_volume_type(wxCommandEvent &evt, size_t extruder_id) +{ +} + void CalibrationPresetPage::on_select_plate_type(wxCommandEvent& evt) { select_default_compatible_filament(); @@ -1196,6 +1433,14 @@ void CalibrationPresetPage::update_combobox_filaments(MachineObject* obj) Preset* printer_preset = get_printer_preset(obj, nozzle_value); + auto opt_extruder_type = printer_preset->config.option("extruder_type"); + if (opt_extruder_type) { + assert(opt_extruder_type->values.size() <= 2); + for (size_t i = 0; i < opt_extruder_type->values.size(); ++i) { + m_extrder_types[i] = (ExtruderType)(opt_extruder_type->values[i]); + } + } + // sync ams filaments list info PresetBundle* preset_bundle = wxGetApp().preset_bundle; if (preset_bundle && printer_preset) { @@ -1292,7 +1537,7 @@ void CalibrationPresetPage::update_show_status() show_status(CaliPresetPageStatus::CaliPresetStatusInPrinting); return; } - else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { + else if (!obj_->is_multi_extruders() && !obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { show_status(CaliPresetPageStatus::CaliPresetStatusNoSdcard); return; } @@ -1625,13 +1870,71 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) m_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT); } + if (obj->is_multi_extruders()) { + for (int i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { + m_comboBox_nozzle_volume_types[i]->Show(); + m_comboBox_nozzle_volume_types[i]->SetSelection(obj->m_nozzle_data.nozzles[i].flow_type); + } + + if (obj->printer_type.find("O1D") != std::string::npos && 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); + m_multi_exturder_ams_sizer->Add(m_main_sizer); + + 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 = false; + } + else if (obj->printer_type.find("O1D") == std::string::npos && !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); + m_multi_exturder_ams_sizer->Add(m_deputy_sizer); + + 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 = true; + } + + m_nozzle_volume_type_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_multi_exutrder_filament_list_panel->Hide(); + } + // set bed type collection from machine //if (m_cali_mode == CalibMode::Calib_PA_Line) // update_plate_type_collection(m_cali_method); // init default for filament source // TODO if user change ams/ext, need to update - if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) ) + if (obj->is_multi_extruders()) { + m_ext_spool_radiobox->SetValue(false); + m_ams_radiobox->SetValue(false); + } + else if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) ) { m_ext_spool_radiobox->SetValue(true); m_ams_radiobox->SetValue(false); @@ -1660,6 +1963,9 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) std::map full_filament_ams_list; for (auto ams_item : old_full_filament_ams_list) { int key = ams_item.first & 0x0FFFF; + if (key == VIRTUAL_TRAY_MAIN_ID || key == VIRTUAL_TRAY_DEPUTY_ID) { + ams_item.second.set_key_value("filament_exist", new ConfigOptionBools{true}); + } full_filament_ams_list[key] = std::move(ams_item.second); } @@ -1688,6 +1994,9 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) filament_ams_list[VIRTUAL_TRAY_MAIN_ID] = full_filament_ams_list[VIRTUAL_TRAY_MAIN_ID]; } + if (full_filament_ams_list.find(VIRTUAL_TRAY_DEPUTY_ID) != full_filament_ams_list.end()) { + filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID] = full_filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID]; + } // update filament from panel, display only obj has ams // update multi ams panel, display only obj has multi ams @@ -1700,19 +2009,104 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) if (!obj->amsList.empty()) update_filament_combobox(obj->amsList.begin()->first); } + + if (obj->is_multi_extruders()) { + bool main_done = false; + bool deputy_done = false; + for (auto &ams_item : obj->amsList) { + if (ams_item.second->nozzle == 0 && !main_done) { + update_multi_extruder_filament_combobox(ams_item.second->id, ams_item.second->nozzle); + main_done = true; + } else if (ams_item.second->nozzle == 1 && !deputy_done) { + update_multi_extruder_filament_combobox(ams_item.second->id, ams_item.second->nozzle); + deputy_done = true; + } + } + } } else { + if (obj->is_multi_extruders()) { + update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_MAIN_ID), 0); + update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_DEPUTY_ID), 1); + } + update_filament_combobox(); m_multi_ams_panel->Hide(); } + m_ams_id_to_extruder_id_map.clear(); std::vector ams_info; + std::vector main_ams_info; + std::vector deputy_ams_info; for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) { AMSinfo info; info.ams_id = ams->first; if (ams->second->is_exists && info.parse_ams_info(obj, ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) { ams_info.push_back(info); + if (info.nozzle_id == 0) { + main_ams_info.push_back(info); + } else { + deputy_ams_info.push_back(info); + } + } + m_ams_id_to_extruder_id_map[stoi(info.ams_id)] = info.nozzle_id; + } + + // update for multi_exturder preview + for (auto i = 0; i < 4; i++) { + AMSPreview *main_item = m_main_ams_preview_list[i]; + if (main_ams_info.size() > 0) { + if (i < main_ams_info.size()) { + main_item->Update(main_ams_info[i]); + main_item->Open(); + } else { + main_item->Close(); + } + } + else { + main_item->Close(); + } + + AMSPreview *deputy_item = m_deputy_ams_preview_list[i]; + if (deputy_ams_info.size() > 0) { + if (i < deputy_ams_info.size()) { + deputy_item->Update(deputy_ams_info[i]); + deputy_item->Open(); + } else { + deputy_item->Close(); + } + } else { + deputy_item->Close(); + } + } + + // update vt slot preview list + { + for (const AmsTray& vt_tray : obj->vt_slot) { + if (vt_tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) { + AMSinfo info; + info.ReadExtInfo(vt_tray); + info.ams_type = AMSModel::EXT_AMS; + + assert(m_main_ams_preview_list.size() == 4); + AMSPreview *vt_item = m_main_ams_preview_list[4]; + vt_item->Update(info); + vt_item->Open(); + } + else if (vt_tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + AMSinfo info; + info.ReadExtInfo(vt_tray); + info.ams_type = AMSModel::EXT_AMS; + + assert(m_deputy_ams_preview_list.size() == 4); + AMSPreview *vt_item = m_deputy_ams_preview_list[4]; + vt_item->Update(info); + vt_item->Open(); + } + else { + assert(false); + } } } @@ -1798,28 +2192,54 @@ std::vector CalibrationPresetPage::get_selected_filament_comb { std::vector fcb_list; - if (m_ext_spool_radiobox->GetValue()) { - if (m_ext_spool_panel) { - if (m_virtual_tray_comboBox->GetRadioBox()->GetValue()) - fcb_list.push_back(m_virtual_tray_comboBox); - } - } else if (m_ams_radiobox->GetValue()) { + if (curr_obj && curr_obj->is_multi_extruders()) { if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) { - for (auto& fcb : m_filament_comboBox_list) { + for (auto &fcb : m_main_filament_comboBox_list) { if (fcb->GetCheckBox()->GetValue()) { fcb_list.push_back(fcb); } } - } - else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) { - for (auto& fcb : m_filament_comboBox_list) { + for (auto &fcb : m_deputy_filament_comboBox_list) { + if (fcb->GetCheckBox()->GetValue()) { + fcb_list.push_back(fcb); + } + } + } else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) { + for (auto &fcb : m_main_filament_comboBox_list) { + if (fcb->GetRadioBox()->GetValue()) { + fcb_list.push_back(fcb); + } + } + for (auto &fcb : m_deputy_filament_comboBox_list) { if (fcb->GetRadioBox()->GetValue()) { fcb_list.push_back(fcb); } } } - } else { - assert(false); + } + else { + if (m_ext_spool_radiobox->GetValue()) { + if (m_ext_spool_panel) { + if (m_virtual_tray_comboBox->GetRadioBox()->GetValue()) + fcb_list.push_back(m_virtual_tray_comboBox); + } + } else if (m_ams_radiobox->GetValue()) { + if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) { + for (auto &fcb : m_filament_comboBox_list) { + if (fcb->GetCheckBox()->GetValue()) { + fcb_list.push_back(fcb); + } + } + } else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) { + for (auto &fcb : m_filament_comboBox_list) { + if (fcb->GetRadioBox()->GetValue()) { + fcb_list.push_back(fcb); + } + } + } + } else { + assert(false); + } } return fcb_list; @@ -1870,6 +2290,88 @@ void CalibrationPresetPage::get_cali_stage(CaliPresetStage& stage, float& value) } } +void CalibrationPresetPage::update_multi_extruder_filament_combobox(const std::string &ams_id, int nozzle_id) +{ + if (nozzle_id == 0) { + for (auto &fcb : m_main_filament_comboBox_list) { + fcb->update_from_preset(); + fcb->set_select_mode(m_cali_filament_mode); + } + } + else { + for (auto &fcb : m_deputy_filament_comboBox_list) { + fcb->update_from_preset(); + fcb->set_select_mode(m_cali_filament_mode); + } + } + + DynamicPrintConfig empty_config; + empty_config.set_key_value("filament_id", new ConfigOptionStrings{""}); + empty_config.set_key_value("tag_uid", new ConfigOptionStrings{""}); + empty_config.set_key_value("filament_type", new ConfigOptionStrings{""}); + empty_config.set_key_value("tray_name", new ConfigOptionStrings{""}); + empty_config.set_key_value("filament_colour", new ConfigOptionStrings{""}); + empty_config.set_key_value("filament_exist", new ConfigOptionBools{false}); + + if (filament_ams_list.empty()) return; + + int ams_id_int = 0; + try { + if (!ams_id.empty()) + ams_id_int = stoi(ams_id.c_str()); + + } catch (...) {} + + int item_size = 4; + if (ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + item_size = 1; + } + + for (int i = 0; i < 4; i++) { + if (i < item_size) { + if (nozzle_id == 0) + m_main_filament_comboBox_list[i]->ShowPanel(); + else + m_deputy_filament_comboBox_list[i]->ShowPanel(); + } + else { + if (nozzle_id == 0) + m_main_filament_comboBox_list[i]->HidePanel(); + else + m_deputy_filament_comboBox_list[i]->HidePanel(); + } + + int tray_index = ams_id_int * 4 + i; + if (ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) { + tray_index = stoi(ams_id); + } + + auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [tray_index](auto &entry) { + return entry.first == tray_index; + }); + + if (nozzle_id == 0) { + if (m_main_filament_comboBox_list.empty()) + continue; + if (it != filament_ams_list.end()) { + m_main_filament_comboBox_list[i]->load_tray_from_ams(tray_index, it->second); + } else { + m_main_filament_comboBox_list[i]->load_tray_from_ams(tray_index, empty_config); + } + } + else{ + if (m_deputy_filament_comboBox_list.empty()) + continue; + if (it != filament_ams_list.end()) { + m_deputy_filament_comboBox_list[i]->load_tray_from_ams(tray_index, it->second); + } else { + m_deputy_filament_comboBox_list[i]->load_tray_from_ams(tray_index, empty_config); + } + } + } + Layout(); +} + void CalibrationPresetPage::update_filament_combobox(std::string ams_id) { for (auto& fcb : m_filament_comboBox_list) { @@ -1888,14 +2390,14 @@ void CalibrationPresetPage::update_filament_combobox(std::string ams_id) /* update virtual tray combo box*/ m_virtual_tray_comboBox->update_from_preset(); auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [](auto& entry) { - return entry.first == VIRTUAL_TRAY_MAIN_ID; + return entry.first == VIRTUAL_TRAY_DEPUTY_ID; }); if (it != filament_ams_list.end()) { - m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_MAIN_ID, it->second); + m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_DEPUTY_ID, it->second); } else { - m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_MAIN_ID, empty_config); + m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_DEPUTY_ID, empty_config); } if (filament_ams_list.empty()) @@ -1935,9 +2437,9 @@ Preset* CalibrationPresetPage::get_printer_preset(MachineObject* obj, float nozz if (!printer_it->is_system) continue; ConfigOption* printer_nozzle_opt = printer_it->config.option("nozzle_diameter"); - ConfigOptionFloats* printer_nozzle_vals = nullptr; + ConfigOptionFloatsNullable *printer_nozzle_vals = nullptr; if (printer_nozzle_opt) - printer_nozzle_vals = dynamic_cast(printer_nozzle_opt); + printer_nozzle_vals = dynamic_cast(printer_nozzle_opt); std::string model_id = printer_it->get_current_printer_type(preset_bundle); std::string printer_type = obj->printer_type; diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp index bfa742fb0..4df430434 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.hpp @@ -219,6 +219,10 @@ public: void msw_rescale() override; void on_sys_color_changed() override; + int get_extruder_id(int ams_id); + NozzleVolumeType get_nozzle_volume_type(int extruder_id) const; + ExtruderType get_extruder_type(int extruder_id) const; + protected: void create_selection_panel(wxWindow* parent); void create_filament_list_panel(wxWindow* parent); @@ -285,6 +289,39 @@ protected: ComboBox* m_comboBox_process; Label* m_nozzle_diameter_tips{nullptr}; + // multi_extruder + void update_multi_extruder_filament_combobox(const std::string &ams_id, int nozzle_id); + 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_multi_exutrder_filament_list_panel{nullptr}; + + wxPanel* m_main_ams_preview_panel{nullptr}; + wxPanel* m_deputy_ams_preview_panel{nullptr}; + wxBoxSizer* m_main_ams_items_sizer{nullptr}; + wxBoxSizer* m_deputy_ams_items_sizer{nullptr}; + + std::vector m_main_ams_preview_list; + std::vector m_deputy_ams_preview_list; + FilamentComboBoxList m_main_filament_comboBox_list; + FilamentComboBoxList m_deputy_filament_comboBox_list; + + std::unordered_map m_ams_id_to_extruder_id_map; + std::vector m_extrder_types; + std::vector m_extruder_nozzle_types; + bool m_main_extruder_on_left{true}; + + wxBoxSizer* m_multi_extruder_ams_panel_sizer; + wxBoxSizer * m_multi_exturder_ams_sizer; + wxStaticBoxSizer * m_main_sizer; + wxStaticBoxSizer * m_deputy_sizer; + wxStaticBoxSizer * m_left_nozzle_volume_type_sizer; + wxStaticBoxSizer * m_right_nozzle_volume_type_sizer; + + + wxRadioButton* m_ams_radiobox; wxRadioButton* m_ext_spool_radiobox; diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 374e93513..a04ec7cae 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -23,58 +23,6 @@ namespace Slic3r { namespace GUI { // BBS: new layout constexpr int titleWidth = 20; -// get the param index of cur_exturder -int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type) -{ - if (printer_extruder_options.find(opt_key) != printer_extruder_options.end()) { - return cur_extruder_id; - } - - int extruder_count = wxGetApp().preset_bundle->get_printer_extruder_count(); - if (extruder_count == 1 || cur_extruder_id == -1) - return 0; - - assert(cur_extruder_id < extruder_count); - const DynamicPrintConfig& cur_printer_config = wxGetApp().preset_bundle->printers.get_selected_preset().config; - auto opt_extruder_type = dynamic_cast(cur_printer_config.option("extruder_type")); - //auto opt_nozzle_volume_type = dynamic_cast(cur_printer_config.option("default_nozzle_volume_type")); - - if (!opt_extruder_type) - return 0; - - ExtruderType extruder_type = (ExtruderType) (opt_extruder_type->get_at(cur_extruder_id)); - //NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (opt_nozzle_volume_type->get_at(cur_extruder_id)); - - std::string id_name, variant_name; - unsigned int stride = 1; - if (printer_options_with_variant_1.count(opt_key) > 0) { // printer parameter - id_name = "printer_extruder_id"; - variant_name = "printer_extruder_variant"; - } else if (printer_options_with_variant_2.count(opt_key) > 0) { - id_name = "printer_extruder_id"; - variant_name = "printer_extruder_variant"; - stride = 2; - } else if (filament_options_with_variant.count(opt_key) > 0) { - //filament don't use id anymore - //id_name = "filament_extruder_id"; - variant_name = "filament_extruder_variant"; - } else if (print_options_with_variant.count(opt_key) > 0) { - id_name = "print_extruder_id"; - variant_name = "print_extruder_variant"; - } else { - return 0; - } - - // variant index - int variant_index = config.get_index_for_extruder(cur_extruder_id + 1, id_name, extruder_type, nozzle_volume_type, variant_name, stride); - if (variant_index < 0) { - assert(false); - return 0; - } - - return variant_index; -} - const t_field& OptionsGroup::build_field(const Option& opt) { return build_field(opt.opt_id, opt.opt); } diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index 0c94e46df..9ce8dc4da 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -24,8 +24,6 @@ namespace Slic3r { namespace GUI { -extern int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type); - // Thrown if the building of a parameter page is canceled. class UIBuildCanceled : public std::exception {}; class OG_CustomCtrl; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c11bcb59b..461a812ee 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1982,7 +1982,7 @@ std::map Sidebar::build_filament_ams_list(MachineObject if (obj->ams_support_virtual_tray) { int extruder = 0x10000; // Main (first) extruder at right for (auto & vt_tray : obj->vt_slot) { - filament_ams_list.emplace(extruder + VIRTUAL_TRAY_MAIN_ID, build_tray_config(vt_tray, "Ext")); + filament_ams_list.emplace(extruder + stoi(vt_tray.id), build_tray_config(vt_tray, "Ext")); extruder = 0; } } diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index d5e5f8e62..a604a083b 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -530,9 +530,9 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString read_model_from_file(input_file, model); - DynamicConfig print_config = calib_info.print_prest->config; - DynamicConfig filament_config = calib_info.filament_prest->config; - DynamicConfig printer_config = calib_info.printer_prest->config; + DynamicPrintConfig print_config = calib_info.print_prest->config; + DynamicPrintConfig filament_config = calib_info.filament_prest->config; + DynamicPrintConfig printer_config = calib_info.printer_prest->config; /// --- scale --- // model is created for a 0.4 nozzle, scale z with nozzle size. @@ -555,10 +555,22 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString //} Flow infill_flow = Flow(nozzle_diameter * 1.2f, layer_height, nozzle_diameter); - double filament_max_volumetric_speed = filament_config.option("filament_max_volumetric_speed")->get_at(0); + + int index = get_index_for_extruder_parameter(filament_config, "filament_max_volumetric_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type); + double filament_max_volumetric_speed = filament_config.option("filament_max_volumetric_speed")->get_at(index); double max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (pass == 1 ? 1.2 : 1)); - double internal_solid_speed = std::floor(std::min(print_config.opt_float_nullable("internal_solid_infill_speed", calib_info.extruder_id), max_infill_speed)); - double top_surface_speed = std::floor(std::min(print_config.opt_float_nullable("top_surface_speed", calib_info.extruder_id), max_infill_speed)); + + index = get_index_for_extruder_parameter(print_config, "internal_solid_infill_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type); + double internal_solid_speed = std::floor(std::min(print_config.opt_float_nullable("internal_solid_infill_speed", index), max_infill_speed)); + ConfigOptionFloatsNullable* internal_solid_speed_opt = print_config.option("internal_solid_infill_speed"); + auto & new_internal_solid_speed = internal_solid_speed_opt->values; + new_internal_solid_speed[index] = internal_solid_speed; + + index = get_index_for_extruder_parameter(print_config, "top_surface_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type); + double top_surface_speed = std::floor(std::min(print_config.opt_float_nullable("top_surface_speed", index), max_infill_speed)); + ConfigOptionFloatsNullable *top_surface_speed_opt = print_config.option("top_surface_speed"); + auto & new_top_surface_speed = top_surface_speed_opt->values; + new_top_surface_speed[index] = top_surface_speed; // adjust parameters filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum(calib_info.bed_type)); @@ -580,8 +592,8 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString _obj->config.set_key_value("top_solid_infill_flow_ratio", new ConfigOptionFloat(1.0f)); _obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45)); _obj->config.set_key_value("ironing_type", new ConfigOptionEnum(IroningType::NoIroning)); - _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloat(internal_solid_speed)); - _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloat(top_surface_speed)); + _obj->config.set_key_value("internal_solid_infill_speed", internal_solid_speed_opt); + _obj->config.set_key_value("top_surface_speed", top_surface_speed_opt); // extract flowrate from name, filename format: flowrate_xxx std::string obj_name = _obj->name; diff --git a/src/slic3r/Utils/CalibUtils.hpp b/src/slic3r/Utils/CalibUtils.hpp index e7eeef66e..01eb6a640 100644 --- a/src/slic3r/Utils/CalibUtils.hpp +++ b/src/slic3r/Utils/CalibUtils.hpp @@ -18,6 +18,8 @@ public: int extruder_id = 0; int ams_id = 0; int slot_id = 0; + ExtruderType extruder_type{ExtruderType::etDirectDrive}; + NozzleVolumeType nozzle_volume_type; Calib_Params params; Preset* printer_prest; Preset* filament_prest;