diff options
author | Lukáš Hejl <hejl.lukas@gmail.com> | 2022-08-19 13:14:45 +0300 |
---|---|---|
committer | Lukáš Hejl <hejl.lukas@gmail.com> | 2022-08-19 16:07:11 +0300 |
commit | 8c0db761c11cf7374ace8403d5001d17dc239cd7 (patch) | |
tree | 3fb078513dc7809d03860fe32f6ebe400d50f3b0 | |
parent | f95a6e3d33364478987d2f5af1238f74959c60cc (diff) |
Fix #8716, #8717, and #8718: The pressure equalizer was producing a malformed GCode that caused underextrusion.
-rw-r--r-- | src/libslic3r/GCode/PressureEqualizer.cpp | 25 | ||||
-rw-r--r-- | src/libslic3r/GCode/PressureEqualizer.hpp | 2 |
2 files changed, 20 insertions, 7 deletions
diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index b173cb684..7135c0a5c 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -669,17 +669,32 @@ inline void PressureEqualizer::push_to_output(const char *text, const size_t len output_buffer[output_buffer_length] = 0; } -inline bool PressureEqualizer::is_just_feedrate_provided(const GCodeLine &line) +inline bool is_just_line_with_extrude_set_speed_tag(const std::string &line) { - return line.pos_provided[4] && !line.pos_provided[0] && !line.pos_provided[1] && !line.pos_provided[2] && !line.pos_provided[3]; + if (line.empty() && !boost::starts_with(line, "G1 ") && !boost::ends_with(line, EXTRUDE_SET_SPEED_TAG)) + return false; + + const char *p_line = line.data() + 3; + const char *const line_end = line.data() + line.length() - 1; + while (!is_eol(*p_line)) { + if (toupper(*p_line++) == 'F') + break; + else + return false; + } + parse_float(p_line, line_end - p_line); + eatws(p_line); + p_line += EXTRUDE_SET_SPEED_TAG.length(); + return p_line <= line_end && is_eol(*p_line); } void PressureEqualizer::push_line_to_output(const size_t line_idx, const float new_feedrate, const char *comment) { const GCodeLine &line = this->m_gcode_lines[line_idx]; - if (line_idx > 0) { - const GCodeLine &prev_line = this->m_gcode_lines[line_idx - 1]; - if (prev_line.extrude_set_speed_tag && this->is_just_feedrate_provided(prev_line)) + if (line_idx > 0 && output_buffer_length > 0) { + const std::string prev_line_str = std::string(output_buffer.begin() + int(this->output_buffer_prev_length), + output_buffer.begin() + int(this->output_buffer_length) + 1); + if (is_just_line_with_extrude_set_speed_tag(prev_line_str)) this->output_buffer_length = this->output_buffer_prev_length; // Remove the last line because it only sets the speed for an empty block of g-code lines, so it is useless. else push_to_output(EXTRUDE_END_TAG.data(), EXTRUDE_END_TAG.length(), true); diff --git a/src/libslic3r/GCode/PressureEqualizer.hpp b/src/libslic3r/GCode/PressureEqualizer.hpp index 068b01df4..d6b7f2a4f 100644 --- a/src/libslic3r/GCode/PressureEqualizer.hpp +++ b/src/libslic3r/GCode/PressureEqualizer.hpp @@ -193,8 +193,6 @@ private: // Push a G-code line to the output. void push_line_to_output(size_t line_idx, float new_feedrate, const char *comment); - inline bool is_just_feedrate_provided(const GCodeLine &line); - public: std::queue<LayerResult*> m_layer_results; |