Ensure the flow calib pattern to be printed in desired order (#9145)

Fix issue in https://github.com/SoftFever/OrcaSlicer/pull/8993


![image](https://github.com/user-attachments/assets/60a64088-8af8-45d6-9724-aa225f19a10f)
This commit is contained in:
SoftFever 2025-04-05 21:43:31 +08:00 committed by GitHub
commit c577fdd792
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 10 deletions

View file

@ -171,16 +171,11 @@ void Fill::fill_surface_extrusion(const Surface* surface, const FillParams& para
params.extrusion_role, params.extrusion_role,
flow_mm3_per_mm, float(flow_width), params.flow.height()); flow_mm3_per_mm, float(flow_width), params.flow.height());
} }
if (!params.can_reverse || is_flow_calib) {
if (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++) for (size_t i = idx; i < eec->entities.size(); i++)
eec->entities[i]->set_reverse(); eec->entities[i]->set_reverse();
} }
}
// Orca: run gap fill // Orca: run gap fill
this->_create_gap_fill(surface, params, eec); this->_create_gap_fill(surface, params, eec);
} }

View file

@ -120,8 +120,33 @@ void FillPlanePath::_fill_surface_single(
if (polyline.size() >= 2) { if (polyline.size() >= 2) {
Polylines polylines = intersection_pl(polyline, expolygon); Polylines polylines = intersection_pl(polyline, expolygon);
Polylines chained; Polylines chained;
if (params.dont_connect() || params.density > 0.5 || polylines.size() <= 1) 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<FillArchimedeanChords*>(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)); 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 else
connect_infill(std::move(polylines), expolygon, chained, this->spacing, params); connect_infill(std::move(polylines), expolygon, chained, this->spacing, params);
// paths must be repositioned and rotated back // paths must be repositioned and rotated back