diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index 4b3e05df8d..8e439731a2 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -756,6 +756,16 @@ Vec3d CalibPressureAdvancePattern::get_start_offset() 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 { // TODO: FIXME: find out current filament/extruder? diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp index cbac1d3f86..02b5c0695f 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -312,15 +312,10 @@ public: protected: // todo multi_extruders: - double speed_first_layer() const { return m_config.option("initial_layer_speed")->value; }; - double speed_perimeter() const { return m_config.option("outer_wall_speed")->value; }; - double accel_perimeter() const { return m_config.option("outer_wall_acceleration")->value; } - double line_width_first_layer() const - { - // TODO: FIXME: find out current filament/extruder? - const double nozzle_diameter = m_config.opt_float("nozzle_diameter", 0); - return m_config.get_abs_value("initial_layer_line_width", nozzle_diameter); - }; + 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 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() const; int wall_count() const { return m_config.option("wall_loops")->value; }; diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 9679168cf3..ee0f35b955 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -7,6 +7,7 @@ add_executable(${_TEST_NAME}_tests test_appconfig.cpp test_arachne_walls.cpp test_bambu_networking.cpp + test_calib.cpp test_clipper_offset.cpp test_clipper_utils.cpp test_config.cpp diff --git a/tests/libslic3r/test_calib.cpp b/tests/libslic3r/test_calib.cpp new file mode 100644 index 0000000000..e72eb73e0d --- /dev/null +++ b/tests/libslic3r/test_calib.cpp @@ -0,0 +1,40 @@ +#include + +#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.); +}