commit ea2fed3bbe33d57c935abb99a0c934ee34061d24 Author: Miro Hrončok <miro@xxxxxxxxxx> 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@xxxxxxxx> +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@xxxxxxxx> +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@xxxxxxxx> +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@xxxxxxxx> +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@xxxxxxxx> +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@xxxxxxxxxx> - 1.0.0-0.2.RC1 +- Backported several bugfixes + * Wed Nov 20 2013 Miro Hrončok <mhroncok@xxxxxxxxxx> - 1.0.0-0.1.RC1 - 1.0.0RC1 version - refactor build and install -- Fedora Extras Perl SIG http://www.fedoraproject.org/wiki/Extras/SIGs/Perl perl-devel mailing list perl-devel@xxxxxxxxxxxxxxxxxxxxxxx https://admin.fedoraproject.org/mailman/listinfo/perl-devel