From d13d4a47b78b6f80cdc4bff935ea8c3c52ff556b Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Wed, 8 Jan 2025 21:46:59 +0800 Subject: [PATCH] Make sure the `m_extrusion_quality_estimator.set_current_object()` is called after regional config has been applied (SoftFever/OrcaSlicer#7946) --- src/libslic3r/GCode.cpp | 26 ++++++++++++++------------ src/libslic3r/GCode.hpp | 4 ++-- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 29769752da..5e1f4fc07c 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -4190,9 +4190,6 @@ LayerResult GCode::process_layer( } } - if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic) - m_extrusion_quality_estimator.set_current_object(&instance_to_print.print_object); - // When starting a new object, use the external motion planner for the first travel move. const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; std::pair this_object_copy(&instance_to_print.print_object, offset); @@ -4293,10 +4290,10 @@ LayerResult GCode::process_layer( has_insert_timelapse_gcode = true; } - gcode += this->extrude_infill(print, by_region_specific, false); - gcode += this->extrude_perimeters(print, by_region_specific); + gcode += this->extrude_infill(instance_to_print.print_object, by_region_specific, false); + gcode += this->extrude_perimeters(instance_to_print.print_object, by_region_specific); } else { - gcode += this->extrude_perimeters(print, by_region_specific); + gcode += this->extrude_perimeters(instance_to_print.print_object, by_region_specific); if (!has_wipe_tower && need_insert_timelapse_gcode_for_traditional && !has_insert_timelapse_gcode && has_infill(by_region_specific)) { gcode += this->retract(false, false, LiftType::NormalLift); @@ -4313,10 +4310,10 @@ LayerResult GCode::process_layer( has_insert_timelapse_gcode = true; } - gcode += this->extrude_infill(print,by_region_specific, false); + gcode += this->extrude_infill(instance_to_print.print_object, by_region_specific, false); } // ironing - gcode += this->extrude_infill(print,by_region_specific, true); + gcode += this->extrude_infill(instance_to_print.print_object, by_region_specific, true); } if (this->config().gcode_label_objects) { @@ -4911,12 +4908,14 @@ std::string GCode::extrude_path(ExtrusionPath path, std::string description, dou } // Extrude perimeters: Decide where to put seams (hide or align seams). -std::string GCode::extrude_perimeters(const Print &print, const std::vector &by_region) +std::string GCode::extrude_perimeters(const PrintObject& print_object, const std::vector& by_region) { std::string gcode; for (const ObjectByExtruder::Island::Region ®ion : by_region) if (! region.perimeters.empty()) { - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); + m_config.apply(print_object.print()->get_print_region(®ion - &by_region.front()).config()); + if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic) + m_extrusion_quality_estimator.set_current_object(&print_object); for (const ExtrusionEntity* ee : region.perimeters) gcode += this->extrude_entity(*ee, "perimeter", -1., region.perimeters); @@ -4925,7 +4924,7 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vector &by_region, bool ironing) +std::string GCode::extrude_infill(const PrintObject &print_object, const std::vector &by_region, bool ironing) { std::string gcode; ExtrusionEntitiesPtr extrusions; @@ -4938,7 +4937,10 @@ std::string GCode::extrude_infill(const Print &print, const std::vectorrole() == erIroning) == ironing) extrusions.emplace_back(ee); if (! extrusions.empty()) { - m_config.apply(print.get_print_region(®ion - &by_region.front()).config()); + m_config.apply(print_object.print()->get_print_region(®ion - &by_region.front()).config()); + if (m_config.enable_overhang_speed && !m_config.overhang_speed_classic) + m_extrusion_quality_estimator.set_current_object(&print_object); + chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); for (const ExtrusionEntity *fill : extrusions) { auto *eec = dynamic_cast(fill); diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 5f92fd6237..b6dd88c61f 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -445,8 +445,8 @@ private: // For sequential print, the instance of the object to be printing has to be defined. const size_t single_object_instance_idx); - std::string extrude_perimeters(const Print& print, const std::vector& by_region); - std::string extrude_infill(const Print& print, const std::vector& by_region, bool ironing); + std::string extrude_perimeters(const PrintObject &print_object, const std::vector& by_region); + std::string extrude_infill(const PrintObject &print_object, const std::vector& by_region, bool ironing); std::string extrude_support(const ExtrusionEntityCollection& support_fills); // BBS