mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Bugfix: wrong flow and bad pattern rotation when infill-every-layers was set to an arbitrary high value
This commit is contained in:
		
							parent
							
								
									04c0caad0b
								
							
						
					
					
						commit
						83065b0789
					
				
					 4 changed files with 33 additions and 24 deletions
				
			
		|  | @ -90,10 +90,11 @@ sub make_fill { | |||
|             ); | ||||
|              | ||||
|             push @surfaces, map Slic3r::Surface->new( | ||||
|                 expolygon => $_, | ||||
|                 surface_type => $group->[0]->surface_type, | ||||
|                 bridge_angle => $group->[0]->bridge_angle, | ||||
|                 depth_layers => $group->[0]->depth_layers, | ||||
|                 expolygon           => $_, | ||||
|                 surface_type        => $group->[0]->surface_type, | ||||
|                 bridge_angle        => $group->[0]->bridge_angle, | ||||
|                 thickness           => $group->[0]->thickness, | ||||
|                 thickness_layers    => $group->[0]->thickness_layers, | ||||
|             ), @$union; | ||||
|         } | ||||
|     } | ||||
|  | @ -163,7 +164,7 @@ sub make_fill { | |||
|                             : $is_solid | ||||
|                                 ? ($surface->surface_type == S_TYPE_TOP ? EXTR_ROLE_TOPSOLIDFILL : EXTR_ROLE_SOLIDFILL) | ||||
|                                 : EXTR_ROLE_FILL), | ||||
|                     height => $surface->depth_layers * $layerm->height, | ||||
|                     height => $surface->thickness, | ||||
|                     flow_spacing => $params->{flow_spacing} || (warn "Warning: no flow_spacing was returned by the infill engine, please report this to the developer\n"), | ||||
|                 ), @paths, | ||||
|             ], | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ sub infill_direction { | |||
|      | ||||
|     if (defined $self->layer_id) { | ||||
|         # alternate fill direction | ||||
|         my $layer_num = $self->layer_id / $surface->depth_layers; | ||||
|         my $layer_num = $self->layer_id / $surface->thickness_layers; | ||||
|         my $angle = $self->angles->[$layer_num % @{$self->angles}]; | ||||
|         $rotate[0] = Slic3r::Geometry::deg2rad($self->angle) + $angle if $angle; | ||||
|     } | ||||
|  |  | |||
|  | @ -659,7 +659,7 @@ sub combine_infill { | |||
|         my $nozzle_diameter = $self->print->regions->[$region_id]->extruders->{infill}->nozzle_diameter; | ||||
|          | ||||
|         # define the combinations | ||||
|         my @combine = ();   # layer_id => depth | ||||
|         my @combine = ();   # layer_id => thickness in layers | ||||
|         { | ||||
|             my $current_height = my $layers = 0; | ||||
|             for my $layer_id (1 .. $#layer_heights) { | ||||
|  | @ -731,7 +731,12 @@ sub combine_infill { | |||
|                     # apply surfaces back with adjusted depth to the uppermost layer | ||||
|                     if ($layerm->id == $layer_id) { | ||||
|                         push @this_type, | ||||
|                             map Slic3r::Surface->new(expolygon => $_, surface_type => $type, depth_layers => $every), | ||||
|                             map Slic3r::Surface->new( | ||||
|                                 expolygon        => $_, | ||||
|                                 surface_type     => $type, | ||||
|                                 thickness        => sum(map $_->height, @layerms), | ||||
|                                 thickness_layers => scalar(@layerms), | ||||
|                             ), | ||||
|                             @$intersection; | ||||
|                     } | ||||
|                      | ||||
|  |  | |||
|  | @ -7,11 +7,12 @@ our @ISA = qw(Exporter); | |||
| our @EXPORT_OK   = qw(S_TYPE_TOP S_TYPE_BOTTOM S_TYPE_INTERNAL S_TYPE_INTERNALSOLID S_TYPE_INTERNALBRIDGE); | ||||
| our %EXPORT_TAGS = (types => \@EXPORT_OK); | ||||
| 
 | ||||
| use constant S_EXPOLYGON    => 0; | ||||
| use constant S_SURFACE_TYPE => 1; | ||||
| use constant S_DEPTH_LAYERS => 2; | ||||
| use constant S_BRIDGE_ANGLE => 3; | ||||
| use constant S_EXTRA_PERIMETERS => 4; | ||||
| use constant S_EXPOLYGON            => 0; | ||||
| use constant S_SURFACE_TYPE         => 1; | ||||
| use constant S_THICKNESS            => 2;  # in mm | ||||
| use constant S_THICKNESS_LAYERS     => 3;  # in layers | ||||
| use constant S_BRIDGE_ANGLE         => 4; | ||||
| use constant S_EXTRA_PERIMETERS     => 5; | ||||
| 
 | ||||
| use constant S_TYPE_TOP             => 0; | ||||
| use constant S_TYPE_BOTTOM          => 1; | ||||
|  | @ -24,9 +25,9 @@ sub new { | |||
|     my %args = @_; | ||||
|      | ||||
|     my $self = [ | ||||
|         map delete $args{$_}, qw(expolygon surface_type depth_layers bridge_angle extra_perimeters), | ||||
|         map delete $args{$_}, qw(expolygon surface_type thickness thickness_layers bridge_angle extra_perimeters), | ||||
|     ]; | ||||
|     $self->[S_DEPTH_LAYERS] //= 1; #/ | ||||
|     $self->[$_] //= 1 for S_THICKNESS, S_THICKNESS_LAYERS; | ||||
|      | ||||
|     bless $self, $class; | ||||
|     $self; | ||||
|  | @ -34,7 +35,8 @@ sub new { | |||
| 
 | ||||
| sub expolygon       { $_[0][S_EXPOLYGON] } | ||||
| sub surface_type    { $_[0][S_SURFACE_TYPE] = $_[1] if defined $_[1]; $_[0][S_SURFACE_TYPE] } | ||||
| sub depth_layers    { $_[0][S_DEPTH_LAYERS] } # this integer represents the thickness of the surface expressed in layers | ||||
| sub thickness       { $_[0][S_THICKNESS] } | ||||
| sub thickness_layers    { $_[0][S_THICKNESS_LAYERS] } | ||||
| sub bridge_angle    { $_[0][S_BRIDGE_ANGLE] = $_[1] if defined $_[1]; $_[0][S_BRIDGE_ANGLE] } | ||||
| sub extra_perimeters { $_[0][S_EXTRA_PERIMETERS] = $_[1] if defined $_[1]; $_[0][S_EXTRA_PERIMETERS] } | ||||
| 
 | ||||
|  | @ -45,7 +47,8 @@ if (eval "use Class::XSAccessor::Array; 1") { | |||
|         }, | ||||
|         accessors => { | ||||
|             surface_type        => S_SURFACE_TYPE, | ||||
|             depth_layers        => S_DEPTH_LAYERS, | ||||
|             thickness           => S_THICKNESS, | ||||
|             thickness_layers    => S_THICKNESS_LAYERS, | ||||
|             bridge_angle        => S_BRIDGE_ANGLE, | ||||
|             extra_perimeters    => S_EXTRA_PERIMETERS, | ||||
|         }, | ||||
|  | @ -59,7 +62,7 @@ sub lines           { $_[0]->expolygon->lines } | |||
| sub contour         { $_[0]->expolygon->contour } | ||||
| sub holes           { $_[0]->expolygon->holes } | ||||
| 
 | ||||
| # static method to group surfaces having same surface_type, bridge_angle and depth_layers | ||||
| # static method to group surfaces having same surface_type, bridge_angle and thickness* | ||||
| sub group { | ||||
|     my $class = shift; | ||||
|     my $params = ref $_[0] eq 'HASH' ? shift(@_) : {}; | ||||
|  | @ -67,11 +70,11 @@ sub group { | |||
|      | ||||
|     my %unique_types = (); | ||||
|     foreach my $surface (@surfaces) { | ||||
|         my $type = ($params->{merge_solid} && $surface->is_solid) | ||||
|             ? 'solid' | ||||
|             : $surface->surface_type; | ||||
|         $type .= "_" . ($surface->bridge_angle // ''); #/ | ||||
|         $type .= "_" . $surface->depth_layers; | ||||
|         my $type = join '_', | ||||
|             ($params->{merge_solid} && $surface->is_solid) ? 'solid' : $surface->surface_type, | ||||
|             ($surface->bridge_angle // ''), | ||||
|             $surface->thickness, | ||||
|             $surface->thickness_layers; | ||||
|         $unique_types{$type} ||= []; | ||||
|         push @{ $unique_types{$type} }, $surface; | ||||
|     } | ||||
|  | @ -95,7 +98,7 @@ sub _inflate_expolygon { | |||
|      | ||||
|     return (ref $self)->new( | ||||
|         expolygon => $expolygon, | ||||
|         map { $_ => $self->$_ } qw(surface_type depth_layers bridge_angle), | ||||
|         map { $_ => $self->$_ } qw(surface_type thickness thickness_layers bridge_angle), | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci