From 258842b845f3904d786d0c0d7c3e50de0af8c37f Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 16 Jun 2013 13:31:10 +0200 Subject: [PATCH] New logic for connecting honeycomb loops --- lib/Slic3r/Fill/Honeycomb.pm | 69 ++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/lib/Slic3r/Fill/Honeycomb.pm b/lib/Slic3r/Fill/Honeycomb.pm index bb882ab5b..8b452e8f1 100644 --- a/lib/Slic3r/Fill/Honeycomb.pm +++ b/lib/Slic3r/Fill/Honeycomb.pm @@ -6,7 +6,7 @@ extends 'Slic3r::Fill::Base'; has 'cache' => (is => 'rw', default => sub {{}}); use Slic3r::Geometry qw(PI X Y MIN MAX scale scaled_epsilon); -use Slic3r::Geometry::Clipper qw(intersection_ex); +use Slic3r::Geometry::Clipper qw(intersection); sub angles () { [0, PI/3, PI/3*2] } @@ -77,40 +77,49 @@ sub fill_surface { $_->rotate(-$rotate_vector->[0][0], $m->{hex_center}) for @polygons; } - # consider polygons as polylines without re-appending the initial point: - # this cuts the last segment on purpose, so that the jump to the next - # path is more straight - my @paths = map Slic3r::Polyline->new($_), - @{ Boost::Geometry::Utils::polygon_multi_linestring_intersection( - $surface->expolygon, - \@polygons, - ) }; - - # connect paths - { - my $collection = Slic3r::Polyline::Collection->new(polylines => [@paths]); - @paths = (); - foreach my $path ($collection->chained_path) { - if (@paths) { - # distance between first point of this path and last point of last path - my $distance = $paths[-1][-1]->distance_to($path->[0]); - - if ($distance <= $m->{hex_width}) { - push @{$paths[-1]}, @$path; - next; + my @paths; + if ($params{complete}) { + # we were requested to complete each loop; + # in this case we don't try to make more continuous paths + @paths = map $_->split_at_first_point, + @{intersection($surface->expolygon, \@polygons)}; + + } else { + # consider polygons as polylines without re-appending the initial point: + # this cuts the last segment on purpose, so that the jump to the next + # path is more straight + @paths = map Slic3r::Polyline->new($_), + @{ Boost::Geometry::Utils::polygon_multi_linestring_intersection( + $surface->expolygon, + \@polygons, + ) }; + + # connect paths + { + my $collection = Slic3r::Polyline::Collection->new(polylines => [@paths]); + @paths = (); + foreach my $path ($collection->chained_path) { + if (@paths) { + # distance between first point of this path and last point of last path + my $distance = $paths[-1][-1]->distance_to($path->[0]); + + if ($distance <= $m->{hex_width}) { + push @{$paths[-1]}, @$path; + next; + } } + push @paths, $path; } - push @paths, $path; } + + # clip paths again to prevent connection segments from crossing the expolygon boundaries + @paths = map Slic3r::Polyline->new($_), + @{ Boost::Geometry::Utils::multi_polygon_multi_linestring_intersection( + [ $surface->expolygon->offset_ex(scaled_epsilon) ], + [ @paths ], + ) }; } - # clip paths again to prevent connection segments from crossing the expolygon boundaries - @paths = map Slic3r::Polyline->new($_), - @{ Boost::Geometry::Utils::multi_polygon_multi_linestring_intersection( - [ $surface->expolygon->offset_ex(scaled_epsilon) ], - [ @paths ], - ) }; - return { flow_spacing => $params{flow_spacing} }, @paths; }