From cfa669c2cbb7d3089bb5bfbedeb6dee22381d0ec Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Thu, 5 Dec 2024 12:23:20 +0800 Subject: [PATCH] FIX: pre cooling crash with change gcode jira:NONE Signed-off-by: xun.zhang Change-Id: I26a1d7ef1114c2c3aaa2bb95465da3d5b15c3a90 (cherry picked from commit c4beb3887366965ad653661da1a7c361b3426bf8) --- src/libslic3r/GCode/GCodeProcessor.cpp | 42 ++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 535c734fa..d84d1d9aa 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -858,6 +858,24 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st filament_blocks.emplace_back(fid, line_id, -1); } } + else if (GCodeReader::GCodeLine::cmd_start_with(gcode_line, "M1020")) { + size_t s_pos = gcode_line.find('S'); + if (s_pos != std::string::npos) { + std::istringstream str(gcode_line.substr(s_pos + 1)); // skip white spaces and T + int fid; + str >> fid; + if (!str.fail() && 0 <= fid && fid < 255) { + // skip the filaments change in machine start/end gcode + if (machine_start_gcode_end_line_id == (unsigned int)(-1) && line_idmachine_end_gcode_start_line_id) + return; + + if (!filament_blocks.empty()) + filament_blocks.back().upper_gcode_id = line_id; + filament_blocks.emplace_back(fid, line_id, -1); + } + } + } else if (GCodeReader::GCodeLine::cmd_start_with(gcode_line, (std::string(";") + reserved_tag(ETags::NozzleChangeStart)).c_str())) { int prev_filament{ -1 }, next_filament{ -1 }, extruder_id{ -1 }; handle_nozzle_change_line(gcode_line, prev_filament, next_filament, extruder_id); @@ -939,10 +957,28 @@ void GCodeProcessor::TimeProcessor::post_process(const std::string& filename, st } // After traversing the G-code, the first and last extruder blocks still have uncompleted initialization steps - if (!extruder_blocks.empty() && !filament_blocks.empty()) { - extruder_blocks.front().initialize_step_1(context.filament_maps[filament_blocks.front().filament_id], machine_start_gcode_end_line_id, filament_blocks.front().filament_id); + if (!extruder_blocks.empty()) { + int first_filament = -1; + int last_filament = -1; + + if (!filament_blocks.empty()) { + first_filament = filament_blocks.front().filament_id; + last_filament = filament_blocks.back().filament_id; + } + else { + if (extruder_blocks.size() == 1) { + // only with a dummy extruder block, we can't find any available filament + first_filament = 0; + last_filament = 0; + } + else { + first_filament = extruder_blocks.front().end_filament; + last_filament = extruder_blocks.back().start_filament; + } + } + extruder_blocks.front().initialize_step_1(context.filament_maps[first_filament], machine_start_gcode_end_line_id, first_filament); extruder_blocks.back().initialize_step_2(machine_end_gcode_start_line_id); - extruder_blocks.back().initialize_step_3(machine_end_gcode_start_line_id,filament_blocks.back().filament_id,machine_end_gcode_start_line_id); + extruder_blocks.back().initialize_step_3(machine_end_gcode_start_line_id,last_filament,machine_end_gcode_start_line_id); } for (auto& block : extruder_blocks)