From c0a2982c792b625104e586c38eb8953ced511822 Mon Sep 17 00:00:00 2001 From: "qing.zhang" Date: Tue, 11 Feb 2025 10:11:14 +0800 Subject: [PATCH] FIX: error speed while flush to infill Jira: 10094 Signed-off-by: qing.zhang Change-Id: I335d664fd28355cfeadd42be52f8c646f249eab0 --- src/libslic3r/ExtrusionEntity.hpp | 4 ++++ src/libslic3r/GCode.cpp | 17 ++++------------- src/libslic3r/GCode.hpp | 1 - src/libslic3r/Layer.cpp | 26 ++++++++++++++++++++++++++ src/libslic3r/Layer.hpp | 2 +- src/libslic3r/PrintObject.cpp | 16 ++++++++++++++++ 6 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index 2d8039da4..8cf6f4886 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -169,8 +169,12 @@ public: virtual CustomizeFlag get_customize_flag() const { return m_customize_flag; }; virtual void set_customize_flag(CustomizeFlag flag) { m_customize_flag = flag; }; + virtual int get_cooling_node() const { return m_cooling_node; }; + virtual void set_cooling_node(int id) { m_cooling_node = id; }; + protected: CustomizeFlag m_customize_flag{CustomizeFlag::cfNone}; + int m_cooling_node{ -1 }; }; typedef std::vector ExtrusionEntitiesPtr; diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index b5a5e18ad..1900077a5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -3956,15 +3956,6 @@ GCode::LayerResult GCode::process_layer( if (islands[island_idx].by_region.empty()) islands[island_idx].by_region.assign(print.num_print_regions(), ObjectByExtruder::Island::Region()); islands[island_idx].by_region[region.print_region_id()].append(entity_type, extrusions, entity_overrides); - int start = extrusions->loop_node_range.first; - int end = extrusions->loop_node_range.second; - //BBS: add merged node infor - if (!is_infill) { - for (; start < end; ++start) { - const LoopNode *node = &layer.loop_nodes[start]; - islands[island_idx].by_region[region.print_region_id()].merged_node.emplace_back(node); - } - } break; } } @@ -4826,12 +4817,12 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vectorloop_id) { - gcode += "; COOLING_NODE: " + std::to_string(region.merged_node[curr_node]->merged_id) + "\n"; - curr_node++; + int ee_node_id = ee->get_cooling_node(); + if (ee_node_id != cooling_node) { + gcode += "; COOLING_NODE: " + std::to_string(ee_node_id) + "\n"; } gcode += this->extrude_entity(*ee, "perimeter", -1.); diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index a655e1752..77efcb56b 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -413,7 +413,6 @@ private: ExtrusionEntitiesPtr perimeters; // Non-owned references to LayerRegion::fills::entities ExtrusionEntitiesPtr infills; - std::vector merged_node; std::vector infills_overrides; std::vector perimeters_overrides; diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 0e8371f50..7dcaa2ccd 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -385,6 +385,32 @@ void Layer::calculate_perimeter_continuity(std::vector &prev_nodes) { } +void Layer::recrod_cooling_node_for_each_extrusion() { + for (LayerRegion *region : this->regions()) { + for (int extrusion_idx = 0; extrusion_idx < region->perimeters.entities.size(); extrusion_idx++) { + const auto *extrusions = static_cast(region->perimeters.entities[extrusion_idx]); + int start = extrusions->loop_node_range.first; + int end = extrusions->loop_node_range.second; + if (start >= end) + continue; + + int cooling_node = this->loop_nodes[start].merged_id; + int pos = this->loop_nodes[start].loop_id; + int next_pos = start + 1 < end ? this->loop_nodes[start + 1].loop_id : -1; + for (int idx = 0; idx < extrusions->entities.size(); idx++) { + if (idx == next_pos && next_pos > 0) { + start++; + cooling_node = this->loop_nodes[start].merged_id; + next_pos = start + 1 < end ? this->loop_nodes[start + 1].loop_id : -1; + } + + extrusions->entities[idx]->set_cooling_node(cooling_node); + } + + } + } +} + void Layer::export_region_slices_to_svg(const char *path) const { BoundingBox bbox; diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 0af013513..235817762 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -185,7 +185,7 @@ public: void make_perimeters(const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params); //BBS void calculate_perimeter_continuity(std::vector &prev_nodes); - + void recrod_cooling_node_for_each_extrusion(); // Phony version of make_fills() without parameters for Perl integration only. void make_fills() { this->make_fills(nullptr, nullptr); } void make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree, FillLightning::Generator* lightning_generator = nullptr); diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 26ee5035d..712494c98 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -459,6 +459,22 @@ void PrintObject::make_perimeters(const AutoContourHolesCompensationParams &auto } m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Calculating cooling nodes - end"; + + + //write merged node to each perimeter + BOOST_LOG_TRIVIAL(debug) << "Recrod cooling_node id for each extrusion in parallel - start"; + tbb::parallel_for(tbb::blocked_range(0, m_layers.size()), [this](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++layer_idx) { + m_print->throw_if_canceled(); + if (layer_idx > 1) { + Layer &prev_layer = *m_layers[layer_idx - 1]; + m_layers[layer_idx]->recrod_cooling_node_for_each_extrusion(); + } + } + }); + + m_print->throw_if_canceled(); + BOOST_LOG_TRIVIAL(debug) << "Recrod cooling_node id for each extrusion in parallel - end"; } this->set_done(posPerimeters); }