diff --git a/lib/Slic3r/Layer.pm b/lib/Slic3r/Layer.pm index aa21c1977..ec350e1d1 100644 --- a/lib/Slic3r/Layer.pm +++ b/lib/Slic3r/Layer.pm @@ -64,7 +64,16 @@ sub support_material_contact_height { # TODO: check what upper region applies instead of considering the first one my $upper_layer = $self->object->layers->[ $self->id + 1 ] // $self; - return 2*$self->height - $upper_layer->regions->[0]->infill_flow->bridge_width; + my $h = ($self->height + $upper_layer->height) - $upper_layer->regions->[0]->infill_flow->bridge_width; + + # If layer height is less than half the bridge width then we'll get a negative height for contact area. + # The optimal solution would be to skip some layers during support material generation, but for now + # we'll apply a (dirty) workaround that should still work. + if ($h <= 0) { + $h = $self->height; + } + + return $h; } # Z used for printing support material contact in scaled coordinates diff --git a/lib/Slic3r/Test.pm b/lib/Slic3r/Test.pm index 1e4531cd4..672c8af4b 100644 --- a/lib/Slic3r/Test.pm +++ b/lib/Slic3r/Test.pm @@ -15,30 +15,34 @@ my %cuboids = ( '2x20x10' => [2, 20,10], ); -sub init_print { - my ($model_name, %params) = @_; +sub model { + my ($model_name) = @_; + + my ($vertices, $facets); + if ($cuboids{$model_name}) { + my ($x, $y, $z) = @{ $cuboids{$model_name} }; + $vertices = [ + [$x,$y,0], [$x,0,0], [0,0,0], [0,$y,0], [$x,$y,$z], [0,$y,$z], [0,0,$z], [$x,0,$z], + ]; + $facets = [ + [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5], + ], + } my $model = Slic3r::Model->new; - { - my ($vertices, $facets); - if ($cuboids{$model_name}) { - my ($x, $y, $z) = @{ $cuboids{$model_name} }; - $vertices = [ - [$x,$y,0], [$x,0,0], [0,0,0], [0,$y,0], [$x,$y,$z], [0,$y,$z], [0,0,$z], [$x,0,$z], - ]; - $facets = [ - [0,1,2], [0,2,3], [4,5,6], [4,6,7], [0,4,7], [0,7,1], [1,7,6], [1,6,2], [2,6,5], [2,5,3], [4,0,3], [4,3,5], - ], - } - $model->add_object(vertices => $vertices)->add_volume(facets => $facets); - } + $model->add_object(vertices => $vertices)->add_volume(facets => $facets); + return $model; +} + +sub init_print { + my ($model_name, %params) = @_; my $config = Slic3r::Config->new_from_defaults; $config->apply($params{config}) if $params{config}; $config->set('gcode_comments', 1) if $ENV{SLIC3R_TESTS_GCODE}; my $print = Slic3r::Print->new(config => $config); - $print->add_model($model); + $print->add_model(model($model_name)); $print->validate; return $print; diff --git a/t/layers.t b/t/layers.t index 3d381788a..06688b336 100644 --- a/t/layers.t +++ b/t/layers.t @@ -1,4 +1,4 @@ -use Test::More tests => 4; +use Test::More tests => 5; use strict; use warnings; @@ -55,4 +55,15 @@ ok $test->(), "positive Z offset"; $config->set('z_offset', -0.8); ok $test->(), "negative Z offset"; +{ + my $config = Slic3r::Config->new_from_defaults; + $config->set('nozzle_diameter', [0.35]); + $config->set('layer_height', 0.1333); + + my $print = Slic3r::Test::init_print('2x20x10', config => $config); + $print->init_extruders; + $_->region(0) for @{$print->objects->[0]->layers}; # init layer regions + ok $print->objects->[0]->layers->[1]->support_material_contact_height > 0, 'support_material_contact_height is positive'; +} + __END__