From 2d784fac9b503b5d246886e2c62289d83ee63e26 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Fri, 14 Oct 2011 16:24:55 +0200 Subject: [PATCH] New --start-gcode and --end-gcode options. #12 --- README.markdown | 18 +++++++++++++----- lib/Slic3r.pm | 8 +++++++- lib/Slic3r/Config.pm | 31 +++++++++++++++++++++++++++++++ lib/Slic3r/Print.pm | 8 ++------ slic3r.pl | 10 ++++++++++ 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/README.markdown b/README.markdown index 18153e29f..a713a243c 100644 --- a/README.markdown +++ b/README.markdown @@ -46,12 +46,12 @@ Slic3r current features are: * center print around bed center point; * multiple solid layers near horizontal external surfaces; * ability to scale, rotate and multiply input object; +* customizable initial and final GCODE (using command line only); * use different speed for bottom layer and perimeters. Roadmap includes the following goals: * output some statistics; -* allow the user to customize initial and final GCODE commands; * support material for internal perimeters; * cool; * other fill patterns. @@ -83,10 +83,9 @@ The author is Alessandro Ranellucci (me). --save Save configuration to the specified file --load Load configuration from the specified file -o, --output File to output gcode to (default: .gcode) - Printer options: - --nozzle-diameter Diameter of nozzle in mm (default: 0.55) + --nozzle-diameter Diameter of nozzle in mm (default: 0.5) --print-center Coordinates of the point to center the print around (default: 100,100) --use-relative-e-distances @@ -98,7 +97,7 @@ The author is Alessandro Ranellucci (me). --filament-diameter Diameter of your raw filament (default: 3) --filament-packing-density Ratio of the extruded volume over volume pushed - into the extruder (default: 0.85) + into the extruder (default: 1) --temperature Extrusion temperature (default: 200) Speed options: @@ -112,6 +111,9 @@ The author is Alessandro Ranellucci (me). Accuracy options: --layer-height Layer height in mm (default: 0.4) + --high-res-perimeters + Print perimeters at half layer height to get surface accuracy + (default: disabled) Print options: --perimeters Number of perimeters/horizontal skins (range: 1+, @@ -120,6 +122,11 @@ The author is Alessandro Ranellucci (me). (range: 1+, default: 3) --fill-density Infill density (range: 0-1, default: 0.4) --fill-angle Infill angle in degrees (range: 0-90, default: 0) + --start-gcode Load initial gcode from the supplied file. This will overwrite + the default command (home all axes [G28]). + --end-gcode Load final gcode from the supplied file. This will overwrite + the default commands (turn off temperature [M104 S0], + home X axis [G28 X], disable motors [M84]). Retraction options: --retract-length Length of retraction in mm when pausing extrusion @@ -129,7 +136,7 @@ The author is Alessandro Ranellucci (me). Additional amount of filament in mm to push after compensating retraction (default: 0) --retract-before-travel - Only retract before travel moves of this length (default: 1) + Only retract before travel moves of this length (default: 2) Skirt options: --skirts Number of skirts to draw (default: 1) @@ -143,3 +150,4 @@ The author is Alessandro Ranellucci (me). --multiply-y Number of items along Y axis (1+, default: 1) --multiply-distance Distance in mm between copies (default: 6) + diff --git a/lib/Slic3r.pm b/lib/Slic3r.pm index d399cedaf..4f4808f8a 100644 --- a/lib/Slic3r.pm +++ b/lib/Slic3r.pm @@ -38,6 +38,7 @@ our $z_offset = 0; # filament options our $filament_diameter = 3; # mm our $filament_packing_density = 1; +our $temperature = 200; # speed options our $print_feed_rate = 60; # mm/sec @@ -59,7 +60,12 @@ our $bridge_overlap = 3; # mm our $fill_type = 'rectilinear'; our $fill_density = 0.4; # 1 = 100% our $fill_angle = 0; -our $temperature = 200; +our $start_gcode = "G28 ; home all axes"; +our $end_gcode = <<"END"; +M104 S0 ; turn off temperature +G28 X0 ; home X axis +M84 ; disable motors +END # retraction options our $retract_length = 1; # mm diff --git a/lib/Slic3r/Config.pm b/lib/Slic3r/Config.pm index cde96469e..05363b2a0 100644 --- a/lib/Slic3r/Config.pm +++ b/lib/Slic3r/Config.pm @@ -86,6 +86,18 @@ our $Options = { label => 'Fill angle (°)', type => 'i', }, + 'start_gcode' => { + label => 'Start GCODE', + type => 's', + serialize => sub { join '\n', split /\R+/, $_[0] }, + deserialize => sub { join "\n", split /\\n/, $_[0] }, + }, + 'end_gcode' => { + label => 'End GCODE', + type => 's', + serialize => sub { join '\n', split /\R+/, $_[0] }, + deserialize => sub { join "\n", split /\\n/, $_[0] }, + }, # retraction options 'retract_length' => { @@ -179,6 +191,25 @@ sub load { close $fh; } +sub validate_cli { + my $class = shift; + my ($opt) = @_; + + for (qw(start end)) { + if (defined $opt->{$_."_gcode"}) { + if ($opt->{$_."_gcode"} eq "") { + set($_."_gcode", ""); + } else { + die "Invalid value for --${_}-gcode: file does not exist" + if !-e $opt->{$_."_gcode"}; + open my $fh, "<", $opt->{$_."_gcode"}; + set($_."_gcode", do { local $/; <$fh> }); + close $fh; + } + } + } +} + sub validate { my $class = shift; diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index ef889a362..d08b1fd54 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -325,9 +325,8 @@ sub export_gcode { or die "Failed to open $file for writing\n"; # write start commands to file - # TODO: this must be customizable by user - print $fh "G28 ; home all axes\n"; printf $fh "M104 S%d ; wait for temperature to be reached\n", $Slic3r::temperature; + print $fh "$Slic3r::start_gcode\n"; print $fh "G90 ; use absolute coordinates\n"; print $fh "G21 ; set units to millimeters\n"; if ($Slic3r::use_relative_e_distances) { @@ -375,10 +374,7 @@ sub export_gcode { } # write end commands to file - # TODO: this must be customizable by user - print $fh "M104 S0 ; turn off temperature\n"; - print $fh "G28 X0 ; home X axis\n"; - print $fh "M84 ; disable motors\n"; + print $fh "$Slic3r::end_gcode\n"; # close our gcode file close $fh; diff --git a/slic3r.pl b/slic3r.pl index fc74423fa..d434a4e0e 100755 --- a/slic3r.pl +++ b/slic3r.pl @@ -49,6 +49,8 @@ GetOptions( 'fill-type=s' => \$Slic3r::fill_type, 'fill-density=f' => \$Slic3r::fill_density, 'fill-angle=i' => \$Slic3r::fill_angle, + 'start-gcode=s' => \$opt{start_gcode}, + 'end-gcode=s' => \$opt{end_gcode}, # retraction options 'retract-length=f' => \$Slic3r::retract_length, @@ -74,6 +76,9 @@ if ($opt{load}) { Slic3r::Config->load($opt{load}); } +# validate command line options +Slic3r::Config->validate_cli(\%opt); + # validate configuration Slic3r::Config->validate; @@ -153,6 +158,11 @@ Usage: slic3r.pl [ OPTIONS ] file.stl (range: 1+, default: $Slic3r::solid_layers) --fill-density Infill density (range: 0-1, default: $Slic3r::fill_density) --fill-angle Infill angle in degrees (range: 0-90, default: $Slic3r::fill_angle) + --start-gcode Load initial gcode from the supplied file. This will overwrite + the default command (home all axes [G28]). + --end-gcode Load final gcode from the supplied file. This will overwrite + the default commands (turn off temperature [M104 S0], + home X axis [G28 X], disable motors [M84]). Retraction options: --retract-length Length of retraction in mm when pausing extrusion