mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	New logic for connecting honeycomb loops
This commit is contained in:
		
							parent
							
								
									9ff85898b1
								
							
						
					
					
						commit
						258842b845
					
				
					 1 changed files with 39 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue