diff --git a/src/libslic3r/Extruder.hpp b/src/libslic3r/Extruder.hpp index aa33891eee..d5066f91ec 100644 --- a/src/libslic3r/Extruder.hpp +++ b/src/libslic3r/Extruder.hpp @@ -22,9 +22,8 @@ public: } else { m_E = 0; m_retracted = 0; - m_restart_extra = 0; } - + m_restart_extra = 0; m_absolute_E = 0; } @@ -34,7 +33,7 @@ public: double retract(double length, double restart_extra); double unretract(); double E() const { return m_share_extruder ? m_share_E : m_E; } - void reset_E() { m_E = 0.; m_share_E = 0.; } + void reset_E() { reset(); } double e_per_mm(double mm3_per_mm) const { return mm3_per_mm * m_e_per_mm3; } double e_per_mm3() const { return m_e_per_mm3; } // Used filament volume in mm^3. diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 08c806a581..9fc63f63be 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -213,7 +213,7 @@ public: std::string travel_to(const Point& point, ExtrusionRole role, std::string comment); bool needs_retraction(const Polyline& travel, ExtrusionRole role, LiftType& lift_type); - std::string retract(bool toolchange = false, bool is_last_retraction = false, LiftType lift_type = LiftType::SpiralLift); + std::string retract(bool toolchange = false, bool is_last_retraction = false, LiftType lift_type = LiftType::NormalLift); std::string unretract() { return m_writer.unlift() + m_writer.unretract(); } std::string set_extruder(unsigned int extruder_id, double print_z); bool is_BBL_Printer(); diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index d93a8af119..76ac289ae7 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -320,7 +320,7 @@ std::string GCodeWriter::reset_e(bool force) return ""; if (m_extruder != nullptr) { - if (m_extruder->E() == 0. && ! force) + if (is_zero(m_extruder->E()) && ! force) return ""; m_extruder->reset_E(); } @@ -709,7 +709,7 @@ std::string GCodeWriter::_retract(double length, double restart_extra, const std length = 1; std::string gcode; - if (double dE = m_extruder->retract(length, restart_extra); dE != 0) { + if (double dE = m_extruder->retract(length, restart_extra); !is_zero(dE)) { if (this->config.use_firmware_retraction) { gcode = FLAVOR_IS(gcfMachinekit) ? "G22 ; retract\n" : "G10 ; retract\n"; } @@ -737,7 +737,7 @@ std::string GCodeWriter::unretract() if (FLAVOR_IS(gcfMakerWare)) gcode = "M101 ; extruder on\n"; - if (double dE = m_extruder->unretract(); dE != 0) { + if (double dE = m_extruder->unretract(); !is_zero(dE)) { if (this->config.use_firmware_retraction) { gcode += FLAVOR_IS(gcfMachinekit) ? "G23 ; unretract\n" : "G11 ; unretract\n"; gcode += this->reset_e(); diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index ea218dced5..fa59415d4f 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -278,6 +278,12 @@ constexpr inline T sqr(T x) return x * x; } +template constexpr +inline bool is_zero(Number value) +{ + return std::fabs(double(value)) < 1e-6; +} + template constexpr inline T lerp(const T& a, const T& b, Number t) {