From d55aced0b4f8f08a61c94766250962afd6f3ca9f Mon Sep 17 00:00:00 2001 From: "qing.zhang" Date: Fri, 29 Nov 2024 16:06:00 +0800 Subject: [PATCH] ENH: get most used extruder id Jira: none Signed-off-by: qing.zhang Change-Id: I9c498cefb07b3bdf89a17bfd75a3075c2294c934 (cherry picked from commit e0508a9e5136cec6ba69cc8a4d186079802f841a) --- src/libslic3r/GCode.cpp | 20 ++++++++++++++++++++ src/libslic3r/GCode/ToolOrdering.cpp | 21 +++++++++++++++++++++ src/libslic3r/GCode/ToolOrdering.hpp | 1 + 3 files changed, 42 insertions(+) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 29d3d42a31..47de2563fa 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2148,6 +2148,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato std::vector print_object_instances_ordering; std::vector::const_iterator print_object_instance_sequential_active; + std::vector extruder_count; if (print.config().print_sequence == PrintSequence::ByObject) { // Order object instances for sequential print. print_object_instances_ordering = sort_object_instances_by_model_order(print); @@ -2156,6 +2157,14 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato print_object_instance_sequential_active = print_object_instances_ordering.begin(); 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 + std::vector object_extruder_count = tool_ordering.cal_most_used_extruder(print.config()); + if (extruder_count.empty()) + extruder_count = object_extruder_count; + else + for (size_t extruder_id = 0; extruder_id < object_extruder_count.size(); extruder_id++) + 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)) { //BBS: try to find the non-support filament extruder if is multi color and initial_extruder is support filament @@ -2197,6 +2206,7 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Find tool ordering for all the objects at once, and the initial extruder ID. // If the tool ordering has been pre-calculated by Print class for wipe tower already, reuse it. tool_ordering = print.tool_ordering(); + extruder_count = tool_ordering.cal_most_used_extruder(print.config()); tool_ordering.assign_custom_gcodes(print); if (tool_ordering.all_extruders().empty()) // No object to print was found, cancel the G-code export. @@ -2275,6 +2285,16 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Update output variables after the extruders were initialized. m_placeholder_parser_integration.init(m_writer); + + //set key for most used extruder + //count most used extruder + int max_count_extruder = 0; + for (int extruder_id = 1; extruder_id < extruder_count.size(); extruder_id++) { + if (extruder_count[extruder_id] >= extruder_count[max_count_extruder]) + max_count_extruder = extruder_id; + } + + this->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. this->placeholder_parser().set("initial_tool", initial_extruder_id); this->placeholder_parser().set("initial_extruder", initial_extruder_id); diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index 10cb2f6d17..571cbf29a1 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -898,6 +898,27 @@ void ToolOrdering::collect_extruder_statistics(bool prime_multi_material) } } +std::vector ToolOrdering::cal_most_used_extruder(const PrintConfig &config) +{ + // record + std::vector extruder_count; + extruder_count.resize(config.nozzle_diameter.size(), 0); + for (LayerTools &layer_tools : m_layer_tools) { + std::vector filaments = layer_tools.extruders; + std::set layer_extruder_count; + //count once only + for (unsigned int &filament : filaments) { + layer_extruder_count.insert(config.filament_map.values[filament] - 1); + } + + //record + for (int extruder_id : layer_extruder_count) { + extruder_count[extruder_id]++; + } + } + return extruder_count; +} + 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 55e2d1cb84..d343f2a701 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -248,6 +248,7 @@ public: // should be called after doing reorder FilamentChangeStats get_filament_change_stats(FilamentChangeMode mode); + std::vector cal_most_used_extruder(const PrintConfig &config); private: void initialize_layers(std::vector &zs);