From 205cb02efafa2880f63378b5abea7eecbdd853b9 Mon Sep 17 00:00:00 2001 From: Joseph Lenox Date: Sat, 30 Mar 2019 13:02:54 -0500 Subject: [PATCH] Restrict speed setting to fixed-point output with 3 decimal places. Includes test. Fixes #4769 --- src/test/libslic3r/test_gcodewriter.cpp | 27 +++++++++++++++++++++++++ xs/src/libslic3r/GCodeWriter.cpp | 3 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/test/libslic3r/test_gcodewriter.cpp b/src/test/libslic3r/test_gcodewriter.cpp index 5f770a6a4..d69e32acd 100644 --- a/src/test/libslic3r/test_gcodewriter.cpp +++ b/src/test/libslic3r/test_gcodewriter.cpp @@ -98,3 +98,30 @@ SCENARIO("lift() is not ignored after unlift() at normal values of Z") { } } } + +SCENARIO("set_speed emits values with fixed-point output.") { + + GIVEN("GCodeWriter instance") { + GCodeWriter writer; + WHEN("set_speed is called to set speed to 1.09321e+06") { + THEN("Output string is G1 F1093210.000") { + REQUIRE_THAT(writer.set_speed(1.09321e+06), Catch::Equals("G1 F1093210.000\n")); + } + } + WHEN("set_speed is called to set speed to 1") { + THEN("Output string is G1 F1.000") { + REQUIRE_THAT(writer.set_speed(1.0), Catch::Equals("G1 F1.000\n")); + } + } + WHEN("set_speed is called to set speed to 203.200022") { + THEN("Output string is G1 F203.200") { + REQUIRE_THAT(writer.set_speed(203.200022), Catch::Equals("G1 F203.200\n")); + } + } + WHEN("set_speed is called to set speed to 203.200522") { + THEN("Output string is G1 F203.200") { + REQUIRE_THAT(writer.set_speed(203.200522), Catch::Equals("G1 F203.201\n")); + } + } + } +} diff --git a/xs/src/libslic3r/GCodeWriter.cpp b/xs/src/libslic3r/GCodeWriter.cpp index 2bae7cbf9..8e666fadc 100644 --- a/xs/src/libslic3r/GCodeWriter.cpp +++ b/xs/src/libslic3r/GCodeWriter.cpp @@ -309,7 +309,8 @@ GCodeWriter::set_speed(double F, const std::string &comment, const std::string &cooling_marker) const { std::ostringstream gcode; - gcode << "G1 F" << F; + gcode.precision(3); + gcode << "G1 F" << std::fixed << F; COMMENT(comment); gcode << cooling_marker; gcode << "\n";