FIX: error speed while flush to infill

Jira: 10094

Signed-off-by: qing.zhang <qing.zhang@bambulab.com>
Change-Id: I335d664fd28355cfeadd42be52f8c646f249eab0
This commit is contained in:
qing.zhang 2025-02-11 10:11:14 +08:00 committed by lane.wei
parent faec4160d5
commit c0a2982c79
6 changed files with 51 additions and 15 deletions

View File

@ -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<ExtrusionEntity*> ExtrusionEntitiesPtr;

View File

@ -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::vector<Obje
// BBS: output merged node id
int curr_node=0;
int cooling_node = -1;
for (size_t perimeter_idx = 0; perimeter_idx < region.perimeters.size(); ++perimeter_idx) {
const ExtrusionEntity *ee = region.perimeters[perimeter_idx];
if (curr_node < region.merged_node.size() && perimeter_idx == region.merged_node[curr_node]->loop_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.);

View File

@ -413,7 +413,6 @@ private:
ExtrusionEntitiesPtr perimeters;
// Non-owned references to LayerRegion::fills::entities
ExtrusionEntitiesPtr infills;
std::vector<const LoopNode*> merged_node;
std::vector<const WipingExtrusions::ExtruderPerCopy*> infills_overrides;
std::vector<const WipingExtrusions::ExtruderPerCopy*> perimeters_overrides;

View File

@ -385,6 +385,32 @@ void Layer::calculate_perimeter_continuity(std::vector<LoopNode> &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<const ExtrusionEntityCollection *>(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;

View File

@ -185,7 +185,7 @@ public:
void make_perimeters(const AutoContourHolesCompensationParams &auto_contour_holes_compensation_params);
//BBS
void calculate_perimeter_continuity(std::vector<LoopNode> &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);

View File

@ -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<size_t>(0, m_layers.size()), [this](const tbb::blocked_range<size_t> &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);
}