From ed61d1d31bdc79f064567deacf35e05bd123880d Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Thu, 5 Sep 2024 14:48:21 +0800 Subject: [PATCH] FIX: fix flow ratio calib bug for single extruder printer 2. modify the filament_flow_ratio to nullable jira:none Change-Id: I3f0569ee643cfe9473c6029ca0e04f4b80c8332e --- src/libslic3r/AppConfig.cpp | 6 +- src/libslic3r/Calib.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 4 +- src/libslic3r/PrintConfig.hpp | 2 +- src/slic3r/GUI/CalibrationWizard.cpp | 58 +++++++++++++------ src/slic3r/GUI/CalibrationWizard.hpp | 2 + .../GUI/CalibrationWizardPresetPage.cpp | 13 ++--- src/slic3r/GUI/Plater.cpp | 2 +- src/slic3r/GUI/Tab.cpp | 2 +- src/slic3r/Utils/CalibUtils.cpp | 12 ++-- 10 files changed, 64 insertions(+), 39 deletions(-) diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index 1632e4455..d3e37c272 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -576,8 +576,10 @@ 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()); + if (cali_it.value().contains("extruder_id")) + preset_info.extruder_id = cali_it.value()["extruder_id"].get(); + if (cali_it.value().contains("nozzle_volume_type")) + 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(); diff --git a/src/libslic3r/Calib.cpp b/src/libslic3r/Calib.cpp index bfdb48f2a..2009e935d 100644 --- a/src/libslic3r/Calib.cpp +++ b/src/libslic3r/Calib.cpp @@ -208,7 +208,7 @@ std::string CalibPressureAdvance::draw_line(GCodeWriter &writer, Vec2d to_pt, do { const double e_per_mm = CalibPressureAdvance::e_per_mm(line_width, layer_height, m_config.option("nozzle_diameter")->get_at(0), m_config.option("filament_diameter")->get_at(0), - m_config.option("filament_flow_ratio")->get_at(0)); + m_config.option("filament_flow_ratio")->get_at(0)); const double length = get_distance(Vec2d(m_last_pos.x(), m_last_pos.y()), to_pt); auto dE = e_per_mm * length; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 98a231303..7443093af 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -1505,7 +1505,8 @@ void PrintConfigDef::init_fff_params() "Maybe you can tune this value to get nice flat surface when there has slight overflow or underflow"); def->max = 2; def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloats { 1. }); + def->nullable = true; + def->set_default_value(new ConfigOptionFloatsNullable { 1. }); def = this->add("print_flow_ratio", coFloat); def->label = L("Object flow ratio"); @@ -5169,6 +5170,7 @@ std::set print_options_with_variant = { }; std::set filament_options_with_variant = { + "filament_flow_ratio", "filament_max_volumetric_speed", //"filament_extruder_id", "filament_extruder_variant", diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index d589856e7..8539e1374 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -962,7 +962,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, enable_arc_fitting)) ((ConfigOptionString, machine_end_gcode)) ((ConfigOptionStrings, filament_end_gcode)) - ((ConfigOptionFloats, filament_flow_ratio)) + ((ConfigOptionFloatsNullable, filament_flow_ratio)) ((ConfigOptionBools, enable_pressure_advance)) ((ConfigOptionFloats, pressure_advance)) ((ConfigOptionFloats, filament_diameter)) diff --git a/src/slic3r/GUI/CalibrationWizard.cpp b/src/slic3r/GUI/CalibrationWizard.cpp index dea921f00..308161586 100644 --- a/src/slic3r/GUI/CalibrationWizard.cpp +++ b/src/slic3r/GUI/CalibrationWizard.cpp @@ -353,10 +353,13 @@ bool CalibrationWizard::save_preset_with_index(const std::string &old_preset_nam for (auto item : key_values) { auto config_opt = new_preset->config.option(item.first); - if (!config_opt) { + if (config_opt) { auto& config_value = config_opt->values; config_value[item.second.index] = item.second.value; } + else { + message = wxString::Format(_L("Could not find parameter: %s."), item.first); + } } // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini @@ -416,6 +419,10 @@ void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia) result.extruder_id = preset_page->get_extruder_id(ams_id); result.nozzle_volume_type = preset_page->get_nozzle_volume_type(ams_id); } + else { + result.extruder_id = 0; + result.nozzle_volume_type = NozzleVolumeType::nvtNormal; + } obj->selected_cali_preset.push_back(result); } @@ -662,7 +669,7 @@ static bool get_preset_info(const DynamicConfig& config, const BedType plate_typ static bool get_flow_ratio(const DynamicConfig& config, float& flow_ratio) { - const ConfigOptionFloats *flow_ratio_opt = config.option("filament_flow_ratio"); + const ConfigOptionFloatsNullable *flow_ratio_opt = config.option("filament_flow_ratio"); if (flow_ratio_opt) { flow_ratio = flow_ratio_opt->get_at(0); if (flow_ratio > 0) @@ -1208,7 +1215,13 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow } else if (stage == CaliPresetStage::CALI_MANUAL_STAGE_2) { cali_stage = 2; - temp_filament_preset->config.set_key_value("filament_flow_ratio", new ConfigOptionFloats{ cali_value }); + auto flow_ratio_values = temp_filament_preset->config.option("filament_flow_ratio")->values; + std::map key_value_map = generate_index_key_value(curr_obj, "filament_flow_ratio", cali_value); + if (!key_value_map.empty()) { + flow_ratio_values[key_value_map.begin()->second.index] = key_value_map.begin()->second.value; + } + + temp_filament_preset->config.set_key_value("filament_flow_ratio", new ConfigOptionFloatsNullable{flow_ratio_values}); if (from_page == FlowRatioCaliSource::FROM_PRESET_PAGE) { calib_info.process_bar = preset_page->get_sending_progress_bar(); } @@ -1286,7 +1299,7 @@ void FlowRateWizard::on_cali_save() } for (int i = 0; i < new_results.size(); i++) { std::map key_value_map; - key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_results[i].second })); + key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloatsNullable{ new_results[i].second })); wxString message; if (!save_preset(old_preset_name, into_u8(new_results[i].first), key_value_map, message)) { MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK); @@ -1328,21 +1341,10 @@ 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_for_multi_extruder(curr_obj); + std::map key_value_map = generate_index_key_value(curr_obj, "filament_flow_ratio", new_flow_ratio); - - std::map key_value_map; - int index = 0; if (!selected_filaments.empty()) { - 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)); + old_preset_name = selected_filaments.begin()->second.preset->name; } wxString message; @@ -1403,6 +1405,28 @@ void FlowRateWizard::on_device_connected(MachineObject* obj) } } +std::map FlowRateWizard::generate_index_key_value(MachineObject *obj, const std::string &key, float value) +{ + std::map key_value_map; + if (!obj) + return key_value_map; + + std::map selected_filaments = get_cached_selected_filament_for_multi_extruder(obj); + int index = 0; + if (!selected_filaments.empty()) { + TrayInfo tray_info = selected_filaments.begin()->second; + // 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 = value; + key_value_map.insert(std::make_pair("filament_flow_ratio", config_value)); + } + + return key_value_map; +} + void FlowRateWizard::set_cali_method(CalibrationMethod method) { m_cali_method = method; diff --git a/src/slic3r/GUI/CalibrationWizard.hpp b/src/slic3r/GUI/CalibrationWizard.hpp index 5a8c98c66..501b86dda 100644 --- a/src/slic3r/GUI/CalibrationWizard.hpp +++ b/src/slic3r/GUI/CalibrationWizard.hpp @@ -157,6 +157,8 @@ protected: void update(MachineObject* obj) override; void on_device_connected(MachineObject* obj) override; + + std::map generate_index_key_value(MachineObject *obj, const std::string &key, float value); }; class MaxVolumetricSpeedWizard : public CalibrationWizard { diff --git a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp index d5b7aeed4..8b8a5b92e 100644 --- a/src/slic3r/GUI/CalibrationWizardPresetPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPresetPage.cpp @@ -519,9 +519,8 @@ 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; - } + + return 0; } void CalibrationPresetPage::create_selection_panel(wxWindow* parent) @@ -674,7 +673,7 @@ void CalibrationPresetPage::init_selection_values() } for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) { - m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtBigTraffic)); + m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtNormal)); // default for single extruder printer } } } @@ -1195,7 +1194,7 @@ void CalibrationPresetPage::on_recommend_input_value() else if (m_cali_mode == CalibMode::Calib_Flow_Rate && m_cali_stage_panel) { Preset *selected_filament_preset = selected_filaments.begin()->second; if (selected_filament_preset) { - const ConfigOptionFloats* flow_ratio_opt = selected_filament_preset->config.option("filament_flow_ratio"); + const ConfigOptionFloatsNullable* flow_ratio_opt = selected_filament_preset->config.option("filament_flow_ratio"); if (flow_ratio_opt) { m_cali_stage_panel->set_flow_ratio_value(flow_ratio_opt->get_at(0)); } @@ -2112,7 +2111,6 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) info.parse_ext_info(obj, 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(); @@ -2122,7 +2120,6 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj) info.parse_ext_info(obj, 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(); @@ -2304,7 +2301,7 @@ void CalibrationPresetPage::get_cali_stage(CaliPresetStage& stage, float& value) if (stage != CaliPresetStage::CALI_MANUAL_STAGE_2) { std::map selected_filaments = get_selected_filaments(); if (!selected_filaments.empty()) { - const ConfigOptionFloats* flow_ratio_opt = selected_filaments.begin()->second->config.option("filament_flow_ratio"); + const ConfigOptionFloatsNullable* flow_ratio_opt = selected_filaments.begin()->second->config.option("filament_flow_ratio"); if (flow_ratio_opt) { m_cali_stage_panel->set_flow_ratio_value(flow_ratio_opt->get_at(0)); value = flow_ratio_opt->get_at(0); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 30f32ca12..b67feef75 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -10304,7 +10304,7 @@ void Plater::calib_max_vol_speed(const Calib_Params ¶ms) } auto new_params = params; - auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config->option("filament_flow_ratio")->get_at(0); + auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config->option("filament_flow_ratio")->get_at(0); new_params.end = params.end / mm3_per_mm; new_params.start = params.start / mm3_per_mm; new_params.step = params.step / mm3_per_mm; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index e808b6d80..82bf09288 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3144,7 +3144,7 @@ void TabFilament::build() optgroup->append_single_option_line("required_nozzle_HRC"); optgroup->append_single_option_line("default_filament_colour"); optgroup->append_single_option_line("filament_diameter"); - optgroup->append_single_option_line("filament_flow_ratio"); + optgroup->append_single_option_line("filament_flow_ratio", "", 0); optgroup->append_single_option_line("enable_pressure_advance"); optgroup->append_single_option_line("pressure_advance"); optgroup->append_single_option_line("filament_density"); diff --git a/src/slic3r/Utils/CalibUtils.cpp b/src/slic3r/Utils/CalibUtils.cpp index ebba3cacb..3461f45ed 100644 --- a/src/slic3r/Utils/CalibUtils.cpp +++ b/src/slic3r/Utils/CalibUtils.cpp @@ -577,14 +577,12 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString 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; + internal_solid_speed_opt->values[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; + top_surface_speed_opt->values[index] = top_surface_speed; // adjust parameters filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum(calib_info.bed_type)); @@ -606,8 +604,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", internal_solid_speed_opt); - _obj->config.set_key_value("top_surface_speed", top_surface_speed_opt); + _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloatsNullable(internal_solid_speed_opt->values)); + _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloatsNullable(top_surface_speed_opt->values)); // extract flowrate from name, filename format: flowrate_xxx std::string obj_name = _obj->name; @@ -917,7 +915,7 @@ void CalibUtils::calib_max_vol_speed(const CalibInfo &calib_info, wxString &erro } auto new_params = params; - auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config.option("filament_flow_ratio")->get_at(0); + auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config.option("filament_flow_ratio")->get_at(0); new_params.end = params.end / mm3_per_mm; new_params.start = params.start / mm3_per_mm; new_params.step = params.step / mm3_per_mm;