Fix of #6336 #5073: Throw an error if G92 E0 is missing in layer change

G-code with relative extruder addressing. Also thrown an error,
if G92 E0 is used with absolute extruder addressing.
This commit is contained in:
Vojtech Bubnik 2022-01-31 10:18:34 +01:00
parent de8ba0e850
commit 58d64bae77

View File

@ -22,6 +22,7 @@
#include <boost/filesystem/path.hpp>
#include <boost/format.hpp>
#include <boost/log/trivial.hpp>
#include <boost/regex.hpp>
// Mark string for localization and translate.
#define L(s) Slic3r::I18N::translate(s)
@ -438,7 +439,8 @@ static inline bool sequential_print_vertical_clearance_valid(const Print &print)
return it == print_instances_ordered.end() || (*it)->print_object->height() <= scale_(print.config().extruder_clearance_height.value);
}
// Matches "G92 E0" with various forms of writing the zero and with an optional comment.
boost::regex regex_g92e0 { "^[ \\t]*[gG]92[ \\t]*[eE](0(\\.0*)?|\\.0+)[ \\t]*(;.*)?$" };
// Precondition: Print::validate() requires the Print::apply() to be called its invocation.
std::string Print::validate(std::string* warning) const
@ -652,6 +654,18 @@ std::string Print::validate(std::string* warning) const
return err_msg;
}
}
{
bool before_layer_gcode_resets_extruder = boost::regex_search(m_config.before_layer_gcode.value, regex_g92e0);
bool layer_gcode_resets_extruder = boost::regex_search(m_config.layer_gcode.value, regex_g92e0);
if (m_config.use_relative_e_distances) {
// See GH issues #6336 #5073
if (! before_layer_gcode_resets_extruder && ! layer_gcode_resets_extruder)
return "Relative extruder addressing requires resetting the extruder position at each layer to prevent loss of floating point accuracy. Add \"G92 E0\" to layer_gcode.";
} else if (before_layer_gcode_resets_extruder)
return "\"G92 E0\" was found in before_layer_gcode, which is incompatible with absolute extruder addressing.";
else if (layer_gcode_resets_extruder)
return "\"G92 E0\" was found in layer_gcode, which is incompatible with absolute extruder addressing.";
}
return std::string();
}