Skip to content

Commit

Permalink
Bugfix: when using low layer heights and support material, the contac…
Browse files Browse the repository at this point in the history
…t regions were generated with a negative height. #1013
  • Loading branch information
alranel committed Feb 23, 2013
1 parent 3eedd4b commit 5049627
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 18 deletions.
11 changes: 10 additions & 1 deletion lib/Slic3r/Layer.pm
Expand Up @@ -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
Expand Down
36 changes: 20 additions & 16 deletions lib/Slic3r/Test.pm
Expand Up @@ -15,30 +15,34 @@ my %cuboids = (
'2x20x10' => [2, 20,10],
);

sub init_print {
my ($model_name, %params) = @_;
sub model {
my ($model_name) = @_;

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);
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;
$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;
Expand Down
13 changes: 12 additions & 1 deletion t/layers.t
@@ -1,4 +1,4 @@
use Test::More tests => 4;
use Test::More tests => 5;
use strict;
use warnings;

Expand Down Expand Up @@ -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__

0 comments on commit 5049627

Please sign in to comment.