diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 4a56cddaef..8ae8a6d4a7 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -171,16 +171,11 @@ void Fill::fill_surface_extrusion(const Surface* surface, const FillParams& para params.extrusion_role, flow_mm3_per_mm, float(flow_width), params.flow.height()); } - - if (is_flow_calib) { + if (!params.can_reverse || is_flow_calib) { for (size_t i = idx; i < eec->entities.size(); i++) - eec->entities[i]->reverse(); - } else { - if (!params.can_reverse) { - for (size_t i = idx; i < eec->entities.size(); i++) - eec->entities[i]->set_reverse(); - } + eec->entities[i]->set_reverse(); } + // Orca: run gap fill this->_create_gap_fill(surface, params, eec); } diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index b867ee83a0..2167e3704b 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -120,8 +120,33 @@ void FillPlanePath::_fill_surface_single( if (polyline.size() >= 2) { Polylines polylines = intersection_pl(polyline, expolygon); Polylines chained; - if (params.dont_connect() || params.density > 0.5 || polylines.size() <= 1) - chained = chain_polylines(std::move(polylines)); + if (params.dont_connect() || params.density > 0.5 || polylines.size() <= 1) { + // ORCA: special flag for flow rate calibration + auto is_flow_calib = params.extrusion_role == erTopSolidInfill && + this->print_object_config->has("calib_flowrate_topinfill_special_order") && + this->print_object_config->option("calib_flowrate_topinfill_special_order")->getBool() && + dynamic_cast(this); + if (is_flow_calib) { + // We want the spiral part to be printed inside-out + // Find the center spiral line first, by looking for the longest one + auto it = std::max_element(polylines.begin(), polylines.end(), [](const Polyline& a, const Polyline& b) { return a.length() < b.length(); }); + Polyline center_spiral = std::move(*it); + + // Ensure the spiral is printed from inside to out + if (center_spiral.first_point().squaredNorm() > center_spiral.last_point().squaredNorm()) { + center_spiral.reverse(); + } + + // Chain the other polylines + polylines.erase(it); + chained = chain_polylines(std::move(polylines)); + + // Then add the center spiral back + chained.push_back(std::move(center_spiral)); + } else { + chained = chain_polylines(std::move(polylines)); + } + } else connect_infill(std::move(polylines), expolygon, chained, this->spacing, params); // paths must be repositioned and rotated back