FillRectilinear bugfix

This commit is contained in:
RF47
2026-02-27 19:38:07 -03:00
parent 5c07cb5c39
commit 4b928b413b

View File

@@ -3021,15 +3021,15 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar
multiline_fill(fill_lines, params, spacing); multiline_fill(fill_lines, params, spacing);
// Contract surface polygon by half line width to avoid excesive overlap with perimeter // Contract surface polygon by half line width to avoid excesive overlap with perimeter
ExPolygons contracted = offset_ex(surface->expolygon, -float(scale_(0.5 * this->spacing))); const ExPolygons contracted = offset_ex(surface->expolygon, -float(scale_(0.5 * this->spacing)));
// if contraction results in empty polygon, use original surface // if contraction results in empty ExPolygons, use original surface
const ExPolygon &intersection_surface = contracted.empty() ? surface->expolygon : contracted.front(); const ExPolygons intersection_surface = contracted.empty() ? ExPolygons{surface->expolygon} : contracted;
// Intersect polylines with perimeter // Intersect polylines with perimeter
fill_lines = intersection_pl(std::move(fill_lines), intersection_surface); fill_lines = intersection_pl(std::move(fill_lines), intersection_surface);
if ((params.pattern == ipLateralLattice || params.pattern == ipLateralHoneycomb ) && params.multiline >1 ) if ((params.pattern == ipLateralLattice || params.pattern == ipLateralHoneycomb) && params.multiline > 1)
remove_overlapped(fill_lines, line_width); remove_overlapped(fill_lines, line_width);
if (!fill_lines.empty()) { if (!fill_lines.empty()) {
@@ -3038,7 +3038,8 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar
fill_lines = chain_polylines(std::move(fill_lines)); fill_lines = chain_polylines(std::move(fill_lines));
append(polylines_out, std::move(fill_lines)); append(polylines_out, std::move(fill_lines));
} else } else
connect_infill(std::move(fill_lines), intersection_surface, polylines_out, this->spacing, params); connect_infill(std::move(fill_lines), to_polygons(intersection_surface), get_extents(surface->expolygon.contour), polylines_out,
this->spacing, params);
} }
return true; return true;
@@ -3265,10 +3266,10 @@ bool FillRectilinear::fill_surface_trapezoidal(
multiline_fill(polylines, params, spacing); multiline_fill(polylines, params, spacing);
// Contract surface polygon by half line width to avoid excesive overlap with perimeter // Contract surface polygon by half line width to avoid excesive overlap with perimeter
ExPolygons contracted = offset_ex(expolygon, -float(scale_(0.5 * this->spacing))); const ExPolygons contracted = offset_ex(expolygon, -float(scale_(0.5 * this->spacing)));
// if contraction results in empty polygon, use original surface // if contraction results in empty polygon, use original surface
const ExPolygon &intersection_surface = contracted.empty() ? expolygon : contracted.front(); const ExPolygons &intersection_surface = contracted.empty() ? ExPolygons{expolygon} : contracted;
// Intersect polylines with offset expolygon // Intersect polylines with offset expolygon
polylines = intersection_pl(std::move(polylines), intersection_surface); polylines = intersection_pl(std::move(polylines), intersection_surface);
@@ -3284,7 +3285,13 @@ bool FillRectilinear::fill_surface_trapezoidal(
// Connect infill lines using offset expolygon // Connect infill lines using offset expolygon
int infill_start_idx = polylines_out.size(); int infill_start_idx = polylines_out.size();
if (!polylines.empty()) { if (!polylines.empty()) {
Slic3r::Fill::chain_or_connect_infill(std::move(polylines), intersection_surface, polylines_out, this->spacing, params); if (params.dont_connect()) {
if (polylines.size() > 1)
polylines = chain_polylines(std::move(polylines));
append(polylines_out, std::move(polylines));
} else
connect_infill(std::move(polylines), to_polygons(intersection_surface), get_extents(surface->expolygon.contour), polylines_out,
this->spacing, params);
// Rotate back the infill lines to original orientation // Rotate back the infill lines to original orientation
if (std::abs(base_angle) >= EPSILON) { if (std::abs(base_angle) >= EPSILON) {