Bugfix: incorrect number of raft layers was generated when too few were requested. #1678

This commit is contained in:
Alessandro Ranellucci 2014-01-11 23:16:33 +01:00
parent 26f0fab27a
commit 130e8dd8e7
4 changed files with 55 additions and 5 deletions

View File

@ -26,17 +26,30 @@ sub BUILD {
# make layers taking custom heights into account # make layers taking custom heights into account
my $print_z = my $slice_z = my $height = my $id = 0; my $print_z = my $slice_z = my $height = my $id = 0;
my $first_object_layer_height = -1;
# add raft layers # add raft layers
if ($self->config->raft_layers > 0) { if ($self->config->raft_layers > 0) {
$id += $self->config->raft_layers;
# raise first object layer Z by the thickness of the raft itself
# plus the extra distance required by the support material logic
$print_z += $Slic3r::Config->get_value('first_layer_height'); $print_z += $Slic3r::Config->get_value('first_layer_height');
$print_z += $Slic3r::Config->layer_height * ($self->config->raft_layers - 1); $print_z += $Slic3r::Config->layer_height * ($self->config->raft_layers - 1);
$id += $self->config->raft_layers;
# at this stage we don't know which nozzles are actually used for the first layer
# so we compute the average of all of them
my $nozzle_diameter = sum(@{$Slic3r::Config->nozzle_diameter})/@{$Slic3r::Config->nozzle_diameter};
my $distance = Slic3r::Print::SupportMaterial::contact_distance($nozzle_diameter);
# force first layer print_z according to the contact distance
# (the loop below will raise print_z by such height)
$first_object_layer_height = $distance;
} }
# loop until we have at least one layer and the max slice_z reaches the object height # loop until we have at least one layer and the max slice_z reaches the object height
my $max_z = unscale $self->size->[Z]; my $max_z = unscale $self->size->[Z];
while (!@{$self->layers} || ($slice_z - $height) <= $max_z) { while (($slice_z - $height) <= $max_z) {
# assign the default height to the layer according to the general settings # assign the default height to the layer according to the general settings
$height = ($id == 0) $height = ($id == 0)
? $Slic3r::Config->get_value('first_layer_height') ? $Slic3r::Config->get_value('first_layer_height')
@ -53,6 +66,10 @@ sub BUILD {
} }
} }
if ($first_object_layer_height != -1 && !@{$self->layers}) {
$height = $first_object_layer_height;
}
$print_z += $height; $print_z += $height;
$slice_z += $height/2; $slice_z += $height/2;

View File

@ -174,7 +174,7 @@ sub contact_area {
@{$layer->regions}; @{$layer->regions};
my $nozzle_diameter = sum(@nozzle_diameters)/@nozzle_diameters; my $nozzle_diameter = sum(@nozzle_diameters)/@nozzle_diameters;
my $contact_z = $layer->print_z - $nozzle_diameter * 1.5; my $contact_z = $layer->print_z - contact_distance($nozzle_diameter);
###$contact_z = $layer->print_z - $layer->height; ###$contact_z = $layer->print_z - $layer->height;
# ignore this contact area if it's too low # ignore this contact area if it's too low
@ -636,4 +636,10 @@ sub overlapping_layers {
} 0..$#$support_z; } 0..$#$support_z;
} }
# class method
sub contact_distance {
my ($nozzle_diameter) = @_;
return $nozzle_diameter * 1.5;
}
1; 1;

View File

@ -1,4 +1,4 @@
use Test::More tests => 7; use Test::More tests => 8;
use strict; use strict;
use warnings; use warnings;

View File

@ -1,4 +1,4 @@
use Test::More tests => 14; use Test::More tests => 15;
use strict; use strict;
use warnings; use warnings;
@ -123,4 +123,31 @@ use Slic3r::Test;
'first object layer is completely supported by raft'; 'first object layer is completely supported by raft';
} }
{
my $config = Slic3r::Config->new_from_defaults;
$config->set('skirts', 0);
$config->set('raft_layers', 2);
$config->set('layer_height', 0.35);
$config->set('first_layer_height', 0.3);
$config->set('nozzle_diameter', [0.5]);
$config->set('support_material_extruder', 2);
$config->set('support_material_interface_extruder', 2);
my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
my %raft_z = (); # z => 1
my $tool = undef;
Slic3r::GCode::Reader->new->parse(Slic3r::Test::gcode($print), sub {
my ($self, $cmd, $args, $info) = @_;
if ($cmd =~ /^T(\d+)/) {
$tool = $1;
} elsif ($info->{extruding} && $info->{dist_XY} > 0) {
if ($tool == $config->support_material_extruder-1) {
$raft_z{$self->Z} = 1;
}
}
});
is scalar(keys %raft_z), $config->raft_layers, 'correct number of raft layers is generated';
}
__END__ __END__