diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index f2b046b78..e88f8f8a6 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2297,8 +2297,8 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato { // save the flush statitics stored in tool ordering by object print.m_statistics_by_extruder_count.stats_by_single_extruder += tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::SingleExt); - print.m_statistics_by_extruder_count.stats_by_multi_extruder_auto += tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtAuto); - print.m_statistics_by_extruder_count.stats_by_multi_extruder_manual += tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtManual); + print.m_statistics_by_extruder_count.stats_by_multi_extruder_best += tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtBest); + print.m_statistics_by_extruder_count.stats_by_multi_extruder_curr += tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtCurr); // save sorted filament sequences const auto& layer_tools = tool_ordering.layer_tools(); for (const auto& lt : layer_tools) @@ -2379,8 +2379,8 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato { //save the flush statitics stored in tool ordering print.m_statistics_by_extruder_count.stats_by_single_extruder = tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::SingleExt); - print.m_statistics_by_extruder_count.stats_by_multi_extruder_auto = tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtAuto); - print.m_statistics_by_extruder_count.stats_by_multi_extruder_manual = tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtManual); + print.m_statistics_by_extruder_count.stats_by_multi_extruder_best = tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtBest); + print.m_statistics_by_extruder_count.stats_by_multi_extruder_curr = tool_ordering.get_filament_change_stats(ToolOrdering::FilamentChangeMode::MultiExtCurr); // save sorted filament sequences const auto& layer_tools = tool_ordering.layer_tools(); for (const auto& lt : layer_tools) diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index b837b4be6..c42e11d41 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -1009,19 +1009,20 @@ float get_flush_volume(const std::vector &filament_maps, const std::vector< return flush_volume; } -std::vector ToolOrdering::get_recommended_filament_maps(const std::vector>& layer_filaments, const PrintConfig* print_config, const Print* print, const std::vector>&physical_unprintables,const std::vector>&geometric_unprintables) +std::vector ToolOrdering::get_recommended_filament_maps(const std::vector>& layer_filaments, const Print* print, const FilamentMapMode mode,const std::vector>&physical_unprintables,const std::vector>&geometric_unprintables) { using namespace FilamentGroupUtils; - if (!print_config || layer_filaments.empty()) + if (!print || layer_filaments.empty()) return std::vector(); - const unsigned int filament_nums = (unsigned int)(print_config->filament_colour.values.size() + EPSILON); + const auto& print_config = print->config(); + const unsigned int filament_nums = (unsigned int)(print_config.filament_colour.values.size() + EPSILON); // get flush matrix std::vector nozzle_flush_mtx; - size_t extruder_nums = print_config->nozzle_diameter.values.size(); + size_t extruder_nums = print_config.nozzle_diameter.values.size(); for (size_t nozzle_id = 0; nozzle_id < extruder_nums; ++nozzle_id) { - std::vector flush_matrix(cast(get_flush_volumes_matrix(print_config->flush_volumes_matrix.values, nozzle_id, extruder_nums))); + std::vector flush_matrix(cast(get_flush_volumes_matrix(print_config.flush_volumes_matrix.values, nozzle_id, extruder_nums))); std::vector> wipe_volumes; for (unsigned int i = 0; i < filament_nums; ++i) wipe_volumes.push_back(std::vector(flush_matrix.begin() + i * filament_nums, flush_matrix.begin() + (i + 1) * filament_nums)); @@ -1029,14 +1030,7 @@ std::vector ToolOrdering::get_recommended_filament_maps(const std::vector other_layers_seqs; - const ConfigOptionInts* other_layers_print_sequence_op = print_config->option("other_layers_print_sequence"); - const ConfigOptionInt* other_layers_print_sequence_nums_op = print_config->option("other_layers_print_sequence_nums"); - if (other_layers_print_sequence_op && other_layers_print_sequence_nums_op) { - const std::vector& print_sequence = other_layers_print_sequence_op->values; - int sequence_nums = other_layers_print_sequence_nums_op->value; - other_layers_seqs = get_other_layers_print_sequence(sequence_nums, print_sequence); - } + std::vector other_layers_seqs = get_other_layers_print_sequence(print_config.other_layers_print_sequence_nums.value, print_config.other_layers_print_sequence.values); // other_layers_seq: the layer_idx and extruder_idx are base on 1 auto get_custom_seq = [&other_layers_seqs](int layer_idx, std::vector& out_seq) -> bool { @@ -1053,18 +1047,18 @@ std::vector ToolOrdering::get_recommended_filament_maps(const std::vectorret(filament_nums, 0); // if mutli_extruder, calc group,otherwise set to 0 if (extruder_nums == 2) { - std::vector extruder_ams_count_str = print_config->extruder_ams_count.values; + std::vector extruder_ams_count_str = print_config.extruder_ams_count.values; auto extruder_ams_counts = get_extruder_ams_count(extruder_ams_count_str); std::vector group_size = calc_max_group_size(extruder_ams_counts, false); auto machine_filament_info = build_machine_filaments(print->get_extruder_filament_info()); - std::vector filament_types = print_config->filament_type.values; - std::vector filament_colours = print_config->filament_colour.values; + std::vector filament_types = print_config.filament_type.values; + std::vector filament_colours = print_config.filament_colour.values; // speacially handle tpu filaments auto used_filaments = collect_sorted_used_filaments(layer_filaments); - auto tpu_filaments = get_filament_by_type(used_filaments, print_config, "TPU"); - FGMode fg_mode = print_config->filament_map_mode.value == FilamentMapMode::fmmAutoForMatch ? FGMode::MatchMode: FGMode::FlushMode; + auto tpu_filaments = get_filament_by_type(used_filaments, &print_config, "TPU"); + FGMode fg_mode = mode == FilamentMapMode::fmmAutoForMatch ? FGMode::MatchMode: FGMode::FlushMode; std::vector> ext_unprintable_filaments; collect_unprintable_limits(physical_unprintables, geometric_unprintables, ext_unprintable_filaments); // TODO: throw exception if fail or set it to status @@ -1079,7 +1073,7 @@ std::vector ToolOrdering::get_recommended_filament_maps(const std::vectormaster_extruder_id.value - 1; // switch to 0 based idx + context.machine_info.master_extruder_id = print_config.master_extruder_id.value - 1; // switch to 0 based idx context.group_info.total_filament_num = (int)(filament_nums); context.group_info.max_gap_threshold = 0.01; @@ -1108,10 +1102,10 @@ FilamentChangeStats ToolOrdering::get_filament_change_stats(FilamentChangeMode m { case Slic3r::ToolOrdering::SingleExt: return m_stats_by_single_extruder; - case Slic3r::ToolOrdering::MultiExtAuto: - return m_stats_by_multi_extruder_auto; - case Slic3r::ToolOrdering::MultiExtManual: - return m_stats_by_multi_extruder_manual; + case Slic3r::ToolOrdering::MultiExtBest: + return m_stats_by_multi_extruder_best; + case Slic3r::ToolOrdering::MultiExtCurr: + return m_stats_by_multi_extruder_curr; default: break; } @@ -1166,7 +1160,7 @@ void ToolOrdering::reorder_extruders_for_minimum_flush_volume(bool reorder_first print_config = &(m_print_object_ptr->print()->config()); } - filament_maps = ToolOrdering::get_recommended_filament_maps(layer_filaments, print_config, m_print, physical_unprintables, geometric_unprintables); + filament_maps = ToolOrdering::get_recommended_filament_maps(layer_filaments, m_print, map_mode, physical_unprintables, geometric_unprintables); if (filament_maps.empty()) return; @@ -1235,10 +1229,11 @@ void ToolOrdering::reorder_extruders_for_minimum_flush_volume(bool reorder_first auto curr_flush_info = calc_filament_change_info_by_toolorder(print_config, filament_maps, nozzle_flush_mtx, filament_sequences); if (nozzle_nums <= 1) m_stats_by_single_extruder = curr_flush_info; - else if (map_mode < fmmManual) - m_stats_by_multi_extruder_auto = curr_flush_info; - else if (map_mode == fmmManual) - m_stats_by_multi_extruder_manual = curr_flush_info; + else { + m_stats_by_multi_extruder_curr = curr_flush_info; + if (map_mode == fmmAutoForFlush) + m_stats_by_multi_extruder_best = curr_flush_info; + } // in multi extruder mode,collect data with other mode if (nozzle_nums > 1) { @@ -1258,11 +1253,11 @@ void ToolOrdering::reorder_extruders_for_minimum_flush_volume(bool reorder_first ); m_stats_by_single_extruder = calc_filament_change_info_by_toolorder(print_config, maps_without_group, nozzle_flush_mtx, filament_sequences_one_extruder); } - // if in manual mode,also calculate the info by auto mode - if (map_mode == fmmManual) + // if not in best for flush mode,also calculate the info by best for flush mode + if (map_mode != fmmAutoForFlush) { std::vector>filament_sequences_one_extruder; - std::vectorfilament_maps_auto = get_recommended_filament_maps(layer_filaments, print_config, m_print, physical_unprintables, geometric_unprintables); + std::vectorfilament_maps_auto = get_recommended_filament_maps(layer_filaments, m_print, fmmAutoForFlush, physical_unprintables, geometric_unprintables); reorder_filaments_for_minimum_flush_volume( filament_lists, filament_maps_auto, @@ -1271,7 +1266,7 @@ void ToolOrdering::reorder_extruders_for_minimum_flush_volume(bool reorder_first get_custom_seq, &filament_sequences_one_extruder ); - m_stats_by_multi_extruder_auto = calc_filament_change_info_by_toolorder(print_config, filament_maps_auto, nozzle_flush_mtx, filament_sequences_one_extruder); + m_stats_by_multi_extruder_best = calc_filament_change_info_by_toolorder(print_config, filament_maps_auto, nozzle_flush_mtx, filament_sequences_one_extruder); } } diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index 51b6437a3..df3268ca8 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -182,8 +182,8 @@ class ToolOrdering public: enum FilamentChangeMode { SingleExt, - MultiExtAuto, - MultiExtManual + MultiExtBest, + MultiExtCurr }; ToolOrdering() = default; @@ -204,8 +204,8 @@ public: void clear() { m_layer_tools.clear(); m_stats_by_single_extruder.clear(); - m_stats_by_multi_extruder_auto.clear(); - m_stats_by_multi_extruder_manual.clear(); + m_stats_by_multi_extruder_best.clear(); + m_stats_by_multi_extruder_curr.clear(); } // Only valid for non-sequential print: @@ -240,7 +240,7 @@ public: * called in dual extruder mode, the value in map will be 0 or 1 * 0 based group id */ - static std::vector get_recommended_filament_maps(const std::vector>& layer_filaments, const PrintConfig* print_config, const Print* print, const std::vector>& physical_unprintables, const std::vector>& geometric_unprintables); + static std::vector get_recommended_filament_maps(const std::vector>& layer_filaments, const Print* print,const FilamentMapMode mode, const std::vector>& physical_unprintables, const std::vector>& geometric_unprintables); static std::vector> get_physical_unprintables(const std::vector& layer_filaments, const PrintConfig* config); static std::vector> get_geometrical_unprintables(const std::vector>& unprintable_arrs, const PrintConfig* config); @@ -281,8 +281,8 @@ private: bool m_sorted = false; FilamentChangeStats m_stats_by_single_extruder; - FilamentChangeStats m_stats_by_multi_extruder_manual; - FilamentChangeStats m_stats_by_multi_extruder_auto; + FilamentChangeStats m_stats_by_multi_extruder_curr; + FilamentChangeStats m_stats_by_multi_extruder_best; }; } // namespace SLic3r diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index f82c294ea..a0269a3bc 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -1882,7 +1882,7 @@ void Print::process(std::unordered_map* slice_time, bool auto map_mode = get_filament_map_mode(); // get recommended filament map if (map_mode < FilamentMapMode::fmmManual) { - filament_maps = ToolOrdering::get_recommended_filament_maps(all_filaments, &config(), this, physical_unprintables, geometric_unprintables); + filament_maps = ToolOrdering::get_recommended_filament_maps(all_filaments, this, map_mode, physical_unprintables, geometric_unprintables); std::transform(filament_maps.begin(), filament_maps.end(), filament_maps.begin(), [](int value) { return value + 1; }); update_filament_maps_to_config(filament_maps); } diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 5bade1fec..67ac6a6f4 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -699,12 +699,12 @@ struct StatisticsByExtruderCount { // flush weight comes first,then comes filament change time FilamentChangeStats stats_by_single_extruder; - FilamentChangeStats stats_by_multi_extruder_auto; - FilamentChangeStats stats_by_multi_extruder_manual; + FilamentChangeStats stats_by_multi_extruder_best; + FilamentChangeStats stats_by_multi_extruder_curr; void clear() { stats_by_single_extruder.clear(); - stats_by_multi_extruder_auto.clear(); - stats_by_multi_extruder_manual.clear(); + stats_by_multi_extruder_best.clear(); + stats_by_multi_extruder_curr.clear(); } }; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 0269191f1..f73d15ddf 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -4668,8 +4668,8 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) auto is_auto = filament_map_mode < FilamentMapMode::fmmManual; bool has_tips = true; if (is_auto) { - float saved_flush_weight = stats_by_extruder.stats_by_single_extruder.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_auto.filament_flush_weight; - int saved_filament_changed_time = stats_by_extruder.stats_by_single_extruder.filament_change_count - stats_by_extruder.stats_by_multi_extruder_auto.filament_change_count; + float saved_flush_weight = stats_by_extruder.stats_by_single_extruder.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_curr.filament_flush_weight; + int saved_filament_changed_time = stats_by_extruder.stats_by_single_extruder.filament_change_count - stats_by_extruder.stats_by_multi_extruder_curr.filament_change_count; if (!(saved_flush_weight > EPSILON || saved_filament_changed_time > 0)) has_tips = false; } // BBS AMS containers @@ -4744,16 +4744,16 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) } return static_cast(num); }; - if (filament_map_mode < fmmManual) { - float saved_flush_weight = stats_by_extruder.stats_by_single_extruder.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_auto.filament_flush_weight; - int saved_filament_changed_time = stats_by_extruder.stats_by_single_extruder.filament_change_count - stats_by_extruder.stats_by_multi_extruder_auto.filament_change_count; + if (filament_map_mode == fmmAutoForFlush) { + float saved_flush_weight = stats_by_extruder.stats_by_single_extruder.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_best.filament_flush_weight; + int saved_filament_changed_time = stats_by_extruder.stats_by_single_extruder.filament_change_count - stats_by_extruder.stats_by_multi_extruder_best.filament_change_count; if (saved_flush_weight > EPSILON || saved_filament_changed_time > 0) { imgui.text(_u8L("This arrangement would be optimal.")); imgui.text_wrapped(from_u8((boost::format(_u8L("Save %1%g filament and %2% changes than one-extruder printer.")) % number_format(saved_flush_weight) % saved_filament_changed_time).str()), parent_width); } - } else if (filament_map_mode == fmmManual) { - float more_cost = stats_by_extruder.stats_by_multi_extruder_manual.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_auto.filament_flush_weight; - int more_time = stats_by_extruder.stats_by_multi_extruder_manual.filament_change_count - stats_by_extruder.stats_by_multi_extruder_auto.filament_change_count; + } else if (filament_map_mode != fmmAutoForFlush) { + float more_cost = stats_by_extruder.stats_by_multi_extruder_curr.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_best.filament_flush_weight; + int more_time = stats_by_extruder.stats_by_multi_extruder_curr.filament_change_count - stats_by_extruder.stats_by_multi_extruder_best.filament_change_count; if (more_cost > EPSILON || more_time > 0) { is_optimal_group = false; @@ -4763,8 +4763,8 @@ void GCodeViewer::render_legend_color_arr_recommen(float window_padding) imgui.text_wrapped(from_u8((boost::format(_u8L("Cost %1%g filament and %2% changes more than optimal arrangement.")) % number_format(more_cost) % more_time).str()), parent_width); ImGui::PopStyleColor(1); } else { - float saved_flush_weight = stats_by_extruder.stats_by_single_extruder.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_auto.filament_flush_weight; - int saved_filament_changed_time = stats_by_extruder.stats_by_single_extruder.filament_change_count - stats_by_extruder.stats_by_multi_extruder_auto.filament_change_count; + float saved_flush_weight = stats_by_extruder.stats_by_single_extruder.filament_flush_weight - stats_by_extruder.stats_by_multi_extruder_best.filament_flush_weight; + int saved_filament_changed_time = stats_by_extruder.stats_by_single_extruder.filament_change_count - stats_by_extruder.stats_by_multi_extruder_best.filament_change_count; if (saved_flush_weight > EPSILON || saved_filament_changed_time > 0) { imgui.text(_u8L("This arrangement would be optimal.")); imgui.text_wrapped(from_u8((boost::format(_u8L("Save %1%g filament and %2% changes than one-extruder printer.")) % number_format(saved_flush_weight) % saved_filament_changed_time).str()), parent_width);