Fix PA calib crash when default line width is set to 0 (#9146)

Fix PA calib crash when default line width is set to 0 (SoftFever/OrcaSlicer#9144)
This commit is contained in:
Noisyfox 2025-04-13 17:31:54 +08:00 committed by GitHub
parent 697fc5b8d3
commit d54c139cdb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 9 additions and 6 deletions

View file

@ -11,7 +11,9 @@ float CalibPressureAdvance::find_optimal_PA_speed(const DynamicPrintConfig &conf
{ {
const double general_suggested_min_speed = 100.0; const double general_suggested_min_speed = 100.0;
double filament_max_volumetric_speed = config.option<ConfigOptionFloats>("filament_max_volumetric_speed")->get_at(0); double filament_max_volumetric_speed = config.option<ConfigOptionFloats>("filament_max_volumetric_speed")->get_at(0);
Flow pattern_line = Flow(line_width, layer_height, config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0)); const float nozzle_diameter = config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0);
if (line_width <= 0.) line_width = Flow::auto_extrusion_width(frPerimeter, nozzle_diameter);
Flow pattern_line = Flow(line_width, layer_height, nozzle_diameter);
auto pa_speed = std::min(std::max(general_suggested_min_speed, config.option<ConfigOptionFloat>("outer_wall_speed")->value), auto pa_speed = std::min(std::max(general_suggested_min_speed, config.option<ConfigOptionFloat>("outer_wall_speed")->value),
filament_max_volumetric_speed / pattern_line.mm3_per_mm()); filament_max_volumetric_speed / pattern_line.mm3_per_mm());
@ -565,9 +567,10 @@ double CalibPressureAdvancePattern::flow_val() const
double flow_mult = m_config.option<ConfigOptionFloats>("filament_flow_ratio")->get_at(0); double flow_mult = m_config.option<ConfigOptionFloats>("filament_flow_ratio")->get_at(0);
double nozzle_diameter = m_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0); double nozzle_diameter = m_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0);
double line_width = m_config.get_abs_value("line_width", nozzle_diameter); double line_width = m_config.get_abs_value("line_width", nozzle_diameter);
if (line_width <= 0.) line_width = Flow::auto_extrusion_width(frPerimeter, nozzle_diameter);
double layer_height = m_config.get_abs_value("layer_height"); double layer_height = m_config.get_abs_value("layer_height");
double speed = speed_perimeter(); double speed = speed_perimeter();
Flow pattern_line = Flow(line_width, layer_height, m_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0)); Flow pattern_line = Flow(line_width, layer_height, nozzle_diameter);
return speed * pattern_line.mm3_per_mm() * flow_mult; return speed * pattern_line.mm3_per_mm() * flow_mult;
}; };

View file

@ -286,7 +286,9 @@ protected:
{ {
// TODO: FIXME: find out current filament/extruder? // TODO: FIXME: find out current filament/extruder?
const double nozzle_diameter = m_config.opt_float("nozzle_diameter", 0); const double nozzle_diameter = m_config.opt_float("nozzle_diameter", 0);
return m_config.get_abs_value("line_width", nozzle_diameter); const double width = m_config.get_abs_value("line_width", nozzle_diameter);
if (width <= 0.) return Flow::auto_extrusion_width(frExternalPerimeter, nozzle_diameter);
return width;
}; };
int wall_count() const { return m_config.option<ConfigOptionInt>("wall_loops")->value; }; int wall_count() const { return m_config.option<ConfigOptionInt>("wall_loops")->value; };

View file

@ -9592,9 +9592,7 @@ void Plater::_calib_pa_pattern(const Calib_Params& params)
if (speeds.empty()) { if (speeds.empty()) {
double speed = CalibPressureAdvance::find_optimal_PA_speed( double speed = CalibPressureAdvance::find_optimal_PA_speed(
wxGetApp().preset_bundle->full_config(), wxGetApp().preset_bundle->full_config(),
(fabs(print_config.get_abs_value("line_width", nozzle_diameter)) <= DBL_EPSILON) ? print_config.get_abs_value("line_width", nozzle_diameter),
(nozzle_diameter * 1.125) :
print_config.get_abs_value("line_width", nozzle_diameter),
print_config.get_abs_value("layer_height"), 0); print_config.get_abs_value("layer_height"), 0);
print_config.set_key_value("outer_wall_speed", new ConfigOptionFloat(speed)); print_config.set_key_value("outer_wall_speed", new ConfigOptionFloat(speed));