From a092c486428ad78b0d8a7830df56babb867cf4c8 Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Wed, 2 Jul 2025 14:54:07 +0800 Subject: [PATCH] FIX: find the first layer with enough space to extrude 1. Sometimes the first layer is too small and does not have enough space to extrude.That will make first layer extruders empty jira: STUDIO-13030 Signed-off-by: xun.zhang Change-Id: I69b99ab74101c772f4c91e955060e403988bb91c (cherry picked from commit 9699397858c6d52d027e79e91041a9dac7280bba) --- src/libslic3r/GCode/ToolOrdering.cpp | 44 +++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp index b60cd55734..e6347e3fb0 100644 --- a/src/libslic3r/GCode/ToolOrdering.cpp +++ b/src/libslic3r/GCode/ToolOrdering.cpp @@ -479,8 +479,26 @@ std::vector ToolOrdering::generate_first_layer_tool_order(const Pr std::map min_areas_per_extruder; for (auto object : print.objects()) { - auto first_layer = object->get_layer(0); - for (auto layerm : first_layer->regions()) { + const Layer* target_layer = nullptr; + for(auto layer : object->layers()){ + for(auto layerm : layer->regions()){ + for(auto& expoly : layerm->raw_slices){ + if (!offset_ex(expoly, -0.2 * scale_(print.config().initial_layer_line_width)).empty()) { + target_layer = layer; + break; + } + } + if(target_layer) + break; + } + if(target_layer) + break; + } + + if(!target_layer) + return tool_order; + + for (auto layerm : target_layer->regions()) { int extruder_id = layerm->region().config().option("wall_filament")->getInt(); for (auto expoly : layerm->raw_slices) { @@ -525,8 +543,26 @@ std::vector ToolOrdering::generate_first_layer_tool_order(const Pr std::vector tool_order; int initial_extruder_id = -1; std::map min_areas_per_extruder; - auto first_layer = object.get_layer(0); - for (auto layerm : first_layer->regions()) { + const Layer* target_layer = nullptr; + for(auto layer : object.layers()){ + for(auto layerm : layer->regions()){ + for(auto& expoly : layerm->raw_slices){ + if (!offset_ex(expoly, -0.2 * scale_(object.config().line_width)).empty()) { + target_layer = layer; + break; + } + } + if(target_layer) + break; + } + if(target_layer) + break; + } + + if(!target_layer) + return tool_order; + + for (auto layerm : target_layer->regions()) { int extruder_id = layerm->region().config().option("wall_filament")->getInt(); for (auto expoly : layerm->raw_slices) { const double nozzle_diameter = object.print()->config().nozzle_diameter.get_at(0);