From 38b3c32b6ae2ca63e815623144cb4c2a9c194977 Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Wed, 4 Sep 2024 15:20:35 +0800 Subject: [PATCH] ENH: flow_ratio cali support multi_extuder jira: none Change-Id: I03399040a772043d3d20116b0588fd04e0725be1 --- src/libslic3r/AppConfig.cpp | 4 + src/libslic3r/Calib.hpp | 4 + src/slic3r/GUI/CalibrationWizard.cpp | 134 +++++++++++++++++- src/slic3r/GUI/CalibrationWizard.hpp | 7 + .../GUI/CalibrationWizardPresetPage.cpp | 61 +++++--- src/slic3r/GUI/CalibrationWizardStartPage.cpp | 16 +-- src/slic3r/GUI/DeviceManager.cpp | 11 ++ src/slic3r/GUI/DeviceManager.hpp | 2 + 8 files changed, 203 insertions(+), 36 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index e4f7f95cf..1632e4455 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -576,6 +576,8 @@ std::string AppConfig::load() for (auto cali_it = calis_j["presets"].begin(); cali_it != calis_j["presets"].end(); cali_it++) { CaliPresetInfo preset_info; preset_info.tray_id = cali_it.value()["tray_id"].get(); + preset_info.extruder_id = cali_it.value()["extruder_id"].get(); + preset_info.nozzle_volume_type = NozzleVolumeType(cali_it.value()["nozzle_volume_type"].get()); preset_info.nozzle_diameter = cali_it.value()["nozzle_diameter"].get(); preset_info.filament_id = cali_it.value()["filament_id"].get(); preset_info.setting_id = cali_it.value()["setting_id"].get(); @@ -693,6 +695,8 @@ void AppConfig::save() for (auto filament_preset : cali_info.selected_presets) { json preset_json; preset_json["tray_id"] = filament_preset.tray_id; + preset_json["extruder_id"] = filament_preset.extruder_id; + preset_json["nozzle_volume_type"] = int(filament_preset.nozzle_volume_type); preset_json["nozzle_diameter"] = filament_preset.nozzle_diameter; preset_json["filament_id"] = filament_preset.filament_id; preset_json["setting_id"] = filament_preset.setting_id; diff --git a/src/libslic3r/Calib.hpp b/src/libslic3r/Calib.hpp index b6d2fdf96..3b373d449 100644 --- a/src/libslic3r/Calib.hpp +++ b/src/libslic3r/Calib.hpp @@ -73,6 +73,8 @@ class CaliPresetInfo { public: int tray_id; + int extruder_id; + NozzleVolumeType nozzle_volume_type; float nozzle_diameter; std::string filament_id; std::string setting_id; @@ -81,6 +83,8 @@ public: CaliPresetInfo &operator=(const CaliPresetInfo &other) { this->tray_id = other.tray_id; + this->extruder_id = other.extruder_id; + this->nozzle_volume_type = other.nozzle_volume_type; this->nozzle_diameter = other.nozzle_diameter; this->filament_id = other.filament_id; this->setting_id = other.setting_id; diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index fd0194f41..dea921f00 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -34,6 +34,32 @@ std::map get_cached_selected_filament(MachineObject* obj) { return selected_filament_map; } +struct TrayInfo +{ + int extruder_id; + NozzleVolumeType nozzle_volume_type; + Preset *preset; +}; +std::map get_cached_selected_filament_for_multi_extruder(MachineObject *obj) +{ + std::map selected_filament_map; + if (!obj) + return selected_filament_map; + + PresetCollection *filament_presets = &wxGetApp().preset_bundle->filaments; + for (auto selected_prest : obj->selected_cali_preset) { + TrayInfo tray_info; + tray_info.preset = filament_presets->find_preset(selected_prest.name); + if (!tray_info.preset) + continue; + + tray_info.extruder_id = selected_prest.extruder_id; + tray_info.nozzle_volume_type = selected_prest.nozzle_volume_type; + selected_filament_map.emplace(std::make_pair(selected_prest.tray_id, tray_info)); + } + return selected_filament_map; +} + bool is_pa_params_valid(const Calib_Params& params) { if (params.start < MIN_PA_K_VALUE || params.end > MAX_PA_K_VALUE || params.step < EPSILON || params.end < params.start + params.step) { @@ -288,6 +314,85 @@ bool CalibrationWizard::save_preset(const std::string &old_preset_name, const st return true; } +bool CalibrationWizard::save_preset_with_index(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, wxString &message) +{ + if (new_preset_name.empty()) { + message = _L("The name cannot be empty."); + return false; + } + + PresetCollection *filament_presets = &wxGetApp().preset_bundle->filaments; + Preset *preset = filament_presets->find_preset(old_preset_name); + if (!preset) { + message = wxString::Format(_L("The selected preset: %s is not found."), old_preset_name); + return false; + } + + Preset temp_preset = *preset; + + std::string new_name = filament_presets->get_preset_name_by_alias(new_preset_name); + bool exist_preset = false; + // If name is current, get the editing preset + Preset *new_preset = filament_presets->find_preset(new_name); + if (new_preset) { + if (new_preset->is_system) { + message = _L("The name cannot be the same as the system preset name."); + return false; + } + + if (new_preset != preset) { + message = _L("The name is the same as another existing preset name"); + return false; + } + if (new_preset != &filament_presets->get_edited_preset()) + new_preset = &temp_preset; + exist_preset = true; + } else { + new_preset = &temp_preset; + } + + for (auto item : key_values) { + auto config_opt = new_preset->config.option(item.first); + if (!config_opt) { + auto& config_value = config_opt->values; + config_value[item.second.index] = item.second.value; + } + } + + // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini + filament_presets->save_current_preset(new_name, false, false, new_preset); + + // BBS create new settings + new_preset = filament_presets->find_preset(new_name, false, true); + // Preset* preset = &m_presets.preset(it - m_presets.begin(), true); + if (!new_preset) { + BOOST_LOG_TRIVIAL(info) << "create new preset failed"; + message = _L("create new preset failed."); + return false; + } + + // set sync_info for sync service + if (exist_preset) { + new_preset->sync_info = "update"; + BOOST_LOG_TRIVIAL(info) << "sync_preset: update preset = " << new_preset->name; + } else { + new_preset->sync_info = "create"; + if (wxGetApp().is_user_login()) new_preset->user_id = wxGetApp().getAgent()->get_user_id(); + BOOST_LOG_TRIVIAL(info) << "sync_preset: create preset = " << new_preset->name; + } + new_preset->save_info(); + + // Mark the print & filament enabled if they are compatible with the currently selected preset. + // If saving the preset changes compatibility with other presets, keep the now incompatible dependent presets selected, however with a "red flag" icon showing that they are + // no more compatible. + wxGetApp().preset_bundle->update_compatible(PresetSelectCompatibleType::Never); + + // BBS if create a new prset name, preset changed from preset name to new preset name + if (!exist_preset) { wxGetApp().plater()->sidebar().update_presets_from_to(Preset::Type::TYPE_FILAMENT, old_preset_name, new_preset->name); } + + return true; +} + void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia) { if (!obj) return; @@ -304,6 +409,14 @@ void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia) result.filament_id = item.second->filament_id; result.setting_id = item.second->setting_id; result.name = item.second->name; + + if (obj->is_multi_extruders()) { + int ams_id, slot_id, tray_id; + get_tray_ams_and_slot_id(result.extruder_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(ams_id); + } + obj->selected_cali_preset.push_back(result); } @@ -1214,15 +1327,26 @@ void FlowRateWizard::on_cali_save() std::string old_preset_name; CalibrationPresetPage* preset_page = (static_cast(preset_step->page)); - std::map selected_filaments = get_cached_selected_filament(curr_obj); + std::map selected_filaments = get_cached_selected_filament_for_multi_extruder(curr_obj); + + + std::map key_value_map; + int index = 0; if (!selected_filaments.empty()) { - old_preset_name = selected_filaments.begin()->second->name; + TrayInfo tray_info = selected_filaments.begin()->second; + old_preset_name = tray_info.preset->name; + + // todo multi_extruder: get_extruder_type from obj + ExtruderType extruder_type = ExtruderType::etDirectDrive; + index = get_index_for_extruder_parameter(tray_info.preset->config, "filament_flow_ratio", tray_info.extruder_id, extruder_type, tray_info.nozzle_volume_type); + ConfigIndexValue config_value; + config_value.index = index; + config_value.value = new_flow_ratio; + key_value_map.insert(std::make_pair("filament_flow_ratio", config_value)); } - std::map key_value_map; - key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_flow_ratio })); wxString message; - if (!save_preset(old_preset_name, into_u8(new_preset_name), key_value_map, message)) { + if (!save_preset_with_index(old_preset_name, into_u8(new_preset_name), key_value_map, message)) { MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK); error_msg_dlg.ShowModal(); return; diff --git a/src/slic3r/GUI/CalibrationWizard.hpp b/src/slic3r/GUI/CalibrationWizard.hpp index 28bf93769..5a8c98c66 100644 --- a/src/slic3r/GUI/CalibrationWizard.hpp +++ b/src/slic3r/GUI/CalibrationWizard.hpp @@ -30,6 +30,12 @@ public: } }; +struct ConfigIndexValue +{ + float value{0}; + int index{0}; +}; + class CalibrationWizard : public wxPanel { public: CalibrationWizard(wxWindow* parent, CalibMode mode, @@ -61,6 +67,7 @@ public: CalibMode get_calibration_mode() { return m_mode; } bool save_preset(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, wxString& message); + bool save_preset_with_index(const std::string &old_preset_name, const std::string &new_preset_name, const std::map &key_values, wxString &message); virtual void cache_preset_info(MachineObject* obj, float nozzle_dia); virtual void recover_preset_info(MachineObject *obj); diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index 9c3782b66..d5b7aeed4 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -787,10 +787,13 @@ void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow * 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) + AMSModel ams_type = AMSModel::GENERIC_AMS; AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector{}}; - if (i == 4) + 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); + ams_type = AMSModel::EXT_AMS; + } + auto preview_ams_item = new AMSPreview(m_main_ams_preview_panel, wxID_ANY, temp_info, ams_type); 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) { @@ -846,10 +849,13 @@ void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow * 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 + AMSModel ams_type = AMSModel::GENERIC_AMS; AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector{}}; - if (i == 4) + 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); + ams_type = AMSModel::EXT_AMS; + } + auto preview_ams_item = new AMSPreview(m_deputy_ams_preview_panel, wxID_ANY, temp_info, ams_type); 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) { @@ -901,14 +907,14 @@ void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow * 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); + 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); } 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_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_multi_extruder_ams_panel_sizer->Add(m_multi_exturder_ams_sizer); @@ -1545,17 +1551,20 @@ void CalibrationPresetPage::update_show_status() show_status(CaliPresetPageStatus::CaliPresetStatusInPrinting); return; } - 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; - } - // check sdcard when if lan mode printer - if (obj_->is_lan_mode_printer()) { - if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { - show_status(CaliPresetPageStatus::CaliPresetStatusLanModeNoSdcard); + if (obj_->need_SD_card()) { + if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) { + show_status(CaliPresetPageStatus::CaliPresetStatusNoSdcard); return; } + + // check sdcard when if lan mode printer + if (obj_->is_lan_mode_printer()) { + if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) { + show_status(CaliPresetPageStatus::CaliPresetStatusLanModeNoSdcard); + return; + } + } } if (m_has_filament_incompatible) { @@ -1884,7 +1893,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) 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) { + 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); @@ -1892,15 +1901,15 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) 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_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[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) { + 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); @@ -1909,8 +1918,8 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) 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_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[1]); m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[0]); @@ -1942,7 +1951,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj) 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)) ) + else if (!obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_DEPUTY_ID))) { m_ext_spool_radiobox->SetValue(true); m_ams_radiobox->SetValue(false); @@ -2030,6 +2039,12 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) deputy_done = true; } } + + if (!main_done) + update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_MAIN_ID), 0); + + if (!deputy_done) + update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_DEPUTY_ID), 1); } } else { diff --git a/src/slic3r/GUI/CalibrationWizardStartPage.cpp b/src/slic3r/GUI/CalibrationWizardStartPage.cpp index 6f3ca393c..fd3c0ab10 100644 --- a/src/slic3r/GUI/CalibrationWizardStartPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardStartPage.cpp @@ -323,7 +323,14 @@ void CalibrationFlowRateStartPage::update(MachineObject *obj) m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); - if (obj->get_printer_series() == PrinterSeries::SERIES_X1) { + if (obj->is_multi_extruders() || obj->get_printer_series() == PrinterSeries::SERIES_P1P) { + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false); + m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); + + m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); + } + else if (obj->get_printer_series() == PrinterSeries::SERIES_X1) { m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true); m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); @@ -336,13 +343,6 @@ void CalibrationFlowRateStartPage::update(MachineObject *obj) m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); } } - else if (obj->get_printer_series() == PrinterSeries::SERIES_P1P) { - m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false); - m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false); - m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true); - - m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false); - } //is support auto cali if (!obj->is_support_flow_calibration) { diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 97c6bc077..cb7766f24 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1128,11 +1128,22 @@ void MachineObject::reset_mapping_result(std::vector& result) } } +bool MachineObject::is_main_extruder_on_left() const +{ + return printer_type.find("O1D") == std::string::npos; // not O1D +} + bool MachineObject::is_multi_extruders() const { return m_nozzle_data.total_nozzle_count > 1; } +bool MachineObject::need_SD_card() const +{ + // todo: check whether need SD card + return !is_multi_extruders(); +} + bool MachineObject::is_bbl_filament(std::string tag_uid) { if (tag_uid.empty()) diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index b4bca75a6..4a376cf0f 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -577,7 +577,9 @@ public: // exceed index start with 0 bool is_mapping_exceed_filament(std::vector& result, int &exceed_index); void reset_mapping_result(std::vector& result); + bool is_main_extruder_on_left() const; bool is_multi_extruders() const; + bool need_SD_card() const; /*online*/ bool online_rfid;