support_material_synchronize_layers implementation

This commit is contained in:
bubnikv 2016-11-30 16:06:12 +01:00
parent 556204fddc
commit 38cb2842ac
2 changed files with 38 additions and 26 deletions

View File

@ -45,6 +45,7 @@ sub generate {
# We now know the upper and lower boundaries for our support material object # We now know the upper and lower boundaries for our support material object
# (@$contact_z and @$top_z), so we can generate intermediate layers. # (@$contact_z and @$top_z), so we can generate intermediate layers.
my $support_z = $self->support_layers_z( my $support_z = $self->support_layers_z(
$object,
[ sort keys %$contact ], [ sort keys %$contact ],
[ sort keys %$top ], [ sort keys %$top ],
max(map $_->height, @{$object->layers}) max(map $_->height, @{$object->layers})
@ -384,7 +385,7 @@ sub object_top {
} }
sub support_layers_z { sub support_layers_z {
my ($self, $contact_z, $top_z, $max_object_layer_height) = @_; my ($self, $object, $contact_z, $top_z, $max_object_layer_height) = @_;
# quick table to check whether a given Z is a top surface # quick table to check whether a given Z is a top surface
my %top = map { $_ => 1 } @$top_z; my %top = map { $_ => 1 } @$top_z;
@ -397,13 +398,18 @@ sub support_layers_z {
my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter); my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter);
# initialize known, fixed, support layers # initialize known, fixed, support layers
my @z = sort { $a <=> $b } my @z = @$contact_z;
@$contact_z, my $synchronize = $self->object_config->support_material_synchronize_layers;
if (! $synchronize) {
push @z,
# TODO: why we have this? # TODO: why we have this?
# Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z. # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z.
@$top_z, @$top_z;
push @z,
# Top surfaces of the bottom interface layers. # Top surfaces of the bottom interface layers.
(map $_ + $contact_distance, @$top_z); (map $_ + $contact_distance, @$top_z);
}
@z = sort { $a <=> $b } @z;
# enforce first layer height # enforce first layer height
my $first_layer_height = $self->object_config->get_value('first_layer_height'); my $first_layer_height = $self->object_config->get_value('first_layer_height');
@ -423,6 +429,11 @@ sub support_layers_z {
1..($self->object_config->raft_layers - 2); 1..($self->object_config->raft_layers - 2);
} }
if ($synchronize) {
@z = splice @z, $self->object_config->raft_layers;
# if ($self->object_config->raft_layers > scalar(@z));
push @z, map $_->print_z, @{$object->layers};
} else {
# create other layers (skip raft layers as they're already done and use thicker layers) # create other layers (skip raft layers as they're already done and use thicker layers)
for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) { for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) {
my $target_height = $support_material_height; my $target_height = $support_material_height;
@ -442,6 +453,7 @@ sub support_layers_z {
$i++; $i++;
} }
} }
}
# remove duplicates and make sure all 0.x values have the leading 0 # remove duplicates and make sure all 0.x values have the leading 0
{ {

View File

@ -28,7 +28,7 @@ use Slic3r::Test;
interface_flow => $flow, interface_flow => $flow,
first_layer_flow => $flow, first_layer_flow => $flow,
); );
my $support_z = $support->support_layers_z(\@contact_z, \@top_z, $config->layer_height); my $support_z = $support->support_layers_z($print->print->objects->[0], \@contact_z, \@top_z, $config->layer_height);
my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]); my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]);
is $support_z->[0], $config->first_layer_height, is $support_z->[0], $config->first_layer_height,