diff --git a/lib/Slic3r.pm b/lib/Slic3r.pm index 3408eced..69449368 100644 --- a/lib/Slic3r.pm +++ b/lib/Slic3r.pm @@ -68,6 +68,11 @@ our $solid_infill_speed = 60; # mm/sec our $bridge_speed = 60; # mm/sec our $bottom_layer_speed_ratio = 0.3; +# acceleration options +our $acceleration = 0; +our $perimeter_acceleration = 25; # mm/sec^2 +our $infill_acceleration = 50; # mm/sec^2 + # accuracy options our $resolution = 0.00000001; our $small_perimeter_area = (5 / $resolution) ** 2; diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index d042caa3..4bf2427a 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -133,6 +133,23 @@ our $Options = { type => 'f', }, + # acceleration options + 'acceleration' => { + label => 'Enable acceleration control', + cli => 'acceleration', + type => 'bool', + }, + 'perimeter_acceleration' => { + label => 'Perimeters (mm/s^2)', + cli => 'perimeter-acceleration', + type => 'f', + }, + 'infill_acceleration' => { + label => 'Infill (mm/s^2)', + cli => 'infill-acceleration', + type => 'f', + }, + # accuracy options 'layer_height' => { label => 'Layer height (mm)', diff --git a/lib/Slic3r/Extruder.pm b/lib/Slic3r/Extruder.pm index 9711e0c3..61e37a9f 100644 --- a/lib/Slic3r/Extruder.pm +++ b/lib/Slic3r/Extruder.pm @@ -233,6 +233,15 @@ sub unretract { return $gcode; } +sub set_acceleration { + my $self = shift; + my ($acceleration) = @_; + return unless $Slic3r::acceleration; + + return sprintf "M201 E%s%s\n", + $acceleration, ($Slic3r::gcode_comments ? ' ; adjust acceleration' : ''); +} + sub G0 { my $self = shift; return $self->G1(@_) if !$Slic3r::g0; diff --git a/lib/Slic3r/GUI/SkeinPanel.pm b/lib/Slic3r/GUI/SkeinPanel.pm index 5bbb2fa7..0d4636c8 100644 --- a/lib/Slic3r/GUI/SkeinPanel.pm +++ b/lib/Slic3r/GUI/SkeinPanel.pm @@ -35,6 +35,10 @@ sub new { title => 'Other speed settings', options => [qw(travel_speed bottom_layer_speed_ratio)], }, + acceleration => { + title => 'Acceleration settings', + options => [qw(acceleration perimeter_acceleration infill_acceleration)], + }, accuracy => { title => 'Accuracy', options => [qw(layer_height first_layer_height_ratio infill_every_layers)], @@ -101,7 +105,7 @@ sub new { my @tabs = ( $make_tab->([qw(transform accuracy skirt)], [qw(print retract)]), - $make_tab->([qw(printer filament)], [qw(print_speed speed)]), + $make_tab->([qw(printer filament)], [qw(print_speed speed acceleration)]), $make_tab->([qw(gcode)]), $make_tab->([qw(notes)]), $make_tab->([qw(extrusion)], [qw(output)]), diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index f9f0413c..e9f4f41a 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -502,12 +502,14 @@ sub export_gcode { print $fh $extruder->change_layer($layer); # extrude skirts + print $fh $extruder->set_acceleration($Slic3r::perimeter_acceleration); print $fh $extruder->extrude_loop($_, 'skirt') for @{ $layer->skirts }; # extrude perimeters print $fh $extruder->extrude($_, 'perimeter') for @{ $layer->perimeters }; # extrude fills + print $fh $extruder->set_acceleration($Slic3r::infill_acceleration); for my $fill (@{ $layer->fills }) { print $fh $extruder->extrude_path($_, 'fill') for $fill->shortest_path($extruder->last_pos);