From e62bb4a7c7bc93c62ffb05a848fd63f862b5b633 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik <bubnikv@gmail.com> Date: Tue, 1 Dec 2020 08:23:46 +0100 Subject: [PATCH] Fix of Head crash on completion with sequential printing #5349 In addition to an existing "layer_z" placeholder variable, a new "max_layer_z" has been added to custom G-code sections accumulating maximum of "layer_z" over the print. This value may be used for example in the end G-code of a sequential print to lift the print head up before travel over the whole print bed. --- src/libslic3r/GCode.cpp | 20 ++++++++++++++------ src/libslic3r/GCode.hpp | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index ba391ab63..ee9f06687 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -360,6 +360,7 @@ namespace Slic3r { // Otherwise, leave control to the user completely. std::string toolchange_gcode_str; const std::string& toolchange_gcode = gcodegen.config().toolchange_gcode.value; +// m_max_layer_z = std::max(m_max_layer_z, tcr.print_z); if (! toolchange_gcode.empty()) { DynamicConfig config; int previous_extruder_id = gcodegen.writer().extruder() ? (int)gcodegen.writer().extruder()->id() : -1; @@ -367,6 +368,7 @@ namespace Slic3r { config.set_key_value("next_extruder", new ConfigOptionInt((int)new_extruder_id)); config.set_key_value("layer_num", new ConfigOptionInt(gcodegen.m_layer_index)); config.set_key_value("layer_z", new ConfigOptionFloat(tcr.print_z)); +// config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); toolchange_gcode_str = gcodegen.placeholder_parser_process("toolchange_gcode", toolchange_gcode, new_extruder_id, &config); check_add_eol(toolchange_gcode_str); } @@ -1011,11 +1013,12 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu DoExport::init_gcode_processor(print.config(), m_processor, m_silent_time_estimator_enabled); // resets analyzer's tracking data - m_last_height = 0.0f; - m_last_layer_z = 0.0f; + m_last_height = 0.f; + m_last_layer_z = 0.f; + m_max_layer_z = 0.f; #if ENABLE_GCODE_VIEWER_DATA_CHECKING - m_last_mm3_per_mm = 0.0; - m_last_width = 0.0f; + m_last_mm3_per_mm = 0.; + m_last_width = 0.f; #endif // ENABLE_GCODE_VIEWER_DATA_CHECKING // How many times will be change_layer() called? @@ -1376,6 +1379,7 @@ void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thu DynamicConfig config; config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); config.set_key_value("layer_z", new ConfigOptionFloat(m_writer.get_position()(2) - m_config.z_offset.value)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); if (print.config().single_extruder_multi_material) { // Process the end_filament_gcode for the active filament only. int extruder_id = m_writer.extruder()->id(); @@ -1877,13 +1881,15 @@ void GCode::process_layer( gcode += buf; // update caches m_last_layer_z = static_cast<float>(print_z); + m_max_layer_z = std::max(m_max_layer_z, m_last_layer_z); m_last_height = height; // Set new layer - this will change Z and force a retraction if retract_layer_change is enabled. if (! print.config().before_layer_gcode.value.empty()) { DynamicConfig config; - config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index + 1)); - config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index + 1)); + config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); gcode += this->placeholder_parser_process("before_layer_gcode", print.config().before_layer_gcode.value, m_writer.extruder()->id(), &config) + "\n"; @@ -1897,6 +1903,7 @@ void GCode::process_layer( gcode += this->placeholder_parser_process("layer_gcode", print.config().layer_gcode.value, m_writer.extruder()->id(), &config) + "\n"; + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); } if (! first_layer && ! m_second_layer_things_done) { @@ -2898,6 +2905,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z) config.set_key_value("next_extruder", new ConfigOptionInt((int)extruder_id)); config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); toolchange_gcode_parsed = placeholder_parser_process("toolchange_gcode", toolchange_gcode, extruder_id, &config); gcode += toolchange_gcode_parsed; check_add_eol(gcode); diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index aeac4fcf8..377b27381 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -351,6 +351,7 @@ private: // Support for G-Code Processor float m_last_height{ 0.0f }; float m_last_layer_z{ 0.0f }; + float m_max_layer_z{ 0.0f }; #if ENABLE_GCODE_VIEWER_DATA_CHECKING double m_last_mm3_per_mm; float m_last_width{ 0.0f };