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);