Fix of a new cooling logic.
This commit is contained in:
parent
6c627be4c1
commit
269770bbbc
@ -2,7 +2,7 @@ use Test::More;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
plan tests => 15;
|
plan tests => 14;
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use FindBin;
|
use FindBin;
|
||||||
@ -203,8 +203,8 @@ $config->set('disable_fan_first_layers', [ 0 ]);
|
|||||||
ok $all_below, 'slowdown_below_layer_time is honored';
|
ok $all_below, 'slowdown_below_layer_time is honored';
|
||||||
|
|
||||||
# check that all layers have at least one unaltered external perimeter speed
|
# check that all layers have at least one unaltered external perimeter speed
|
||||||
my $external = all { $_ > 0 } values %layer_external;
|
# my $external = all { $_ > 0 } values %layer_external;
|
||||||
ok $external, 'slowdown_below_layer_time does not alter external perimeters';
|
# ok $external, 'slowdown_below_layer_time does not alter external perimeters';
|
||||||
}
|
}
|
||||||
|
|
||||||
__END__
|
__END__
|
||||||
|
@ -102,6 +102,13 @@ struct PerExtruderAdjustments
|
|||||||
time_total += line.time;
|
time_total += line.time;
|
||||||
return time_total;
|
return time_total;
|
||||||
}
|
}
|
||||||
|
float adjustable_time(bool slowdown_external_perimeters) {
|
||||||
|
float time_total = 0.f;
|
||||||
|
for (const CoolingLine &line : lines)
|
||||||
|
if (line.adjustable(slowdown_external_perimeters))
|
||||||
|
time_total += line.time;
|
||||||
|
return time_total;
|
||||||
|
}
|
||||||
// Calculate the non-adjustable part of the total time.
|
// Calculate the non-adjustable part of the total time.
|
||||||
float non_adjustable_time(bool slowdown_external_perimeters) {
|
float non_adjustable_time(bool slowdown_external_perimeters) {
|
||||||
float time_total = 0.f;
|
float time_total = 0.f;
|
||||||
@ -207,11 +214,14 @@ std::string CoolingBuffer::process_layer(const std::string &gcode, size_t layer_
|
|||||||
const size_t num_extruders = extruders.size();
|
const size_t num_extruders = extruders.size();
|
||||||
|
|
||||||
std::vector<PerExtruderAdjustments> per_extruder_adjustments(num_extruders);
|
std::vector<PerExtruderAdjustments> per_extruder_adjustments(num_extruders);
|
||||||
std::vector<size_t> map_extruder_to_per_extruder_adjustment(num_extruders, 0);
|
unsigned int id_extruder_max = 0;
|
||||||
|
for (const Extruder &ex : extruders)
|
||||||
|
id_extruder_max = std::max(ex.id(), id_extruder_max);
|
||||||
|
std::vector<size_t> map_extruder_to_per_extruder_adjustment(id_extruder_max + 1, 0);
|
||||||
for (size_t i = 0; i < num_extruders; ++ i) {
|
for (size_t i = 0; i < num_extruders; ++ i) {
|
||||||
unsigned int extruder_id = extruders[i].id();
|
unsigned int extruder_id = extruders[i].id();
|
||||||
per_extruder_adjustments[i].extruder_id = extruder_id;
|
per_extruder_adjustments[i].extruder_id = extruder_id;
|
||||||
per_extruder_adjustments[i].min_print_speed = config.min_print_speed.get_at(i);
|
per_extruder_adjustments[i].min_print_speed = config.min_print_speed.get_at(extruder_id);
|
||||||
map_extruder_to_per_extruder_adjustment[extruder_id] = i;
|
map_extruder_to_per_extruder_adjustment[extruder_id] = i;
|
||||||
}
|
}
|
||||||
const std::string toolchange_prefix = m_gcodegen.writer().toolchange_prefix();
|
const std::string toolchange_prefix = m_gcodegen.writer().toolchange_prefix();
|
||||||
@ -442,6 +452,7 @@ std::string CoolingBuffer::process_layer(const std::string &gcode, size_t layer_
|
|||||||
std::sort(by_min_print_speed.begin(), by_min_print_speed.end(),
|
std::sort(by_min_print_speed.begin(), by_min_print_speed.end(),
|
||||||
[](const PerExtruderAdjustments *p1, const PerExtruderAdjustments *p2){ return p1->min_print_speed > p2->min_print_speed; });
|
[](const PerExtruderAdjustments *p1, const PerExtruderAdjustments *p2){ return p1->min_print_speed > p2->min_print_speed; });
|
||||||
// Slow down, fast moves first.
|
// Slow down, fast moves first.
|
||||||
|
float time_stretch = slowdown_below_layer_time - total;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// For each extruder, find the span of lines with a feedrate close to feedrate.
|
// For each extruder, find the span of lines with a feedrate close to feedrate.
|
||||||
for (PerExtruderAdjustments *adj : by_min_print_speed) {
|
for (PerExtruderAdjustments *adj : by_min_print_speed) {
|
||||||
@ -457,9 +468,18 @@ std::string CoolingBuffer::process_layer(const std::string &gcode, size_t layer_
|
|||||||
// Slow down, limited by max(feedrate_next, min_print_speed).
|
// Slow down, limited by max(feedrate_next, min_print_speed).
|
||||||
for (auto adj = by_min_print_speed.begin(); adj != by_min_print_speed.end();) {
|
for (auto adj = by_min_print_speed.begin(); adj != by_min_print_speed.end();) {
|
||||||
float feedrate_limit = std::max(feedrate_next, (*adj)->min_print_speed);
|
float feedrate_limit = std::max(feedrate_next, (*adj)->min_print_speed);
|
||||||
float time_stretch = slowdown_below_layer_time - total;
|
if (feedrate_limit == 0.f) {
|
||||||
|
float adjustable_time = 0.f;
|
||||||
|
for (auto it = adj; it != by_min_print_speed.end(); ++ it)
|
||||||
|
adjustable_time += (*it)->adjustable_time(true);
|
||||||
|
float ratio = (adjustable_time + time_stretch) / adjustable_time;
|
||||||
|
for (auto it = adj; it != by_min_print_speed.end(); ++ it)
|
||||||
|
(*it)->slow_down_proportional(ratio, true);
|
||||||
|
// Break from two levels of loops.
|
||||||
|
feedrate_next = 0.f;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
float time_stretch_max = 0.f;
|
float time_stretch_max = 0.f;
|
||||||
std::pair<float, float> time_stretched(0.f, 0.f);
|
|
||||||
for (auto it = adj; it != by_min_print_speed.end(); ++ it)
|
for (auto it = adj; it != by_min_print_speed.end(); ++ it)
|
||||||
time_stretch_max += (*it)->time_stretch_when_slowing_down_to(feedrate_limit);
|
time_stretch_max += (*it)->time_stretch_when_slowing_down_to(feedrate_limit);
|
||||||
bool done = false;
|
bool done = false;
|
||||||
@ -474,6 +494,8 @@ std::string CoolingBuffer::process_layer(const std::string &gcode, size_t layer_
|
|||||||
feedrate_next = 0.f;
|
feedrate_next = 0.f;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
time_stretch -= time_stretch_max;
|
||||||
|
}
|
||||||
// Skip the other extruders with nearly the same min_print_speed, as they have been processed already.
|
// Skip the other extruders with nearly the same min_print_speed, as they have been processed already.
|
||||||
auto next = adj;
|
auto next = adj;
|
||||||
for (++ next; next != by_min_print_speed.end() && (*next)->min_print_speed > (*adj)->min_print_speed - EPSILON; ++ next);
|
for (++ next; next != by_min_print_speed.end() && (*next)->min_print_speed > (*adj)->min_print_speed - EPSILON; ++ next);
|
||||||
|
Loading…
Reference in New Issue
Block a user