From 78eb3b464f049d176c280723fe4e8f2b9677e509 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Mon, 8 Sep 2025 00:16:05 +0800 Subject: [PATCH] Fix the bug where FillRectilinear generates an unoptimized toolpath. Ensure that fill_surface_by_lines is used when multiline is 1, as it provides optimized traversal. --- src/libslic3r/Fill/Fill.cpp | 4 +++- src/libslic3r/Fill/FillRectilinear.cpp | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 5bff4feb00..e8294ea673 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -845,7 +845,6 @@ std::vector group_fills(const Layer &layer, LockRegionParam &lock_p params.extruder = layerm.region().extruder(extrusion_role); params.pattern = region_config.sparse_infill_pattern.value; params.density = float(region_config.sparse_infill_density); - params.multiline = int(region_config.fill_multiline); params.lateral_lattice_angle_1 = region_config.lateral_lattice_angle_1; params.lateral_lattice_angle_2 = region_config.lateral_lattice_angle_2; params.infill_overhang_angle = region_config.infill_overhang_angle; @@ -896,6 +895,9 @@ std::vector group_fills(const Layer &layer, LockRegionParam &lock_p params.extrusion_role = erSolidInfill; } } + // Orca: apply fill multiline only for sparse infill + params.multiline = params.extrusion_role == erInternalInfill ? int(region_config.fill_multiline) : 1; + if (params.extrusion_role == erInternalInfill) { params.angle = calculate_infill_rotation_angle(layer.object(), layer.id(), region_config.infill_direction.value, region_config.sparse_infill_rotate_template.value); diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index 3644860c1a..4138ef0511 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -3044,7 +3044,7 @@ Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams { Polylines polylines_out; // Orca Todo: fow now don't use fill_surface_by_multilines for zipzag infill - if (params.full_infill() || params.pattern == ipCrossZag || params.pattern == ipZigZag || params.pattern == ipLockedZag) { + if (params.full_infill() || params.multiline == 1 || params.pattern == ipCrossZag || params.pattern == ipZigZag || params.pattern == ipLockedZag) { if (!fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_lines() failed to fill a region."; } else {