GCodeAnalyzer: Fixed a crash when encountering an invalid toolchange

This commit is contained in:
Enrico Turri 2019-09-11 08:39:29 +02:00
parent a62bba2508
commit 44c3493f7d
3 changed files with 17 additions and 1 deletions

View file

@ -802,6 +802,11 @@ void GCode::_do_export(Print &print, FILE *file)
}
m_analyzer.set_extruder_offsets(extruder_offsets);
// send extruders count to analyzer to allow it to detect invalid extruder idxs
const ConfigOptionStrings* extruders_opt = dynamic_cast<const ConfigOptionStrings*>(print.config().option("extruder_colour"));
const ConfigOptionStrings* filamemts_opt = dynamic_cast<const ConfigOptionStrings*>(print.config().option("filament_colour"));
m_analyzer.set_extruders_count(std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size()));
// tell analyzer about the gcode flavor
m_analyzer.set_gcode_flavor(print.config().gcode_flavor);

View file

@ -107,6 +107,11 @@ void GCodeAnalyzer::set_extruder_offsets(const GCodeAnalyzer::ExtruderOffsetsMap
m_extruder_offsets = extruder_offsets;
}
void GCodeAnalyzer::set_extruders_count(unsigned int count)
{
m_extruders_count = count;
}
void GCodeAnalyzer::set_gcode_flavor(const GCodeFlavor& flavor)
{
m_gcode_flavor = flavor;
@ -131,6 +136,7 @@ void GCodeAnalyzer::reset()
m_moves_map.clear();
m_extruder_offsets.clear();
m_extruders_count = 1;
}
const std::string& GCodeAnalyzer::process_gcode(const std::string& gcode)
@ -520,7 +526,10 @@ void GCodeAnalyzer::_processT(const std::string& cmd)
unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10);
if (_get_extruder_id() != id)
{
_set_extruder_id(id);
if (id >= m_extruders_count)
BOOST_LOG_TRIVIAL(error) << "GCodeAnalyzer encountered an invalid toolchange, maybe from a custom gcode.";
else
_set_extruder_id(id);
// stores tool change move
_store_move(GCodeMove::Tool_change);

View file

@ -108,6 +108,7 @@ private:
GCodeReader m_parser;
TypeToMovesMap m_moves_map;
ExtruderOffsetsMap m_extruder_offsets;
unsigned int m_extruders_count;
GCodeFlavor m_gcode_flavor;
// The output of process_layer()
@ -117,6 +118,7 @@ public:
GCodeAnalyzer();
void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets);
void set_extruders_count(unsigned int count);
void set_gcode_flavor(const GCodeFlavor& flavor);