From ff3612840c2d84e01ddc9b3fd72c11232fcefff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hejl?= Date: Thu, 25 Jan 2024 16:12:01 +0100 Subject: [PATCH] SPE-2098: Pass color_change_extruder also into Color Change G-code. Some minor refactoring of ProcessLayer::emit_custom_gcode_per_print_z(); --- src/libslic3r/GCode.cpp | 65 ++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 36 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 583281dddd..769cfe37f6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1916,66 +1916,59 @@ namespace ProcessLayer // Extruder switches are processed by LayerTools, they should be filtered out. assert(custom_gcode->type != CustomGCode::ToolChange); - CustomGCode::Type gcode_type = custom_gcode->type; - bool color_change = gcode_type == CustomGCode::ColorChange; - bool tool_change = gcode_type == CustomGCode::ToolChange; + CustomGCode::Type gcode_type = custom_gcode->type; + const bool color_change = gcode_type == CustomGCode::ColorChange; + const bool tool_change = gcode_type == CustomGCode::ToolChange; // Tool Change is applied as Color Change for a single extruder printer only. - assert(! tool_change || single_extruder_printer); - - std::string pause_print_msg; - int m600_extruder_before_layer = -1; - if (color_change && custom_gcode->extruder > 0) - m600_extruder_before_layer = custom_gcode->extruder - 1; - else if (gcode_type == CustomGCode::PausePrint) - pause_print_msg = custom_gcode->extra; + assert(!tool_change || single_extruder_printer); // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count - if (color_change || tool_change) - { - assert(m600_extruder_before_layer >= 0); + if (color_change || tool_change) { + int color_change_extruder = -1; + if (color_change && custom_gcode->extruder > 0) + color_change_extruder = custom_gcode->extruder - 1; + + assert(color_change_extruder >= 0); // Color Change or Tool Change as Color Change. // add tag for processor - gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Color_Change) + ",T" + std::to_string(m600_extruder_before_layer) + "," + custom_gcode->color + "\n"; + gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Color_Change) + ",T" + std::to_string(color_change_extruder) + "," + custom_gcode->color + "\n"; - if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != (unsigned)m600_extruder_before_layer - // && !MMU1 - ) { + DynamicConfig cfg; + cfg.set_key_value("color_change_extruder", new ConfigOptionInt(color_change_extruder)); + if (!single_extruder_printer && color_change_extruder >= 0 && first_extruder_id != unsigned(color_change_extruder)) { //! FIXME_in_fw show message during print pause - // FIXME: Why is pause_print_gcode here? Why is it supplied "color_change_extruder"? Why is that not - // passed to color_change_gcode below? - DynamicConfig cfg; - cfg.set_key_value("color_change_extruder", new ConfigOptionInt(m600_extruder_before_layer)); + // FIXME: Why is pause_print_gcode here? Why is it supplied "color_change_extruder"? gcode += gcodegen.placeholder_parser_process("pause_print_gcode", config.pause_print_gcode, current_extruder_id, &cfg); gcode += "\n"; - gcode += "M117 Change filament for Extruder " + std::to_string(m600_extruder_before_layer) + "\n"; - } - else { - gcode += gcodegen.placeholder_parser_process("color_change_gcode", config.color_change_gcode, current_extruder_id); + gcode += "M117 Change filament for Extruder " + std::to_string(color_change_extruder) + "\n"; + } else { + gcode += gcodegen.placeholder_parser_process("color_change_gcode", config.color_change_gcode, current_extruder_id, &cfg); gcode += "\n"; //FIXME Tell G-code writer that M600 filled the extruder, thus the G-code writer shall reset the extruder to unretracted state after // return from M600. Thus the G-code generated by the following line is ignored. // see GH issue #6362 gcodegen.writer().unretract(); } - } - else { - if (gcode_type == CustomGCode::PausePrint) // Pause print - { + } else { + if (gcode_type == CustomGCode::PausePrint) { // Pause print + const std::string pause_print_msg = custom_gcode->extra; + // add tag for processor gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Pause_Print) + "\n"; //! FIXME_in_fw show message during print pause - if (!pause_print_msg.empty()) - gcode += "M117 " + pause_print_msg + "\n"; - gcode += gcodegen.placeholder_parser_process("pause_print_gcode", config.pause_print_gcode, current_extruder_id); - } - else { + if (!pause_print_msg.empty()) + gcode += "M117 " + pause_print_msg + "\n"; + + DynamicConfig cfg; + cfg.set_key_value("color_change_extruder", new ConfigOptionInt(int(current_extruder_id))); + gcode += gcodegen.placeholder_parser_process("pause_print_gcode", config.pause_print_gcode, current_extruder_id, &cfg); + } else { // add tag for processor gcode += ";" + GCodeProcessor::reserved_tag(GCodeProcessor::ETags::Custom_Code) + "\n"; if (gcode_type == CustomGCode::Template) // Template Custom Gcode gcode += gcodegen.placeholder_parser_process("template_custom_gcode", config.template_custom_gcode, current_extruder_id); else // custom Gcode gcode += custom_gcode->extra; - } gcode += "\n"; }