mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	Experimental hole compensation
This commit is contained in:
		
							parent
							
								
									21c99c0953
								
							
						
					
					
						commit
						79aead7c9d
					
				
					 1 changed files with 14 additions and 1 deletions
				
			
		|  | @ -2,10 +2,12 @@ package Slic3r::Perimeter; | ||||||
| use Moo; | use Moo; | ||||||
| 
 | 
 | ||||||
| use Math::Clipper ':all'; | use Math::Clipper ':all'; | ||||||
| use Slic3r::Geometry qw(X Y shortest_path scale); | use Slic3r::Geometry qw(X Y PI shortest_path scale unscale); | ||||||
| use Slic3r::Geometry::Clipper qw(diff_ex); | use Slic3r::Geometry::Clipper qw(diff_ex); | ||||||
| use XXX; | use XXX; | ||||||
| 
 | 
 | ||||||
|  | my $HOLE_COMPENSATION_THRESHOLD; | ||||||
|  | 
 | ||||||
| sub make_perimeter { | sub make_perimeter { | ||||||
|     my $self = shift; |     my $self = shift; | ||||||
|     my ($layer) = @_; |     my ($layer) = @_; | ||||||
|  | @ -34,11 +36,22 @@ sub make_perimeter { | ||||||
|         map [ $_->contour->[0], $_ ], @{$layer->slices}, |         map [ $_->contour->[0], $_ ], @{$layer->slices}, | ||||||
|     ])}; |     ])}; | ||||||
|      |      | ||||||
|  |     $HOLE_COMPENSATION_THRESHOLD ||= ((scale 6.5)**2)*PI; | ||||||
|  |      | ||||||
|     # for each island: |     # for each island: | ||||||
|     foreach my $surface (@surfaces) { |     foreach my $surface (@surfaces) { | ||||||
|         my @last_offsets = ($surface->expolygon); |         my @last_offsets = ($surface->expolygon); | ||||||
|         my $distance = 0; |         my $distance = 0; | ||||||
|          |          | ||||||
|  |         # experimental hole compensation (see ArcCompensation in the RepRap wiki) | ||||||
|  |         foreach my $hole ($last_offsets[0]->holes) { | ||||||
|  |             my $area = abs($hole->area);last; | ||||||
|  |             next unless $area <= $HOLE_COMPENSATION_THRESHOLD; | ||||||
|  |             my $radius = sqrt($area / PI); | ||||||
|  |             my $new_radius = (scale($Slic3r::flow_width) + sqrt((scale($Slic3r::flow_width)**2) + (4*($radius**2)))) / 2; | ||||||
|  |             @$hole = map Slic3r::Point->new($_), @{ +($hole->offset(+ ($new_radius - $radius)))[0] }; | ||||||
|  |         } | ||||||
|  |          | ||||||
|         # create other offsets |         # create other offsets | ||||||
|         push @perimeters, []; |         push @perimeters, []; | ||||||
|         for (my $loop = 0; $loop < $Slic3r::perimeters; $loop++) { |         for (my $loop = 0; $loop < $Slic3r::perimeters; $loop++) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci