[slic3r/f20] Backported several bugfixes

Miro Hrončok churchyard at fedoraproject.org
Fri Dec 13 16:48:56 UTC 2013


commit ea2fed3bbe33d57c935abb99a0c934ee34061d24
Author: Miro Hrončok <miro at hroncok.cz>
Date:   Fri Dec 13 17:48:27 2013 +0100

    Backported several bugfixes

 slic3r-1543.patch      |  104 +++++++++++++++++++++++++++++++++++++++++++
 slic3r-1545.patch      |  116 ++++++++++++++++++++++++++++++++++++++++++++++++
 slic3r-1547.patch      |   47 +++++++++++++++++++
 slic3r-1552.patch      |   28 ++++++++++++
 slic3r-1582-1541.patch |  105 +++++++++++++++++++++++++++++++++++++++++++
 slic3r.spec            |   17 +++++++-
 6 files changed, 416 insertions(+), 1 deletions(-)
---
diff --git a/slic3r-1543.patch b/slic3r-1543.patch
new file mode 100644
index 0000000..edd8447
--- /dev/null
+++ b/slic3r-1543.patch
@@ -0,0 +1,104 @@
+From bed1625d6b0fa92da0afb4fae2ec6d036dfbea33 Mon Sep 17 00:00:00 2001
+From: Alessandro Ranellucci <aar at cpan.org>
+Date: Sun, 24 Nov 2013 14:28:17 +0100
+Subject: [PATCH] Split objects could not be repositioned in plater. 3D preview
+ and stats were not available too. #1543
+
+---
+ lib/Slic3r/GUI/Plater.pm | 6 ++++--
+ lib/Slic3r/Model.pm      | 2 +-
+ xs/src/TriangleMesh.cpp  | 3 +++
+ xs/src/admesh/stl.h      | 2 +-
+ xs/t/01_trianglemesh.t   | 3 ++-
+ 5 files changed, 11 insertions(+), 5 deletions(-)
+
+diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm
+index 66d6d35..5eec595 100644
+--- a/lib/Slic3r/GUI/Plater.pm
++++ b/lib/Slic3r/GUI/Plater.pm
+@@ -594,8 +594,10 @@ sub split_object {
+             input_file_object_id    => undef,
+             model                   => $new_model,
+             model_object_idx        => $#{$new_model->objects},
+-            instances               => [ map $bb->min_point, 1..$current_copies_num ],
++            mesh_stats              => $mesh->stats,  # so that we can free model
++            instances               => [ map $bb->min_point->pp, 1..$current_copies_num ],
+         );
++        
+         push @{ $self->{objects} }, $object;
+         $self->object_loaded($#{ $self->{objects} }, no_arrange => 1);
+     }
+@@ -1274,7 +1276,7 @@ has 'thumbnail_scaling_factor' => (is => 'rw', trigger => \&_transform_thumbnail
+ has 'config'                => (is => 'rw', default => sub { Slic3r::Config->new });
+ has 'layer_height_ranges'   => (is => 'rw', default => sub { [] }); # [ z_min, z_max, layer_height ]
+ has 'material_mapping'      => (is => 'rw', default => sub { {} }); # { material_id => extruder_idx }
+-has 'mesh_stats'            => (is => 'rw');
++has 'mesh_stats'            => (is => 'ro', required => 1);
+ 
+ # statistics
+ has 'facets'                => (is => 'rw');
+diff --git a/lib/Slic3r/Model.pm b/lib/Slic3r/Model.pm
+index 3bddb68..3594c9b 100644
+--- a/lib/Slic3r/Model.pm
++++ b/lib/Slic3r/Model.pm
+@@ -308,7 +308,7 @@ use Storable qw(dclone);
+ has 'input_file' => (is => 'rw');
+ has 'model'     => (is => 'ro', weak_ref => 1, required => 1);
+ has 'volumes'   => (is => 'ro', default => sub { [] });
+-has 'instances' => (is => 'rw');
++has 'instances' => (is => 'rw'); # in unscaled coordinates
+ has 'config'    => (is => 'rw', default => sub { Slic3r::Config->new });
+ has 'layer_height_ranges' => (is => 'rw', default => sub { [] }); # [ z_min, z_max, layer_height ]
+ has 'material_mapping'      => (is => 'rw', default => sub { {} }); # { material_id => extruder_idx }
+diff --git a/xs/src/TriangleMesh.cpp b/xs/src/TriangleMesh.cpp
+index bc653d8..9eae734 100644
+--- a/xs/src/TriangleMesh.cpp
++++ b/xs/src/TriangleMesh.cpp
+@@ -532,8 +532,11 @@ void TriangleMesh::rotate(double angle, Point* center)
+         mesh->stl.stats.original_num_facets = mesh->stl.stats.number_of_facets;
+         stl_allocate(&mesh->stl);
+         
++        int first = 1;
+         for (std::deque<int>::const_iterator facet = facets.begin(); facet != facets.end(); facet++) {
+             mesh->stl.facet_start[facet - facets.begin()] = this->stl.facet_start[*facet];
++            stl_facet_stats(&mesh->stl, this->stl.facet_start[*facet], first);
++            first = 0;
+         }
+     }
+     
+diff --git a/xs/src/admesh/stl.h b/xs/src/admesh/stl.h
+index 332a5bf..ac41438 100644
+--- a/xs/src/admesh/stl.h
++++ b/xs/src/admesh/stl.h
+@@ -178,6 +178,6 @@
+ static void stl_count_facets(stl_file *stl, char *file);
+ extern void stl_allocate(stl_file *stl);
+ static void stl_read(stl_file *stl, int first_facet, int first);
+-static void stl_facet_stats(stl_file *stl, stl_facet facet, int first);
++extern void stl_facet_stats(stl_file *stl, stl_facet facet, int first);
+ extern void stl_reallocate(stl_file *stl);
+ extern void stl_get_size(stl_file *stl);
+diff --git a/xs/t/01_trianglemesh.t b/xs/t/01_trianglemesh.t
+index 71ae473..127c8c9 100644
+--- a/xs/t/01_trianglemesh.t
++++ b/xs/t/01_trianglemesh.t
+@@ -4,7 +4,7 @@ use strict;
+ use warnings;
+ 
+ use Slic3r::XS;
+-use Test::More tests => 51;
++use Test::More tests => 52;
+ 
+ is Slic3r::TriangleMesh::hello_world(), 'Hello world!',
+     'hello world';
+@@ -59,6 +59,7 @@ my $cube = {
+         my $meshes = $m->split;
+         is scalar(@$meshes), 1, 'split';
+         isa_ok $meshes->[0], 'Slic3r::TriangleMesh', 'split';
++        is_deeply $m->bb3, $meshes->[0]->bb3, 'split populates stats';
+     }
+     
+     my $m2 = Slic3r::TriangleMesh->new;
+-- 
+1.8.5.1
+
diff --git a/slic3r-1545.patch b/slic3r-1545.patch
new file mode 100644
index 0000000..ac3a44d
--- /dev/null
+++ b/slic3r-1545.patch
@@ -0,0 +1,116 @@
+From 387df3b90024f99c4cd540488374ab41c60ddb60 Mon Sep 17 00:00:00 2001
+From: Alessandro Ranellucci <aar at cpan.org>
+Date: Sun, 24 Nov 2013 13:04:16 +0100
+Subject: [PATCH] Fix regression causing toolchange_gcode to crash Slic3r.
+ Includes regression test. #1545
+
+---
+ lib/Slic3r/GCode.pm       |  8 +++++++-
+ lib/Slic3r/GCode/Layer.pm |  2 +-
+ lib/Slic3r/Print.pm       | 12 ++++--------
+ t/multi.t                 |  1 +
+ 4 files changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm
+index 9ae5d95..c89d98c 100644
+--- a/lib/Slic3r/GCode.pm
++++ b/lib/Slic3r/GCode.pm
+@@ -8,6 +8,7 @@ use Slic3r::Geometry::Clipper qw(union_ex);
+ use Slic3r::Surface ':types';
+ 
+ has 'config'             => (is => 'ro', required => 1);
++has 'extra_variables'    => (is => 'rw', default => sub {{}});
+ has 'extruders'          => (is => 'ro', required => 1);
+ has 'multiple_extruders' => (is => 'lazy');
+ has 'standby_points'     => (is => 'rw');
+@@ -642,7 +643,7 @@ sub set_extruder {
+     
+     # append custom toolchange G-code
+     if (defined $self->extruder && $self->config->toolchange_gcode) {
+-        $gcode .= sprintf "%s\n", $self->print->replace_variables($self->config->toolchange_gcode, {
++        $gcode .= sprintf "%s\n", $self->replace_variables($self->config->toolchange_gcode, {
+             previous_extruder   => $self->extruder->id,
+             next_extruder       => $extruder->id,
+         });
+@@ -741,4 +742,9 @@ sub set_bed_temperature {
+     return $gcode;
+ }
+ 
++sub replace_variables {
++    my ($self, $string, $extra) = @_;
++    return $self->config->replace_options($string, { %{$self->extra_variables}, %{ $extra || {} } });
++}
++
+ 1;
+diff --git a/lib/Slic3r/GCode/Layer.pm b/lib/Slic3r/GCode/Layer.pm
+index 1fd7096..8709ed8 100644
+--- a/lib/Slic3r/GCode/Layer.pm
++++ b/lib/Slic3r/GCode/Layer.pm
+@@ -66,7 +66,7 @@ sub process_layer {
+     
+     # set new layer - this will change Z and force a retraction if retract_layer_change is enabled
+     $gcode .= $self->gcodegen->change_layer($layer);
+-    $gcode .= $self->print->replace_variables($Slic3r::Config->layer_gcode, {
++    $gcode .= $self->gcodegen->replace_variables($Slic3r::Config->layer_gcode, {
+         layer_num => $self->gcodegen->layer->id,
+     }) . "\n" if $Slic3r::Config->layer_gcode;
+     
+diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm
+index a9c9ef3..ed0d806 100644
+--- a/lib/Slic3r/Print.pm
++++ b/lib/Slic3r/Print.pm
+@@ -726,6 +726,7 @@ sub write_gcode {
+     # set up our extruder object
+     my $gcodegen = Slic3r::GCode->new(
+         config              => $self->config,
++        extra_variables     => $self->extra_variables,
+         extruders           => $self->extruders,    # we should only pass the *used* extruders (but maintain the Tx indices right!)
+         layer_count         => $self->layer_count,
+     );
+@@ -749,7 +750,7 @@ sub write_gcode {
+         }
+     };
+     $print_first_layer_temperature->(0);
+-    printf $fh "%s\n", $self->replace_variables($Slic3r::Config->start_gcode);
++    printf $fh "%s\n", $gcodegen->replace_variables($Slic3r::Config->start_gcode);
+     $print_first_layer_temperature->(1);
+     
+     # set other general things
+@@ -902,7 +903,7 @@ sub write_gcode {
+     # write end commands to file
+     print $fh $gcodegen->retract if $gcodegen->extruder;  # empty prints don't even set an extruder
+     print $fh $gcodegen->set_fan(0);
+-    printf $fh "%s\n", $self->replace_variables($Slic3r::Config->end_gcode);
++    printf $fh "%s\n", $gcodegen->replace_variables($Slic3r::Config->end_gcode);
+     
+     foreach my $extruder (@{$self->extruders}) {
+         printf $fh "; filament used = %.1fmm (%.1fcm3)\n",
+@@ -949,12 +950,7 @@ sub expanded_output_filepath {
+         # path is a full path to a file so we use it as it is
+     }
+     
+-    return $self->replace_variables($path, $extra_variables);
+-}
+-
+-sub replace_variables {
+-    my ($self, $string, $extra) = @_;
+-    return $self->config->replace_options($string, { %{$self->extra_variables}, %{ $extra || {} } });
++    return $self->config->replace_options($path, { %{$self->extra_variables}, %$extra_variables });
+ }
+ 
+ # given the path to a file, this function returns its filename with and without extension
+diff --git a/t/multi.t b/t/multi.t
+index d338a2d..c7214e8 100644
+--- a/t/multi.t
++++ b/t/multi.t
+@@ -22,6 +22,7 @@ use Slic3r::Test;
+     $config->set('extruder_offset', [ [0,0], [20,0], [0,20] ]);
+     $config->set('temperature', [200, 180, 170]);
+     $config->set('first_layer_temperature', [206, 186, 166]);
++    $config->set('toolchange_gcode', ';toolchange');  # test that it doesn't crash when this is supplied
+     
+     my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
+     
+-- 
+1.8.5.1
+
diff --git a/slic3r-1547.patch b/slic3r-1547.patch
new file mode 100644
index 0000000..a960d57
--- /dev/null
+++ b/slic3r-1547.patch
@@ -0,0 +1,47 @@
+From 5217bc370a2941221322c26c8cb08b6de4c0e0fd Mon Sep 17 00:00:00 2001
+From: Alessandro Ranellucci <aar at cpan.org>
+Date: Sun, 24 Nov 2013 12:37:36 +0100
+Subject: [PATCH] Fix regression causing retraction restarts to ignore
+ extrusion_axis. Includes regression test. #1547
+
+---
+ lib/Slic3r/GCode.pm | 3 ++-
+ t/gcode.t           | 7 ++++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm
+index 4563cd7..9ae5d95 100644
+--- a/lib/Slic3r/GCode.pm
++++ b/lib/Slic3r/GCode.pm
+@@ -546,7 +546,8 @@ sub unretract {
+             $gcode .= "G11 ; unretract\n";
+         } elsif ($self->config->extrusion_axis) {
+             # use G1 instead of G0 because G0 will blend the restart with the previous travel move
+-            $gcode .= sprintf "G1 E%.5f F%.3f",
++            $gcode .= sprintf "G1 %s%.5f F%.3f",
++                $self->config->extrusion_axis,
+                 $self->extruder->extrude($to_unretract),
+                 $self->extruder->retract_speed_mm_min;
+             $gcode .= " ; compensate retraction" if $self->config->gcode_comments;
+diff --git a/t/gcode.t b/t/gcode.t
+index bb51698..f8ee415 100644
+--- a/t/gcode.t
++++ b/t/gcode.t
+@@ -46,8 +46,13 @@ use Slic3r::Test;
+     my $config = Slic3r::Config->new_from_defaults;
+     $config->set('complete_objects', 1);
+     $config->set('duplicate', 2);
++    $config->set('extrusion_axis', 'A');
+     my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
+-    ok Slic3r::Test::gcode($print), "complete_objects";
++    ok my $gcode = Slic3r::Test::gcode($print), "complete_objects";
++    Slic3r::GCode::Reader->new->parse($gcode, sub {
++        my ($self, $cmd, $args, $info) = @_;
++        fail 'unexpected E argument' if defined $args->{E};
++    });
+ }
+ 
+ __END__
+-- 
+1.8.5.1
+
diff --git a/slic3r-1552.patch b/slic3r-1552.patch
new file mode 100644
index 0000000..4fd3a37
--- /dev/null
+++ b/slic3r-1552.patch
@@ -0,0 +1,28 @@
+From 0afee63e84d61b4af66982723b7777518dac900c Mon Sep 17 00:00:00 2001
+From: Alessandro Ranellucci <aar at cpan.org>
+Date: Sat, 7 Dec 2013 21:03:10 +0100
+Subject: [PATCH] Fixed regression in object placement in STL export. #1552
+
+---
+ lib/Slic3r/Model.pm | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/Slic3r/Model.pm b/lib/Slic3r/Model.pm
+index 23d827c..4ff7e4d 100644
+--- a/lib/Slic3r/Model.pm
++++ b/lib/Slic3r/Model.pm
+@@ -216,9 +216,9 @@ sub mesh {
+         foreach my $instance (@instances) {
+             my $mesh = $object->mesh->clone;
+             if ($instance) {
+-                $mesh->rotate($instance->rotation, Slic3r::Point->new(0,0));
+-                $mesh->scale($instance->scaling_factor);
+                 $mesh->align_to_origin;
++                $mesh->rotate($instance->rotation, $object->center_2D);
++                $mesh->scale($instance->scaling_factor);
+                 $mesh->translate(@{$instance->offset}, 0);
+             }
+             push @meshes, $mesh;
+-- 
+1.8.5.1
+
diff --git a/slic3r-1582-1541.patch b/slic3r-1582-1541.patch
new file mode 100644
index 0000000..e04060e
--- /dev/null
+++ b/slic3r-1582-1541.patch
@@ -0,0 +1,105 @@
+From 00e8ba478176103271ad31bcf867ba0c4444b244 Mon Sep 17 00:00:00 2001
+From: Alessandro Ranellucci <aar at cpan.org>
+Date: Sat, 7 Dec 2013 14:52:59 +0100
+Subject: [PATCH] Fix regression causing complete_objects to skip Z moves after
+ first object is complete. Includes regression test. #1582 #1541
+
+---
+ lib/Slic3r/GCode.pm | 32 ++++++++++++++++++++------------
+ t/gcode.t           | 16 +++++++++++++++-
+ 2 files changed, 35 insertions(+), 13 deletions(-)
+
+diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm
+index c89d98c..26a9ba7 100644
+--- a/lib/Slic3r/GCode.pm
++++ b/lib/Slic3r/GCode.pm
+@@ -130,25 +130,33 @@ sub change_layer {
+ sub move_z {
+     my ($self, $z, $comment) = @_;
+     
+-    $z += $self->config->z_offset;
+-    
+     my $gcode = "";
++    
++    $z += $self->config->z_offset;
+     my $current_z = $self->z;
+-    if (!defined $self->z || $z > $self->z) {
+-        # if we're going over the current Z we won't be lifted anymore
++    my $nominal_z = defined $current_z ? ($current_z - $self->lifted) : undef;
++    
++    if (!defined $current_z || $z > $current_z || $z < $nominal_z) {
++        # we're moving above the current actual Z (so above the lift height of the current
++        # layer if any) or below the current nominal layer
++        
++        # in both cases, we're going to the nominal Z of the next layer
+         $self->lifted(0);
+         
+-        # this retraction may alter $self->z
+-        $gcode .= $self->retract(move_z => $z) if $self->extruder->retract_layer_change;
++        if ($self->extruder->retract_layer_change) {
++            # this retraction may alter $self->z
++            $gcode .= $self->retract(move_z => $z);
++            $current_z = $self->z;  # update current z in case retract() changed it
++            $nominal_z = defined $current_z ? ($current_z - $self->lifted) : undef;
++        }
+         $self->speed('travel');
+         $gcode .= $self->G0(undef, $z, 0, $comment || ('move to next layer (' . $self->layer->id . ')'))
+-            if !defined $self->z || abs($z - ($self->z - $self->lifted)) > epsilon;
+-    } elsif ($z < $self->z && $z > ($self->z - $self->lifted + epsilon)) {
+-        # we're moving to a layer height which is greater than the nominal current one
+-        # (nominal = actual - lifted) and less than the actual one.  we're basically
+-        # advancing to next layer, whose nominal Z is still lower than the previous
++            if !defined $current_z || abs($z - $nominal_z) > epsilon;
++    } elsif ($z < $current_z) {
++        # we're moving above the current nominal layer height and below the current actual one.
++        # we're basically advancing to next layer, whose nominal Z is still lower than the previous
+         # layer Z with lift.
+-        $self->lifted($self->z - $z);
++        $self->lifted($current_z - $z);
+     }
+     
+     return $gcode;
+diff --git a/t/gcode.t b/t/gcode.t
+index f8ee415..17f4ed8 100644
+--- a/t/gcode.t
++++ b/t/gcode.t
+@@ -1,4 +1,4 @@
+-use Test::More tests => 4;
++use Test::More tests => 6;
+ use strict;
+ use warnings;
+ 
+@@ -43,16 +43,30 @@ use Slic3r::Test;
+ }
+ 
+ {
++    # This tests the following behavior:
++    # - complete objects does not crash
++    # - no hard-coded "E" are generated
++    # - Z moves are correctly generated for both objects
+     my $config = Slic3r::Config->new_from_defaults;
+     $config->set('complete_objects', 1);
+     $config->set('duplicate', 2);
+     $config->set('extrusion_axis', 'A');
++    $config->set('start_gcode', '');  # prevent any default extra Z move
++    $config->set('layer_height', 0.4);
++    $config->set('first_layer_height', 0.4);
+     my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
+     ok my $gcode = Slic3r::Test::gcode($print), "complete_objects";
++    my @z_moves = ();
+     Slic3r::GCode::Reader->new->parse($gcode, sub {
+         my ($self, $cmd, $args, $info) = @_;
+         fail 'unexpected E argument' if defined $args->{E};
++        if (defined $args->{Z}) {
++            push @z_moves, $args->{Z};
++        }
+     });
++    my $layer_count = 20/0.4;  # cube is 20mm tall
++    is scalar(@z_moves), 2*$layer_count, 'complete_objects generates the correct number of Z moves';
++    is_deeply [ @z_moves[0..($layer_count-1)] ], [ @z_moves[$layer_count..$#z_moves] ], 'complete_objects generates the correct Z moves';
+ }
+ 
+ __END__
+-- 
+1.8.5.1
+
diff --git a/slic3r.spec b/slic3r.spec
index 54bc3a6..f507ec4 100644
--- a/slic3r.spec
+++ b/slic3r.spec
@@ -2,7 +2,7 @@ Name:           slic3r
 Version:        1.0.0
 %global rcrc    RC1
 %global verrc   %{version}%{rcrc}
-Release:        0.1.%{rcrc}%{?dist}
+Release:        0.2.%{rcrc}%{?dist}
 Summary:        G-code generator for 3D printers (RepRap, Makerbot, Ultimaker etc.)
 License:        AGPLv3 and CC-BY
 # Images are CC-BY, code is AGPLv3
@@ -18,6 +18,12 @@ Patch0:         %{name}-buildpl.patch
 # Those two are located at the same place at the code, so the patch is merged
 Patch1:         %{name}-nowarn-datadir.patch
 
+Patch11:        %{name}-1543.patch
+Patch12:        %{name}-1545.patch
+Patch13:        %{name}-1547.patch
+Patch14:        %{name}-1552.patch
+Patch15:        %{name}-1582-1541.patch
+
 Source1:        %{name}.desktop
 BuildRequires:  perl(Boost::Geometry::Utils) >= 0.15
 BuildRequires:  perl(Class::XSAccessor)
@@ -76,6 +82,12 @@ for more information.
 %patch0 -p1
 %patch1 -p1
 
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+
 %build
 cd xs
 perl ./Build.PL installdirs=vendor optimize="$RPM_OPT_FLAGS"
@@ -123,6 +135,9 @@ SLIC3R_NO_AUTO=1 perl Build.PL installdirs=vendor
 %{_datadir}/%{name}
 
 %changelog
+* Fri Dec 13 2013 Miro Hrončok <mhroncok at redhat.com> - 1.0.0-0.2.RC1
+- Backported several bugfixes
+
 * Wed Nov 20 2013 Miro Hrončok <mhroncok at redhat.com> - 1.0.0-0.1.RC1
 - 1.0.0RC1 version
 - refactor build and install


More information about the scm-commits mailing list