[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