From 9b81b9e2d4c6b39329e94efe3e433564c66f6ffe Mon Sep 17 00:00:00 2001 From: "zhimin.zeng" Date: Tue, 18 Mar 2025 21:50:18 +0800 Subject: [PATCH] FIX: apply unprintable filament type to limit filament map jira: none Change-Id: I81e22dc28bc416a1b26c242fab4e054f597b064e --- src/libslic3r/GCode.cpp | 5 ++++- src/libslic3r/GCode/GCodeProcessor.cpp | 13 ++++++++++++- src/libslic3r/GCode/GCodeProcessor.hpp | 9 ++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 83ebba8c7..27c24d353 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1534,7 +1534,10 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu int extruder_size = m_print->config().nozzle_diameter.values.size(); if (extruder_size > 1) { std::vector extruder_unprintable_polys = m_print->get_extruder_unprintable_polygons(); - m_processor.check_multi_extruder_gcode_valid(extruder_unprintable_polys, m_print->get_extruder_printable_height(), m_print->get_filament_maps()); + m_processor.check_multi_extruder_gcode_valid(extruder_unprintable_polys, + m_print->get_extruder_printable_height(), + m_print->get_filament_maps(), + m_print->get_physical_unprintable_filaments(m_print->get_slice_used_filaments(false))); } m_processor.finalize(true); diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 3a95c1f7f..1c39468ea 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1563,7 +1563,10 @@ void GCodeProcessor::register_commands() } } -bool GCodeProcessor::check_multi_extruder_gcode_valid(const std::vector &unprintable_areas, const std::vector& printable_heights, const std::vector &filament_map) +bool GCodeProcessor::check_multi_extruder_gcode_valid(const std::vector &unprintable_areas, + const std::vector &printable_heights, + const std::vector &filament_map, + const std::vector> &unprintable_filament_types) { m_result.limit_filament_maps.clear(); m_result.gcode_check_result.reset(); @@ -1642,6 +1645,14 @@ bool GCodeProcessor::check_multi_extruder_gcode_valid(const std::vector &filament_ids = unprintable_filament_types[extruder_id]; + for (int filament_id : filament_ids) { + m_result.limit_filament_maps[filament_id] |= (1 << extruder_id); + } + }; + return valid; } diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index e8804250f..d69bc752f 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -625,8 +625,8 @@ namespace Slic3r { /** * @brief Calculates the time for all blocks - * - * Computes the time for all blocks. The provided block handler can process each block and the + * + * Computes the time for all blocks. The provided block handler can process each block and the * corresponding time (usually assigned to the move of the block). * * @param keep_last_n_blocks The number of last blocks to retain during calculation (default is 0). @@ -1091,7 +1091,10 @@ namespace Slic3r { GCodeProcessor(); // check whether the gcode path meets the filament_map grouping requirements - bool check_multi_extruder_gcode_valid(const std::vector &unprintable_areas, const std::vector& printable_heights, const std::vector& filament_map); + bool check_multi_extruder_gcode_valid(const std::vector &unprintable_areas, + const std::vector &printable_heights, + const std::vector &filament_map, + const std::vector>& unprintable_filament_types ); void apply_config(const PrintConfig& config); void set_filaments(const std::vector&filament_lists) { m_filament_lists=filament_lists;}