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; std::map<int, double> min_areas_per_extruder;
for (auto object : print.objects()) { for (auto object : print.objects()) {
auto first_layer = object->get_layer(0); const Layer* target_layer = nullptr;
for (auto layerm : first_layer->regions()) { 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(); int extruder_id = layerm->region().config().option("wall_filament")->getInt();
for (auto expoly : layerm->raw_slices) { 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; std::vector<unsigned int> tool_order;
int initial_extruder_id = -1; int initial_extruder_id = -1;
std::map<int, double> min_areas_per_extruder; std::map<int, double> min_areas_per_extruder;
auto first_layer = object.get_layer(0); const Layer* target_layer = nullptr;
for (auto layerm : first_layer->regions()) { 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(); int extruder_id = layerm->region().config().option("wall_filament")->getInt();
for (auto expoly : layerm->raw_slices) { for (auto expoly : layerm->raw_slices) {
const double nozzle_diameter = object.print()->config().nozzle_diameter.get_at(0); const double nozzle_diameter = object.print()->config().nozzle_diameter.get_at(0);