From 38cb2842acc18680b35f3ccc82f85282ef01eb88 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 30 Nov 2016 16:06:12 +0100 Subject: [PATCH] support_material_synchronize_layers implementation --- lib/Slic3r/Print/SupportMaterial.pm | 62 +++++++++++++++++------------ t/support.t | 2 +- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/lib/Slic3r/Print/SupportMaterial.pm b/lib/Slic3r/Print/SupportMaterial.pm index 9dbfe4003..5aad19cad 100644 --- a/lib/Slic3r/Print/SupportMaterial.pm +++ b/lib/Slic3r/Print/SupportMaterial.pm @@ -45,6 +45,7 @@ sub generate { # We now know the upper and lower boundaries for our support material object # (@$contact_z and @$top_z), so we can generate intermediate layers. my $support_z = $self->support_layers_z( + $object, [ sort keys %$contact ], [ sort keys %$top ], max(map $_->height, @{$object->layers}) @@ -384,7 +385,7 @@ sub object_top { } 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 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); # initialize known, fixed, support layers - my @z = sort { $a <=> $b } - @$contact_z, - # TODO: why we have this? - # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z. - @$top_z, - # Top surfaces of the bottom interface layers. - (map $_ + $contact_distance, @$top_z); + my @z = @$contact_z; + my $synchronize = $self->object_config->support_material_synchronize_layers; + if (! $synchronize) { + push @z, + # TODO: why we have this? + # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z. + @$top_z; + push @z, + # Top surfaces of the bottom interface layers. + (map $_ + $contact_distance, @$top_z); + } + @z = sort { $a <=> $b } @z; # enforce first layer height my $first_layer_height = $self->object_config->get_value('first_layer_height'); @@ -423,23 +429,29 @@ sub support_layers_z { 1..($self->object_config->raft_layers - 2); } - # 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--) { - my $target_height = $support_material_height; - if ($i > 0 && $top{ $z[$i-1] }) { - # Bridge flow? - #FIXME We want to enforce not only the bridge flow height, but also the interface gap! - # This will introduce an additional layer if the gap is set to an extreme value! - $target_height = $nozzle_diameter; - } - - # enforce first layer height - #FIXME better to split the layers regularly, than to bite a constant height one at a time, - # and then be left with a very thin layer at the end. - if (($i == 0 && $z[$i] > $target_height + $first_layer_height) - || ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) { - splice @z, $i, 0, ($z[$i] - $target_height); - $i++; + 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) + for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) { + my $target_height = $support_material_height; + if ($i > 0 && $top{ $z[$i-1] }) { + # Bridge flow? + #FIXME We want to enforce not only the bridge flow height, but also the interface gap! + # This will introduce an additional layer if the gap is set to an extreme value! + $target_height = $nozzle_diameter; + } + + # enforce first layer height + #FIXME better to split the layers regularly, than to bite a constant height one at a time, + # and then be left with a very thin layer at the end. + if (($i == 0 && $z[$i] > $target_height + $first_layer_height) + || ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) { + splice @z, $i, 0, ($z[$i] - $target_height); + $i++; + } } } diff --git a/t/support.t b/t/support.t index 3eba6e64b..303f77088 100644 --- a/t/support.t +++ b/t/support.t @@ -28,7 +28,7 @@ use Slic3r::Test; interface_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]); is $support_z->[0], $config->first_layer_height,