diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 1997bed92..dfdcd226d 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1859,6 +1859,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); @@ -1867,6 +1868,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 @@ -1914,6 +1923,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. @@ -1989,6 +1999,15 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato file.write(m_writer.set_additional_fan(0)); } + //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; + } + + 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("initial_tool", initial_extruder_id); m_placeholder_parser.set("initial_extruder", initial_extruder_id); diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index fe61df89f..b78dd3ed9 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -876,6 +876,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 8a5baf1a8..3580c49fa 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);