From 1158ce41df8f9219605b4efb0ce08cf4384d08e3 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 30 Jun 2017 17:05:58 +0200 Subject: Finalized implementation of a cooling buffer for multiple extruders with different settings. --- t/cooling.t | 115 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 70 insertions(+), 45 deletions(-) (limited to 't') diff --git a/t/cooling.t b/t/cooling.t index e6426546b..0f0aef618 100644 --- a/t/cooling.t +++ b/t/cooling.t @@ -15,88 +15,113 @@ use Slic3r::Test; my $gcodegen; sub buffer { - my $config = shift || Slic3r::Config->new; - + my $config = shift; + if (defined($config)) { + $config = $config->clone(); + } else { + $config = Slic3r::Config->new; + } + my $config_override = shift; + foreach my $key (keys %{$config_override}) { + $config->set($key, ${$config_override}{$key}); + } + my $print_config = Slic3r::Config::Print->new; $print_config->apply_dynamic($config); $gcodegen = Slic3r::GCode->new; $gcodegen->apply_print_config($print_config); $gcodegen->set_layer_count(10); + $gcodegen->set_elapsed_time(0); return Slic3r::GCode::CoolingBuffer->new($gcodegen); } +my $gcode1 = "G1 X100 E1 F3000\n"; +my $print_time1 = 100 / (3000 / 60); # 2 sec +my $gcode2 = $gcode1 . "G1 X0 E1 F3000\n"; +my $print_time2 = 2 * $print_time1; # 4 sec + my $config = Slic3r::Config->new_from_defaults; -$config->set('disable_fan_first_layers', [ 0 ]); +# Default cooling settings. +$config->set('bridge_fan_speed', [ 100 ]); +$config->set('cooling', [ 1 ]); +$config->set('fan_always_on', [ 0 ]); +$config->set('fan_below_layer_time', [ 60 ]); +$config->set('max_fan_speed', [ 100 ]); +$config->set('min_print_speed', [ 10 ]); +$config->set('slowdown_below_layer_time', [ 5 ]); +# Default print speeds. +$config->set('bridge_speed', 60); +$config->set('external_perimeter_speed', '50%'); +$config->set('first_layer_speed', 30); +$config->set('gap_fill_speed', 20); +$config->set('infill_speed', 80); +$config->set('perimeter_speed', 60); +$config->set('small_perimeter_speed', 15); +$config->set('solid_infill_speed', 20); +$config->set('top_solid_infill_speed', 15); +$config->set('max_print_speed', 80); +# Override for tests. +$config->set('disable_fan_first_layers', [ 0 ]); { - my $buffer = buffer($config); - $buffer->gcodegen->set_elapsed_time($buffer->gcodegen->config->slowdown_below_layer_time->[0] + 1); - my $gcode = $buffer->process_layer('G1 F3000;_EXTRUDE_SET_SPEED\nG1 X100 E1', 0); + my $gcode_src = "G1 F3000;_EXTRUDE_SET_SPEED\nG1 X100 E1"; + # Print time of $gcode. + my $print_time = 100 / (3000 / 60); + my $buffer = buffer($config, { 'slowdown_below_layer_time' => [ $print_time * 0.999 ] }); + my $gcode = $buffer->process_layer($gcode_src, 0); like $gcode, qr/F3000/, 'speed is not altered when elapsed time is greater than slowdown threshold'; } { - my $buffer = buffer($config); - $buffer->gcodegen->set_elapsed_time($buffer->gcodegen->config->slowdown_below_layer_time->[0] - 1); - my $gcode = $buffer->process_layer( + my $gcode_src = "G1 X50 F2500\n" . "G1 F3000;_EXTRUDE_SET_SPEED\n" . "G1 X100 E1\n" . "G1 E4 F400", - 0); + # Print time of $gcode. + my $print_time = 50 / (2500 / 60) + 100 / (3000 / 60) + 4 / (400 / 60); + my $buffer = buffer($config, { 'slowdown_below_layer_time' => [ $print_time * 1.001 ] }); + my $gcode = $buffer->process_layer($gcode_src, 0); unlike $gcode, qr/F3000/, 'speed is altered when elapsed time is lower than slowdown threshold'; like $gcode, qr/F2500/, 'speed is not altered for travel moves'; like $gcode, qr/F400/, 'speed is not altered for extruder-only moves'; } { - my $buffer = buffer($config); - $buffer->gcodegen->set_elapsed_time($buffer->gcodegen->config->fan_below_layer_time->[0] + 1); - my $gcode = $buffer->process_layer('G1 X100 E1 F3000', 0); + my $buffer = buffer($config, { + 'fan_below_layer_time' => [ $print_time1 * 0.88 ], + 'slowdown_below_layer_time' => [ $print_time1 * 0.99 ] + }); + my $gcode = $buffer->process_layer($gcode1, 0); unlike $gcode, qr/M106/, 'fan is not activated when elapsed time is greater than fan threshold'; } { - my $buffer = buffer($config); - my $gcode = ""; - for my $obj_id (0 .. 1) { - $gcode .= "G1 X100 E1 F3000\n"; - } - # use an elapsed time which is < the slowdown threshold but greater than it when summed twice - $buffer->gcodegen->set_elapsed_time(2 * ($buffer->gcodegen->config->slowdown_below_layer_time->[0] - 1)); - $gcode .= $buffer->process_layer($gcode, 0); + my $gcode .= buffer($config, { 'slowdown_below_layer_time', [ $print_time2 * 0.99 ] })->process_layer($gcode2, 0); like $gcode, qr/F3000/, 'slowdown is computed on all objects printing at the same Z'; } { - my $buffer = buffer($config); - my $gcode = ""; - for my $layer_id (0 .. 1) { - my $layer_gcode = ""; - for my $obj_id (0 .. 1) { - $layer_gcode .= "G1 X100 E1 F3000\n"; - } - # use an elapsed time which is < the threshold but greater than it when summed twice - $buffer->gcodegen->set_elapsed_time(2 * ($buffer->gcodegen->config->fan_below_layer_time->[0] - 1)); - $gcode .= $buffer->process_layer($layer_gcode, $layer_id); - } - unlike $gcode, qr/M106/, 'fan activation is computed on all objects printing at different Z'; + # use an elapsed time which is < the threshold but greater than it when summed twice + my $buffer = buffer($config, { + 'fan_below_layer_time' => [ $print_time2 * 0.65], + 'slowdown_below_layer_time' => [ $print_time2 * 0.7 ] + }); + my $gcode = $buffer->process_layer($gcode2, 0) . + $buffer->process_layer($gcode2, 1); + unlike $gcode, qr/M106/, 'fan is not activated on all objects printing at different Z'; } { - my $buffer = buffer($config); - my $gcode = ""; - for my $layer_id (0 .. 1) { - my $layer_gcode = ""; - for my $obj_id (0 .. 1) { - $layer_gcode .= "G1 X100 E1 F3000\n"; - } - # use an elapsed time which is < the threshold even when summed twice - $buffer->gcodegen->set_elapsed_time(2 * ($buffer->gcodegen->config->fan_below_layer_time->[0]/2 - 1)); - $gcode .= $buffer->process_layer($layer_gcode, $layer_id); - } - like $gcode, qr/M106/, 'fan activation is computed on all objects printing at different Z'; + # use an elapsed time which is < the threshold even when summed twice + my $buffer = buffer($config, { + 'fan_below_layer_time' => [ $print_time2 + 1 ], + 'slowdown_below_layer_time' => [ $print_time2 + 2 ] + }); + my $gcode = $buffer->process_layer($gcode2, 0) . + $buffer->process_layer($gcode2, 1); + like $gcode, qr/M106/, 'fan is activated on all objects printing at different Z'; } { -- cgit v1.2.3