Skip to content

Commit

Permalink
Exclude movements before first extrusion from layer time calculation (#…
Browse files Browse the repository at this point in the history
…7215)

Fixes #7171

If layer starts with a color change, the full layer time will be much longer, which will trick the slicer to think this layer has enough cooling time. However the actual filament extrusion time (the real "printing" part) won't necessarily have enough time to cool down, so if we don't do extra slowing down before starting next layer, the filament could still be soft and lead to worse surface quality.

Please refer to #7171 for extra discussions and details.

![image](https://github.com/user-attachments/assets/b31e9e04-12bb-450e-8b9c-a560549ec35d)
Before:
![image](https://github.com/user-attachments/assets/627f767a-6f48-4317-be50-14e78293ef0a)
After:
![image](https://github.com/user-attachments/assets/376c2b92-e417-4e27-9dcd-db7f6300fc56)


The test project is modified from #7171
  • Loading branch information
SoftFever authored Dec 25, 2024
2 parents aa1f1df + f3b2dc2 commit 42c10fc
Showing 1 changed file with 22 additions and 2 deletions.
24 changes: 22 additions & 2 deletions src/libslic3r/GCode/CoolingBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ struct PerExtruderAdjustments
}
time_total += line.time;
}
this->time_total = time_total;
return time_total;
}
// Slow down each adjustable G-code line proportionally by a factor.
Expand All @@ -166,6 +167,7 @@ struct PerExtruderAdjustments
}
time_total += line.time;
}
this->time_total = time_total;
return time_total;
}

Expand Down Expand Up @@ -204,14 +206,17 @@ struct PerExtruderAdjustments
// Used by non-proportional slow down.
void slow_down_to_feedrate(float min_feedrate) {
assert(this->slow_down_min_speed < min_feedrate + EPSILON);
float time_total = 0.f;
for (size_t i = 0; i < n_lines_adjustable; ++ i) {
CoolingLine &line = lines[i];
if (line.feedrate > min_feedrate) {
line.time *= std::max(1.f, line.feedrate / min_feedrate);
line.feedrate = min_feedrate;
line.slowdown = true;
}
time_total += line.time;
}
this->time_total = time_total;
}

// Extruder, for which the G-code will be adjusted.
Expand Down Expand Up @@ -346,6 +351,10 @@ std::vector<PerExtruderAdjustments> CoolingBuffer::parse_layer_gcode(const std::
// for a sequence of extrusion moves.
size_t active_speed_modifier = size_t(-1);

// Orca: Whether we had our first extrusion in this layer.
// Time of any other movements before the first extrusion will be excluded from the layer time.
bool layer_had_extrusion = false;

for (; *line_start != 0; line_start = line_end)
{
while (*line_end != '\n' && *line_end != 0)
Expand Down Expand Up @@ -404,6 +413,10 @@ std::vector<PerExtruderAdjustments> CoolingBuffer::parse_layer_gcode(const std::
line.type |= CoolingLine::TYPE_EXTERNAL_PERIMETER;
if (wipe)
line.type |= CoolingLine::TYPE_WIPE;

// Orca: only slow down movements since the first extrusion
if (boost::contains(sline, ";_EXTRUDE_SET_SPEED"))
layer_had_extrusion = true;

// ORCA: Dont slowdown external perimeters for layer time feature
// use the adjustment pointer to ensure the value for the current extruder (filament) is used.
Expand Down Expand Up @@ -514,6 +527,13 @@ std::vector<PerExtruderAdjustments> CoolingBuffer::parse_layer_gcode(const std::
} else if (boost::starts_with(sline, ";_FORCE_RESUME_FAN_SPEED")) {
line.type = CoolingLine::TYPE_FORCE_RESUME_FAN;
}

// Orca: For any movements before this layer's first ever extrusion, we exclude them from the layer time calculation.
if (!layer_had_extrusion) {
assert((line.type & CoolingLine::TYPE_ADJUSTABLE) == 0);
line.time = line.time_max = 0;
}

if (line.type != 0)
adjustment->lines.emplace_back(std::move(line));
}
Expand All @@ -535,8 +555,7 @@ static inline void extruder_range_slow_down_non_proportional(
for (PerExtruderAdjustments *adj : by_min_print_speed) {
adj->idx_line_begin = 0;
adj->idx_line_end = 0;
assert(adj->idx_line_begin < adj->n_lines_adjustable);
if (adj->lines[adj->idx_line_begin].feedrate > feedrate)
if (adj->idx_line_begin < adj->n_lines_adjustable && adj->lines[adj->idx_line_begin].feedrate> feedrate)
feedrate = adj->lines[adj->idx_line_begin].feedrate;
}
assert(feedrate > 0.f);
Expand Down Expand Up @@ -623,6 +642,7 @@ float CoolingBuffer::calculate_layer_slowdown(std::vector<PerExtruderAdjustments
} else
elapsed_time_total0 += adj.elapsed_time_total();
}

std::sort(by_slowdown_time.begin(), by_slowdown_time.end(),
[](const PerExtruderAdjustments *adj1, const PerExtruderAdjustments *adj2)
{ return adj1->slow_down_layer_time < adj2->slow_down_layer_time; });
Expand Down

0 comments on commit 42c10fc

Please sign in to comment.