From 666e49e2990cfb8a8855dd80c81c85688d5a0f02 Mon Sep 17 00:00:00 2001 From: "qing.zhang" Date: Mon, 2 Dec 2024 14:48:27 +0800 Subject: [PATCH] ENH: get first filaments & non support filament Jira: none Signed-off-by: qing.zhang Change-Id: I9370e48b634f21a2d3fd11d437f699b5cdb5ce43 --- src/libslic3r/GCode.cpp | 82 ++++++++-------------------- src/libslic3r/GCode/ToolOrdering.cpp | 59 ++++++++++++++++++++ src/libslic3r/GCode/ToolOrdering.hpp | 6 ++ 3 files changed, 88 insertions(+), 59 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index dfdcd226d..15f0796b6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1852,20 +1852,28 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato ToolOrdering tool_ordering; unsigned int initial_extruder_id = (unsigned int)-1; //BBS: first non-support filament extruder - unsigned int initial_non_support_extruder_id; + unsigned int initial_non_support_extruder_id = (unsigned int) -1; unsigned int final_extruder_id = (unsigned int)-1; bool has_wipe_tower = false; print.m_statistics_by_extruder_count.clear(); - + std::vector first_filaments; + std::vector first_non_support_filaments; std::vector print_object_instances_ordering; std::vector::const_iterator print_object_instance_sequential_active; std::vector extruder_count; + std::vector::const_iterator first_has_extrude_print_object; + //resize + first_non_support_filaments.resize(print.config().nozzle_diameter.size(), -1); + first_filaments.resize(print.config().nozzle_diameter.size(), -1); + if (print.config().print_sequence == PrintSequence::ByObject) { // Order object instances for sequential print. print_object_instances_ordering = sort_object_instances_by_model_order(print); // print_object_instances_ordering = sort_object_instances_by_max_z(print); // Find the 1st printing object, find its tool ordering and the initial extruder ID. print_object_instance_sequential_active = print_object_instances_ordering.begin(); + first_has_extrude_print_object = print_object_instance_sequential_active; + bool find_fist_non_support_filament = false; for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) { tool_ordering = ToolOrdering(*(*print_object_instance_sequential_active)->print_object, initial_extruder_id); //get extruder count @@ -1877,38 +1885,14 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato extruder_count[extruder_id] += object_extruder_count[extruder_id]; tool_ordering.sort_and_build_data(*(*print_object_instance_sequential_active)->print_object,initial_extruder_id); - if ((initial_extruder_id = tool_ordering.first_extruder()) != static_cast(-1)) { + if (!find_fist_non_support_filament && tool_ordering.first_extruder() != (unsigned int) -1) { //BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament - initial_non_support_extruder_id = initial_extruder_id; - if (tool_ordering.all_extruders().size() > 1 && print.config().filament_is_support.get_at(initial_extruder_id)) { - bool has_non_support_filament = false; - for (unsigned int extruder : tool_ordering.all_extruders()) { - if (!print.config().filament_is_support.get_at(extruder)) { - has_non_support_filament = true; - break; - } - } - //BBS: find the non-support filament extruder of object - if (has_non_support_filament) { - bool find_initial_non_support_filament = false; - for (LayerTools layer_tools : tool_ordering.layer_tools()) { - if (!layer_tools.has_object) - continue; - for (unsigned int extruder : layer_tools.extruders) { - if (print.config().filament_is_support.get_at(extruder)) - continue; - initial_non_support_extruder_id = extruder; - find_initial_non_support_filament = true; - break; - } - - if (find_initial_non_support_filament) - break; - } - } + if (initial_extruder_id == (unsigned int) -1) { + initial_extruder_id = tool_ordering.first_extruder(); + first_has_extrude_print_object = print_object_instance_sequential_active; } - break; + find_fist_non_support_filament = tool_ordering.cal_non_support_filaments(print.config(), initial_non_support_extruder_id, first_non_support_filaments, first_filaments); } } if (initial_extruder_id == static_cast(-1)) @@ -1941,34 +1925,9 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato #endif //BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament if (initial_extruder_id != static_cast(-1)) { - initial_non_support_extruder_id = initial_extruder_id; - if (tool_ordering.all_extruders().size() > 1 && print.config().filament_is_support.get_at(initial_extruder_id)) { - bool has_non_support_filament = false; - for (unsigned int extruder : tool_ordering.all_extruders()) { - if (!print.config().filament_is_support.get_at(extruder)) { - has_non_support_filament = true; - break; - } - } - //BBS: find the non-support filament extruder of object - if (has_non_support_filament){ - bool find_initial_non_support_filament = false; - for (LayerTools layer_tools : tool_ordering.layer_tools()) { - if (!layer_tools.has_object) - continue; - for (unsigned int extruder : layer_tools.extruders) { - if (print.config().filament_is_support.get_at(extruder)) - continue; - initial_non_support_extruder_id = extruder; - find_initial_non_support_filament = true; - break; - } - - if (find_initial_non_support_filament) - break; - } - } - } + // BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament + // check if has non support filaments + tool_ordering.cal_non_support_filaments(print.config(), initial_non_support_extruder_id, first_non_support_filaments, first_filaments); } // In non-sequential print, the printing extruders may have been modified by the extruder switches stored in Model::custom_gcode_per_print_z. @@ -2009,9 +1968,13 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_placeholder_parser.set("most_used_physical_extruder_id", print.config().physical_extruder_map.values[max_count_extruder]); // Let the start-up script prime the 1st printing tool. + m_placeholder_parser.set("first_tools", new ConfigOptionInts(first_filaments)); + m_placeholder_parser.set("first_filaments", new ConfigOptionInts(first_filaments)); m_placeholder_parser.set("initial_tool", initial_extruder_id); m_placeholder_parser.set("initial_extruder", initial_extruder_id); //BBS + m_placeholder_parser.set("first_non_support_tools", new ConfigOptionInts(first_non_support_filaments)); + m_placeholder_parser.set("first_non_support_filaments", new ConfigOptionInts(first_non_support_filaments)); m_placeholder_parser.set("initial_no_support_tool", initial_non_support_extruder_id); m_placeholder_parser.set("initial_no_support_extruder", initial_non_support_extruder_id); m_placeholder_parser.set("current_extruder", initial_extruder_id); @@ -2247,6 +2210,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Do all objects for each layer. if (print.config().print_sequence == PrintSequence::ByObject && !has_wipe_tower) { size_t finished_objects = 0; + print_object_instance_sequential_active = first_has_extrude_print_object; const PrintObject *prev_object = (*print_object_instance_sequential_active)->print_object; for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++print_object_instance_sequential_active) { const PrintObject &object = *(*print_object_instance_sequential_active)->print_object; diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index b78dd3ed9..a50e56d89 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -897,6 +897,65 @@ std::vector ToolOrdering::cal_most_used_extruder(const PrintConfig &config) return extruder_count; } +//BBS: find first non support filament +bool ToolOrdering::cal_non_support_filaments(const PrintConfig &config, + unsigned int & first_non_support_filament, + std::vector & initial_non_support_filaments, + std::vector & initial_filaments) +{ + int find_count = 0; + int find_first_filaments_count = 0; + bool has_non_support = has_non_support_filament(config); + for (const LayerTools &layer_tool : m_layer_tools) { + if (!layer_tool.has_object) + continue; + + for (const unsigned int &filament : layer_tool.extruders) { + //check first filament + if (!config.filament_map.values.empty() && initial_filaments[config.filament_map.values[filament] - 1] == -1) { + initial_filaments[config.filament_map.values[filament] - 1] = filament; + find_first_filaments_count++; + } + + if (has_non_support) { + // check first non support filaments + if (config.filament_is_support.get_at(filament)) + continue; + + if (first_non_support_filament == (unsigned int) -1) first_non_support_filament = filament; + + // params missing, add protection + // filament map missing means single nozzle, no need to set initial_non_support_filaments + if (config.filament_map.values.empty()) + return true; + + if (initial_non_support_filaments[config.filament_map.values[filament] - 1] == -1) { + initial_non_support_filaments[config.filament_map.values[filament] - 1] = filament; + find_count++; + } + + if (find_count == initial_non_support_filaments.size()) + return true; + } else if (find_first_filaments_count == initial_filaments.size() || config.filament_map.values.empty()){ + return false; + } + + } + } + + return false; +} + +bool ToolOrdering::has_non_support_filament(const PrintConfig &config) { + for (const unsigned int &filament : m_all_printing_extruders) { + if (!config.filament_is_support.get_at(filament)) { + return true; + } + } + + return false; +} + std::set, std::vector>> generate_combinations(const std::vector &extruders) { int n = extruders.size(); diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index 3580c49fa..51b6437a3 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -249,6 +249,12 @@ public: // should be called after doing reorder FilamentChangeStats get_filament_change_stats(FilamentChangeMode mode); std::vector cal_most_used_extruder(const PrintConfig &config); + bool cal_non_support_filaments(const PrintConfig &config, + unsigned int & first_non_support_filament, + std::vector & initial_non_support_filaments, + std::vector & initial_filaments); + + bool has_non_support_filament(const PrintConfig &config); private: void initialize_layers(std::vector &zs);