diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index eafe66a086..8e47615405 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1774,7 +1774,7 @@ namespace ProcessLayer const CustomGCode::Item *custom_gcode, // ID of the first extruder printing this layer. unsigned int first_extruder_id, - bool single_material_print) + bool single_extruder_printer) { std::string gcode; @@ -1782,31 +1782,39 @@ namespace ProcessLayer // Extruder switches are processed by LayerTools, they should be filtered out. assert(custom_gcode->gcode != ToolChangeCode); - const std::string &custom_code = custom_gcode->gcode; + const std::string &custom_code = custom_gcode->gcode; + bool color_change = custom_code == ColorChangeCode; + bool tool_change = custom_code == ToolChangeCode; + // 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 (custom_code == ColorChangeCode && custom_gcode->extruder > 0) + if (color_change && custom_gcode->extruder > 0) m600_extruder_before_layer = custom_gcode->extruder - 1; else if (custom_code == PausePrintCode) pause_print_msg = custom_gcode->color; - // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count - if (custom_code == ColorChangeCode) // color change + // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count + if (color_change || tool_change) { + // Color Change or Tool Change as Color Change. // add tag for analyzer gcode += "; " + GCodeAnalyzer::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n"; // add tag for time estimator gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n"; - if (!single_material_print && m600_extruder_before_layer >= 0 && first_extruder_id != m600_extruder_before_layer + if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != m600_extruder_before_layer // && !MMU1 ) { //! FIXME_in_fw show message during print pause gcode += "M601\n"; // pause print gcode += "M117 Change filament for Extruder " + std::to_string(m600_extruder_before_layer) + "\n"; } - else - gcode += custom_code + "\n"; + else { + gcode += ColorChangeCode; + gcode += "\n"; + } } else { diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index f5ff33e412..db7c58a9ce 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -130,7 +130,8 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool // Do it only if all the objects were configured to be printed with a single extruder. std::vector> per_layer_extruder_switches; if (auto num_extruders = unsigned(print.config().nozzle_diameter.size()); - num_extruders > 1 && print.object_extruders().size() == 1) { + num_extruders > 1 && print.object_extruders().size() == 1 && // the current Print's configuration is CustomGCode::MultiAsSingle + print.model().custom_gcode_per_print_z.mode == CustomGCode::MultiAsSingle) { // Printing a single extruder platter on a printer with more than 1 extruder (or single-extruder multi-material). // There may be custom per-layer tool changes available at the model. per_layer_extruder_switches = custom_tool_changes(print.model().custom_gcode_per_print_z, num_extruders); @@ -466,11 +467,19 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) if (custom_gcode_per_print_z.gcodes.empty()) return; - unsigned int num_extruders = *std::max_element(m_all_printing_extruders.begin(), m_all_printing_extruders.end()) + 1; - std::vector extruder_printing_above(num_extruders, false); - auto custom_gcode_it = custom_gcode_per_print_z.gcodes.rbegin(); + auto num_extruders = unsigned(print.config().nozzle_diameter.size()); + CustomGCode::Mode mode = + (num_extruders == 1) ? CustomGCode::SingleExtruder : + print.object_extruders().size() == 1 ? CustomGCode::MultiAsSingle : CustomGCode::MultiExtruder; + CustomGCode::Mode model_mode = print.model().custom_gcode_per_print_z.mode; + std::vector extruder_printing_above(num_extruders, false); + auto custom_gcode_it = custom_gcode_per_print_z.gcodes.rbegin(); + // Tool changes and color changes will be ignored, if the model's tool/color changes were entered in mm mode and the print is in non mm mode + // or vice versa. + bool ignore_tool_and_color_changes = (mode == CustomGCode::MultiExtruder) != (model_mode == CustomGCode::MultiExtruder); // If printing on a single extruder machine, make the tool changes trigger color change (M600) events. - bool tool_changes_as_color_changes = num_extruders == 1; + bool tool_changes_as_color_changes = mode == CustomGCode::SingleExtruder && model_mode == CustomGCode::MultiAsSingle; + // From the last layer to the first one: for (auto it_lt = m_layer_tools.rbegin(); it_lt != m_layer_tools.rend(); ++ it_lt) { LayerTools < = *it_lt; @@ -490,9 +499,16 @@ void ToolOrdering::assign_custom_gcodes(const Print &print) print_z_below = it_lt_below->print_z; if (custom_gcode.print_z > print_z_below + 0.5 * EPSILON) { // The custom G-code applies to the current layer. - if ( tool_changes_as_color_changes || custom_gcode.gcode != ColorChangeCode || - (custom_gcode.extruder <= int(num_extruders) && extruder_printing_above[unsigned(custom_gcode.extruder - 1)])) + bool color_change = custom_gcode.gcode == ColorChangeCode; + bool tool_change = custom_gcode.gcode == ToolChangeCode; + bool pause_or_custom_gcode = ! color_change && ! tool_change; + bool apply_color_change = ! ignore_tool_and_color_changes && // If it is color change, it will actually be useful as the exturder above will print. + (color_change ? + mode == CustomGCode::SingleExtruder || + (custom_gcode.extruder <= int(num_extruders) && extruder_printing_above[unsigned(custom_gcode.extruder - 1)]) : + tool_change && tool_changes_as_color_changes); + if (pause_or_custom_gcode || apply_color_change) lt.custom_gcode = &custom_gcode; // Consume that custom G-code event. ++ custom_gcode_it; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 3f8fd9b40c..6f61657a52 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -709,7 +709,11 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ model_object_status.emplace(model_object->id(), ModelObjectStatus::New); } else { if (m_model.custom_gcode_per_print_z != model.custom_gcode_per_print_z) { - update_apply_status(custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes) ? + update_apply_status(num_extruders_changed || + // Tool change G-codes are applied as color changes for a single extruder printer, no need to invalidate tool ordering. + //FIXME The tool ordering may be invalidated unnecessarily if the custom_gcode_per_print_z.mode is not applicable + // to the active print / model state, and then it is reset, so it is being applicable, but empty, thus the effect is the same. + (num_extruders > 1 && custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes)) ? // The Tool Ordering and the Wipe Tower are no more valid. this->invalidate_steps({ psWipeTower, psGCodeExport }) : // There is no change in Tool Changes stored in custom_gcode_per_print_z, therefore there is no need to update Tool Ordering. diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 4096e99c43..fd6b96f06b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5100,7 +5100,7 @@ void GLCanvas3D::_render_overlays() const #if ENABLE_SHOW_SCENE_LABELS const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); - bool sequential_print = (opt != nullptr) ? m_config->opt_bool("complete_objects") : false; + bool sequential_print = opt != nullptr && opt->value; std::vector sorted_instances; if (sequential_print) { const Print* print = fff_print();