diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 97da766c9..819dcc56e 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -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); diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp index b28aa558e..89cf9924f 100644 --- a/src/libslic3r/GCode/Analyzer.cpp +++ b/src/libslic3r/GCode/Analyzer.cpp @@ -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); diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp index 47f4e92aa..0372d9da7 100644 --- a/src/libslic3r/GCode/Analyzer.hpp +++ b/src/libslic3r/GCode/Analyzer.hpp @@ -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);