diff options
author | Alessandro Ranellucci <aar@cpan.org> | 2014-02-13 04:00:17 +0400 |
---|---|---|
committer | Alessandro Ranellucci <aar@cpan.org> | 2014-02-13 19:11:02 +0400 |
commit | 0060873f1c01013a02e5a4d66ec868fb8952f794 (patch) | |
tree | ad203899d0d52ef240655915c79c278460213905 /t/shells.t | |
parent | 94cb298eecb14a3c9bd9a387f6a5867b89bea449 (diff) |
Regression test and incomplete fix for bug affecting wrong spiral vase output. #1773
Conflicts:
lib/Slic3r/GCode/Layer.pm
Diffstat (limited to 't/shells.t')
-rw-r--r-- | t/shells.t | 71 |
1 files changed, 68 insertions, 3 deletions
diff --git a/t/shells.t b/t/shells.t index 541c7cb75..1f9f422d0 100644 --- a/t/shells.t +++ b/t/shells.t @@ -1,4 +1,4 @@ -use Test::More tests => 12; +use Test::More tests => 17; use strict; use warnings; @@ -7,10 +7,11 @@ BEGIN { use lib "$FindBin::Bin/../lib"; } -use List::Util qw(first); +use List::Util qw(first sum); use Slic3r; +use Slic3r::Geometry qw(epsilon); use Slic3r::Test; - +goto T; { my $config = Slic3r::Config->new_from_defaults; $config->set('skirts', 0); @@ -166,6 +167,7 @@ use Slic3r::Test; if $started_extruding && exists $args->{Z}; $travel_moves_after_first_extrusion++ if $info->{travel} && $started_extruding && !exists $args->{Z}; + print "\n\n\n\n" if $info->{travel} && $started_extruding && !exists $args->{Z}; }); is $travel_moves_after_first_extrusion, 0, "no gaps in spiral vase ($description)"; ok !(grep { $_ > $config->layer_height } @z_steps), "no gaps in Z ($description)"; @@ -178,4 +180,67 @@ use Slic3r::Test; $test->('20mm_cube', 'solid model with negative z-offset'); } +T: { + my $config = Slic3r::Config->new_from_defaults; + $config->set('spiral_vase', 1); + $config->set('bottom_solid_layers', 0); + $config->set('skirts', 0); + $config->set('first_layer_height', '100%'); + $config->set('layer_height', 0.4); + $config->set('start_gcode', ''); + + my $print = Slic3r::Test::init_print('20mm_cube', config => $config); + my $first_z_move_done = 0; + my $first_layer_done = 0; + my @this_layer = (); # [ dist_Z, dist_XY ], ... + + my $bottom_layer_not_flat = 0; + my $null_z_moves_not_layer_changes = 0; + my $null_z_moves_not_multiples_of_layer_height = 0; + my $sum_of_partial_z_equals_to_layer_height = 0; + my $all_layer_segments_have_same_slope = 0; + my $horizontal_extrusions = 0; + Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub { + my ($self, $cmd, $args, $info) = @_; + + if ($cmd eq 'G1') { + if (!$first_z_move_done) { + $bottom_layer_not_flat = 1 + if $info->{dist_Z} != $config->layer_height; + $first_z_move_done = 1; + } elsif (!$first_layer_done) { + $first_layer_done = 1 if $info->{dist_Z} > 0; + } elsif ($info->{dist_Z} == 0 && $args->{Z}) { + $null_z_moves_not_layer_changes = 1 + if $info->{dist_XY} != 0; + + # % doesn't work easily with floats + $null_z_moves_not_multiples_of_layer_height = 1 + if abs(($args->{Z} / $config->layer_height) * $config->layer_height - $args->{Z}) > epsilon; + + my $total_dist_XY = sum(map $_->[1], @this_layer); + $sum_of_partial_z_equals_to_layer_height = 1 + if abs(sum(map $_->[0], @this_layer) - $config->layer_height) > epsilon; + foreach my $segment (@this_layer) { + # check that segment's dist_Z is proportioned to its dist_XY + $all_layer_segments_have_same_slope = 1 + if abs($segment->[0]*$total_dist_XY/$config->layer_height - $segment->[1]) > epsilon; + } + + @this_layer = (); + } else { + $horizontal_extrusions = 1 + if $info->{dist_Z} == 0; + push @this_layer, [ $info->{dist_Z}, $info->{dist_XY} ]; + } + } + }); + ok !$bottom_layer_not_flat, 'bottom layer is flat when using spiral vase'; + ok !$null_z_moves_not_layer_changes, 'null Z moves are layer changes'; + ok !$null_z_moves_not_multiples_of_layer_height, 'null Z moves are multiples of layer height'; + ok !$sum_of_partial_z_equals_to_layer_height, 'sum of partial Z increments equals to a full layer height'; + ok !$all_layer_segments_have_same_slope, 'all layer segments have the same slope'; + ok !$horizontal_extrusions, 'no horizontal extrusions'; +} + __END__ |