Fix infill anchor missing (#9407)

* Fix infill anchor missing

* Correctly process cases without fill lines in FillRectilinear::fill_surface_with_multilines()

* Fix infill anchor missing for several other infill patterns

* Fix infill anchor missing for rectilinear and aligned rectilinear infill pattern

---------

Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
This commit is contained in:
Henk 2025-04-23 15:17:19 +02:00 committed by GitHub
parent d1c2368eee
commit 66cab434b8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 36 additions and 33 deletions

View file

@ -273,10 +273,7 @@ void Fill3DHoneycomb::_fill_surface_single(
if (!polylines.empty()) { if (!polylines.empty()) {
int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. int infill_start_idx = polylines_out.size(); // only rotate what belongs to us.
// connect lines // connect lines
if (params.dont_connect() || polylines.size() <= 1) chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
append(polylines_out, chain_polylines(std::move(polylines)));
else
this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
// rotate back // rotate back
if (std::abs(infill_angle) >= EPSILON) { if (std::abs(infill_angle) >= EPSILON) {

View file

@ -1401,10 +1401,7 @@ void Filler::_fill_surface_single(
} }
#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
if (params.dont_connect() || all_polylines_with_hooks.size() <= 1) chain_or_connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params);
append(polylines_out, chain_polylines(std::move(all_polylines_with_hooks)));
else
connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params);
#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
{ {

View file

@ -1787,6 +1787,18 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vector<const Po
polylines_out.emplace_back(std::move(pl)); polylines_out.emplace_back(std::move(pl));
} }
void Fill::chain_or_connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const double spacing, const FillParams &params)
{
if (!infill_ordered.empty()) {
if (params.dont_connect()) {
if (infill_ordered.size() > 1)
infill_ordered = chain_polylines(std::move(infill_ordered));
append(polylines_out, std::move(infill_ordered));
} else
connect_infill(std::move(infill_ordered), boundary, polylines_out, spacing, params);
}
}
// Extend the infill lines along the perimeters, this is mainly useful for grid aligned support, where a perimeter line may be nearly // Extend the infill lines along the perimeters, this is mainly useful for grid aligned support, where a perimeter line may be nearly
// aligned with the infill lines. // aligned with the infill lines.
static inline void base_support_extend_infill_lines(Polylines &infill, BoundaryInfillGraph &graph, const double spacing, const FillParams &params) static inline void base_support_extend_infill_lines(Polylines &infill, BoundaryInfillGraph &graph, const double spacing, const FillParams &params)

View file

@ -191,6 +191,8 @@ public:
static void connect_infill(Polylines &&infill_ordered, const Polygons &boundary, const BoundingBox& bbox, Polylines &polylines_out, const double spacing, const FillParams &params); static void connect_infill(Polylines &&infill_ordered, const Polygons &boundary, const BoundingBox& bbox, Polylines &polylines_out, const double spacing, const FillParams &params);
static void connect_infill(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary, const BoundingBox &bbox, Polylines &polylines_out, double spacing, const FillParams &params); static void connect_infill(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary, const BoundingBox &bbox, Polylines &polylines_out, double spacing, const FillParams &params);
static void chain_or_connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const double spacing, const FillParams &params);
static void connect_base_support(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params); static void connect_base_support(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params);
static void connect_base_support(Polylines &&infill_ordered, const Polygons &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params); static void connect_base_support(Polylines &&infill_ordered, const Polygons &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params);

View file

@ -218,10 +218,7 @@ void FillCrossHatch ::_fill_surface_single(
if (!polylines.empty()) { if (!polylines.empty()) {
int infill_start_idx = polylines_out.size(); // only rotate what belongs to us. int infill_start_idx = polylines_out.size(); // only rotate what belongs to us.
// connect lines // connect lines
if (params.dont_connect() || polylines.size() <= 1) chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
append(polylines_out, chain_polylines(std::move(polylines)));
else
this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
// rotate back // rotate back
if (std::abs(infill_angle) >= EPSILON) { if (std::abs(infill_angle) >= EPSILON) {

View file

@ -194,10 +194,7 @@ void FillGyroid::_fill_surface_single(
if (! polylines.empty()) { if (! polylines.empty()) {
// connect lines // connect lines
size_t polylines_out_first_idx = polylines_out.size(); size_t polylines_out_first_idx = polylines_out.size();
if (params.dont_connect()) chain_or_connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
append(polylines_out, chain_polylines(polylines));
else
this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
// new paths must be rotated back // new paths must be rotated back
if (std::abs(infill_angle) >= EPSILON) { if (std::abs(infill_angle) >= EPSILON) {

View file

@ -74,10 +74,7 @@ void FillHoneycomb::_fill_surface_single(
} }
all_polylines = intersection_pl(std::move(all_polylines), expolygon); all_polylines = intersection_pl(std::move(all_polylines), expolygon);
if (params.dont_connect() || all_polylines.size() <= 1) chain_or_connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params);
append(polylines_out, chain_polylines(std::move(all_polylines)));
else
connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params);
} }
} // namespace Slic3r } // namespace Slic3r

View file

@ -16,10 +16,7 @@ void Filler::_fill_surface_single(
const Layer &layer = generator->getTreesForLayer(this->layer_id); const Layer &layer = generator->getTreesForLayer(this->layer_id);
Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled<coord_t>(0.5 * this->spacing - this->overlap)); Polylines fill_lines = layer.convertToLines(to_polygons(expolygon), scaled<coord_t>(0.5 * this->spacing - this->overlap));
if (params.dont_connect() || fill_lines.size() <= 1) { chain_or_connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params);
append(polylines_out, chain_polylines(std::move(fill_lines)));
} else
connect_infill(std::move(fill_lines), expolygon, polylines_out, this->spacing, params);
} }
void GeneratorDeleter::operator()(Generator *p) { void GeneratorDeleter::operator()(Generator *p) {

View file

@ -2928,7 +2928,7 @@ void make_fill_lines(const ExPolygonWithOffset &poly_with_offset, Point refpt, d
bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out) bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out)
{ {
assert(sweep_params.size() > 1); assert(sweep_params.size() >= 1);
assert(! params.full_infill()); assert(! params.full_infill());
params.density /= double(sweep_params.size()); params.density /= double(sweep_params.size());
assert(params.density > 0.0001f && params.density <= 1.f); assert(params.density > 0.0001f && params.density <= 1.f);
@ -2948,12 +2948,14 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar
make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, - angle), rotate_vector.second.rotated(-angle), angle, line_width + coord_t(SCALED_EPSILON), line_spacing, coord_t(scale_(sweep.pattern_shift)), fill_lines); make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, - angle), rotate_vector.second.rotated(-angle), angle, line_width + coord_t(SCALED_EPSILON), line_spacing, coord_t(scale_(sweep.pattern_shift)), fill_lines);
} }
if (params.dont_connect() || fill_lines.size() <= 1) { if (!fill_lines.empty()) {
if (fill_lines.size() > 1) if (params.dont_connect()) {
fill_lines = chain_polylines(std::move(fill_lines)); if (fill_lines.size() > 1)
append(polylines_out, std::move(fill_lines)); fill_lines = chain_polylines(std::move(fill_lines));
} else append(polylines_out, std::move(fill_lines));
connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params); } else
connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params);
}
return true; return true;
} }
@ -2961,8 +2963,13 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar
Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams &params) Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams &params)
{ {
Polylines polylines_out; Polylines polylines_out;
if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) if (params.full_infill()) {
BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() failed to fill a region."; 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 {
if (!fill_surface_by_multilines(surface, params, {{0.f, 0.f}}, polylines_out))
BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() fill_surface_by_multilines() failed to fill a region.";
}
return polylines_out; return polylines_out;
} }