mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-08-01 15:22:21 +00:00
fix: PA pattern calibration crash with first layer line width 0 (#14447)
CalibPressureAdvancePattern::line_width_first_layer() returned the raw initial_layer_line_width, so a value of 0 (which means "use the default") fed 0 into the Flow spacing math and threw FlowErrorNegativeSpacing, crashing the whole app when slicing a PA pattern calibration. Mirror the guard already present in the sibling line_width(): when the configured width is non-positive, fall back to auto_extrusion_width. Add a libslic3r regression test covering the width resolution. Fixes #13188
This commit is contained in:
@@ -756,6 +756,16 @@ Vec3d CalibPressureAdvancePattern::get_start_offset()
|
|||||||
return m_starting_point;
|
return m_starting_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double CalibPressureAdvancePattern::line_width_first_layer() const
|
||||||
|
{
|
||||||
|
// TODO: FIXME: find out current filament/extruder?
|
||||||
|
const double nozzle_diameter = m_config.opt_float("nozzle_diameter", m_params.extruder_id);
|
||||||
|
const double width = m_config.get_abs_value("initial_layer_line_width", nozzle_diameter);
|
||||||
|
if (width <= 0.)
|
||||||
|
return Flow::auto_extrusion_width(frExternalPerimeter, nozzle_diameter);
|
||||||
|
return width;
|
||||||
|
};
|
||||||
|
|
||||||
double CalibPressureAdvancePattern::line_width() const
|
double CalibPressureAdvancePattern::line_width() const
|
||||||
{
|
{
|
||||||
// TODO: FIXME: find out current filament/extruder?
|
// TODO: FIXME: find out current filament/extruder?
|
||||||
|
|||||||
@@ -315,12 +315,7 @@ protected:
|
|||||||
double speed_first_layer() const { return m_config.get_abs_value_at("initial_layer_speed", m_params.extruder_id); };
|
double speed_first_layer() const { return m_config.get_abs_value_at("initial_layer_speed", m_params.extruder_id); };
|
||||||
double speed_perimeter() const { return m_config.get_abs_value_at("outer_wall_speed", m_params.extruder_id); };
|
double speed_perimeter() const { return m_config.get_abs_value_at("outer_wall_speed", m_params.extruder_id); };
|
||||||
double accel_perimeter() const { return m_config.get_abs_value_at("outer_wall_acceleration", m_params.extruder_id); }
|
double accel_perimeter() const { return m_config.get_abs_value_at("outer_wall_acceleration", m_params.extruder_id); }
|
||||||
double line_width_first_layer() const
|
double line_width_first_layer() const;
|
||||||
{
|
|
||||||
// TODO: FIXME: find out current filament/extruder?
|
|
||||||
const double nozzle_diameter = m_config.opt_float("nozzle_diameter", m_params.extruder_id);
|
|
||||||
return m_config.get_abs_value("initial_layer_line_width", nozzle_diameter);
|
|
||||||
};
|
|
||||||
double line_width() const;
|
double line_width() const;
|
||||||
int wall_count() const { return m_config.option<ConfigOptionInt>("wall_loops")->value; };
|
int wall_count() const { return m_config.option<ConfigOptionInt>("wall_loops")->value; };
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ add_executable(${_TEST_NAME}_tests
|
|||||||
test_arachne_walls.cpp
|
test_arachne_walls.cpp
|
||||||
test_arrange.cpp
|
test_arrange.cpp
|
||||||
test_bambu_networking.cpp
|
test_bambu_networking.cpp
|
||||||
|
test_calib.cpp
|
||||||
test_clipper_offset.cpp
|
test_clipper_offset.cpp
|
||||||
test_clipper_utils.cpp
|
test_clipper_utils.cpp
|
||||||
test_config.cpp
|
test_config.cpp
|
||||||
|
|||||||
40
tests/libslic3r/test_calib.cpp
Normal file
40
tests/libslic3r/test_calib.cpp
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#include <catch2/catch_all.hpp>
|
||||||
|
|
||||||
|
#include "libslic3r/calib.hpp"
|
||||||
|
#include "libslic3r/Model.hpp"
|
||||||
|
#include "libslic3r/TriangleMesh.hpp"
|
||||||
|
#include "libslic3r/PrintConfig.hpp"
|
||||||
|
|
||||||
|
using namespace Slic3r;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
// The width-resolution getters are protected; expose them so the resolution can be asserted directly.
|
||||||
|
struct PaPatternProbe : public CalibPressureAdvancePattern
|
||||||
|
{
|
||||||
|
using CalibPressureAdvancePattern::CalibPressureAdvancePattern;
|
||||||
|
using CalibPressureAdvancePattern::line_width;
|
||||||
|
using CalibPressureAdvancePattern::line_width_first_layer;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
TEST_CASE("Zero calibration line width resolves to a positive default", "[Calib][Regression]")
|
||||||
|
{
|
||||||
|
DynamicPrintConfig config = DynamicPrintConfig::full_print_config();
|
||||||
|
config.set_deserialize_strict({
|
||||||
|
{"line_width", "0"},
|
||||||
|
{"initial_layer_line_width", "0"},
|
||||||
|
});
|
||||||
|
|
||||||
|
Model model;
|
||||||
|
model.add_object("cube", "", make_cube(20, 20, 20))->add_instance();
|
||||||
|
|
||||||
|
Calib_Params params;
|
||||||
|
params.mode = CalibMode::Calib_PA_Pattern;
|
||||||
|
|
||||||
|
PaPatternProbe pattern(params, config, /* is_bbl_machine */ true, *model.objects.front(), Vec3d(0, 0, 0));
|
||||||
|
|
||||||
|
REQUIRE(pattern.line_width() > 0.);
|
||||||
|
REQUIRE(pattern.line_width_first_layer() > 0.);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user