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 <xun.zhang@bambulab.com>
Change-Id: I69b99ab74101c772f4c91e955060e403988bb91c
(cherry picked from commit 9699397858c6d52d027e79e91041a9dac7280bba)
This commit is contained in:
xun.zhang 2025-07-02 14:54:07 +08:00 committed by Noisyfox
parent e389072544
commit a092c48642

View file

@ -479,8 +479,26 @@ std::vector<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Pr
std::map<int, double> 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<unsigned int> ToolOrdering::generate_first_layer_tool_order(const Pr
std::vector<unsigned int> tool_order;
int initial_extruder_id = -1;
std::map<int, double> 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);