mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	 f46226b32f
			
		
	
	
		f46226b32f
		
	
	
	
	
		
			
			Guards against issue of slightly off-vertical walls triggering extra infill on layers that should be empty when combining infill.
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| use Test::More tests => 3;
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| BEGIN {
 | |
|     use FindBin;
 | |
|     use lib "$FindBin::Bin/../lib";
 | |
| }
 | |
| 
 | |
| use List::Util qw(first);
 | |
| use Slic3r;
 | |
| use Slic3r::Test;
 | |
| 
 | |
| {
 | |
|     my $config = Slic3r::Config->new_from_defaults;
 | |
|     $config->set('skirts', 0);
 | |
|     $config->set('solid_layers', 0);
 | |
|     $config->set('bottom_solid_layers', 0);
 | |
|     $config->set('top_solid_layers', 0);
 | |
|     $config->set('infill_every_layers', 6);
 | |
|     $config->set('layer_height', 0.06);
 | |
|     
 | |
|     my $test = sub {
 | |
|         my ($shift) = @_;
 | |
|         
 | |
|         my $self = Slic3r::Test::init_print('20mm_cube', config => $config);
 | |
|         
 | |
|         $shift /= &Slic3r::SCALING_FACTOR;
 | |
| 
 | |
|         # Put a slope on the box's sides by shifting x and y coords by $tilt * (z / boxheight).
 | |
|         # The test here is to put such a slight slope on the walls that it should
 | |
|         # not trigger any extra fill on fill layers that should be empty when 
 | |
|         # combine infill is enabled.
 | |
|         $_->[0] += $shift * ($_->[2] / (20 / &Slic3r::SCALING_FACTOR)), for @{$self->objects->[0]->meshes->[0]->vertices};
 | |
|         $_->[1] += $shift * ($_->[2] / (20 / &Slic3r::SCALING_FACTOR)), for @{$self->objects->[0]->meshes->[0]->vertices};
 | |
|             
 | |
|         # copy of Print::export_gcode() up to the point 
 | |
|         # after fill surfaces are combined
 | |
|         $self->init_extruders;
 | |
|         $_->slice(keep_meshes => 1) for @{$self->objects};
 | |
|         $_->make_perimeters for @{$self->objects};
 | |
|         foreach my $layer (map @{$_->layers}, @{$self->objects}) {
 | |
|             $_->simplify(&Slic3r::SCALED_RESOLUTION)
 | |
|                 for @{$layer->slices}, (map $_->expolygon, map @{$_->slices}, @{$layer->regions});
 | |
|         }
 | |
|         $_->detect_surfaces_type for @{$self->objects};
 | |
|         $_->prepare_fill_surfaces for map @{$_->regions}, map @{$_->layers}, @{$self->objects};
 | |
|         $_->process_bridges for map @{$_->regions}, map @{$_->layers}, @{$self->objects};
 | |
|         $_->discover_horizontal_shells for @{$self->objects};
 | |
|         $_->combine_infill for @{$self->objects};
 | |
| 
 | |
|         # Only layers with id % 6 == 0 should have fill.
 | |
|         my $spurious_infill = 0;
 | |
|         foreach my $layer (map @{$_->layers}, @{$self->objects}) {
 | |
|             ++$spurious_infill if ($layer->id % 6 && grep @{$_->fill_surfaces} > 0, @{$layer->regions});
 | |
|         }
 | |
| 
 | |
|         $spurious_infill -= scalar(@{$self->objects->[0]->layers} - 1) % 6;
 | |
|         
 | |
|         fail "spurious fill surfaces found on layers that should have none (walls " . sprintf("%.4f", Slic3r::Geometry::rad2deg(atan2($shift, 20/&Slic3r::SCALING_FACTOR))) . " degrees off vertical)"
 | |
|             unless $spurious_infill == 0;
 | |
|         1;
 | |
|     };
 | |
|     
 | |
|     # Test with mm skew offsets for the top of the 20mm-high box
 | |
|     for my $shift (0, 0.0001, 1) {
 | |
|         ok $test->($shift), "no spurious fill surfaces with box walls " . sprintf("%.4f",Slic3r::Geometry::rad2deg(atan2($shift, 20))) . " degrees off of vertical";
 | |
|     }
 | |
| }
 | |
| 
 | |
| __END__
 |