diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 4bac290dce..bad97a8934 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1892,9 +1892,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato CalibPressureAdvanceLine pa_test(this); - double filament_max_volumetric_speed = m_config.option("filament_max_volumetric_speed")->get_at(initial_extruder_id); - Flow pattern_line = Flow(pa_test.line_width(), 0.2, m_config.nozzle_diameter.get_at(0)); - auto fast_speed = std::min(print.default_region_config().outer_wall_speed.value, filament_max_volumetric_speed / pattern_line.mm3_per_mm()); + auto fast_speed = CalibPressureAdvance::find_optimal_PA_speed(print.full_print_config(), pa_test.line_width(), 0.2); auto slow_speed = std::max(20.0, fast_speed / 10.0); pa_test.set_speed(fast_speed, slow_speed); diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index 321d04945f..edcc24c586 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -1,8 +1,22 @@ #include "calib.hpp" #include "BoundingBox.hpp" +#include "Config.hpp" #include "Model.hpp" +#include namespace Slic3r { + +// Calculate the optimal Pressure Advance speed +float CalibPressureAdvance::find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, + int filament_idx) { + const double general_suggested_min_speed = 100.0; + double filament_max_volumetric_speed = config.option("filament_max_volumetric_speed")->get_at(0); + Flow pattern_line = Flow(line_width, layer_height, config.option("nozzle_diameter")->get_at(0)); + auto pa_speed = std::min(std::max(general_suggested_min_speed,config.option("outer_wall_speed")->value), filament_max_volumetric_speed / pattern_line.mm3_per_mm()); + + return std::floor(pa_speed); +} + std::string CalibPressureAdvance::move_to(Vec2d pt, GCodeWriter& writer, std::string comment) { std::stringstream gcode; diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp index 9f31e002c6..59d671d31a 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -26,7 +26,11 @@ struct Calib_Params { }; class CalibPressureAdvance { -protected: + public: + static float find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, + int filament_idx = 0); + + protected: CalibPressureAdvance() =default; ~CalibPressureAdvance() =default; @@ -120,8 +124,7 @@ struct SuggestedConfigCalibPAPattern { const std::vector> float_pairs { {"initial_layer_print_height", 0.25}, {"layer_height", 0.2}, - {"initial_layer_speed", 30}, - {"outer_wall_speed", 100} + {"initial_layer_speed", 30} }; const std::vector> nozzle_ratio_pairs { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e6f05a0f4c..ad3b0d669c 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -8144,6 +8144,7 @@ void Plater::_calib_pa_pattern(const Calib_Params& params) const DynamicPrintConfig& printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + double nozzle_diameter = printer_config.option("nozzle_diameter")->get_at(0); for (const auto opt : SuggestedConfigCalibPAPattern().float_pairs) { print_config.set_key_value( @@ -8151,9 +8152,13 @@ void Plater::_calib_pa_pattern(const Calib_Params& params) new ConfigOptionFloat(opt.second) ); } + print_config.set_key_value( + "outer_wall_speed", + new ConfigOptionFloat(CalibPressureAdvance::find_optimal_PA_speed( + wxGetApp().preset_bundle->full_config(), print_config.get_abs_value("line_width", nozzle_diameter), + print_config.get_abs_value("layer_height"), 0))); for (const auto opt : SuggestedConfigCalibPAPattern().nozzle_ratio_pairs) { - double nozzle_diameter = printer_config.option("nozzle_diameter")->get_at(0); print_config.set_key_value( opt.first, new ConfigOptionFloatOrPercent(nozzle_diameter * opt.second / 100, false) @@ -8235,12 +8240,19 @@ void Plater::_calib_pa_tower(const Calib_Params& params) { auto printer_config = &wxGetApp().preset_bundle->printers.get_edited_preset().config; auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; + const double nozzle_diameter = printer_config->option("nozzle_diameter")->get_at(0); + filament_config->set_key_value("slow_down_layer_time", new ConfigOptionFloats{ 1.0f }); print_config->set_key_value("default_jerk", new ConfigOptionFloat(1.0f)); print_config->set_key_value("outer_wall_jerk", new ConfigOptionFloat(1.0f)); print_config->set_key_value("inner_wall_jerk", new ConfigOptionFloat(1.0f)); - if(print_config->option>("wall_generator")->value == PerimeterGeneratorType::Arachne) - print_config->set_key_value("wall_transition_angle", new ConfigOptionFloat(25)); + auto full_config = wxGetApp().preset_bundle->full_config(); + auto wall_speed = CalibPressureAdvance::find_optimal_PA_speed( + full_config, full_config.get_abs_value("line_width", nozzle_diameter), + full_config.get_abs_value("layer_height"), 0); + print_config->set_key_value("outer_wall_speed", new ConfigOptionFloat(wall_speed)); + print_config->set_key_value("inner_wall_speed", new ConfigOptionFloat(wall_speed)); + print_config->set_key_value("wall_generator", new ConfigOptionEnum(PerimeterGeneratorType::Classic)); model().objects[0]->config.set_key_value("seam_position", new ConfigOptionEnum(spRear)); changed_objects({ 0 });