mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	Ported PrintObject::bridge_over_infill() to XS
This commit is contained in:
		
							parent
							
								
									ea40c4d1b0
								
							
						
					
					
						commit
						4848cb7606
					
				
					 8 changed files with 130 additions and 76 deletions
				
			
		|  | @ -760,82 +760,6 @@ sub clip_fill_surfaces { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| sub bridge_over_infill { | ||||
|     my $self = shift; | ||||
|      | ||||
|     for my $region_id (0..($self->print->region_count - 1)) { | ||||
|         my $fill_density = $self->print->regions->[$region_id]->config->fill_density; | ||||
|         next if $fill_density == 100 || $fill_density == 0; | ||||
|          | ||||
|         for my $layer_id (1..($self->layer_count - 1)) { | ||||
|             my $layer       = $self->get_layer($layer_id); | ||||
|             my $layerm      = $layer->regions->[$region_id]; | ||||
|             my $lower_layer = $self->get_layer($layer_id-1); | ||||
|              | ||||
|             # compute the areas needing bridge math  | ||||
|             my @internal_solid = @{$layerm->fill_surfaces->filter_by_type(S_TYPE_INTERNALSOLID)}; | ||||
|             my @lower_internal = map @{$_->fill_surfaces->filter_by_type(S_TYPE_INTERNAL)}, @{$lower_layer->regions}; | ||||
|             my $to_bridge = intersection_ex( | ||||
|                 [ map $_->p, @internal_solid ], | ||||
|                 [ map $_->p, @lower_internal ], | ||||
|             ); | ||||
|             next unless @$to_bridge; | ||||
|             Slic3r::debugf "Bridging %d internal areas at layer %d\n", scalar(@$to_bridge), $layer_id; | ||||
|              | ||||
|             # build the new collection of fill_surfaces | ||||
|             { | ||||
|                 my @new_surfaces = map $_->clone, grep $_->surface_type != S_TYPE_INTERNALSOLID, @{$layerm->fill_surfaces}; | ||||
|                 push @new_surfaces, map Slic3r::Surface->new( | ||||
|                         expolygon       => $_, | ||||
|                         surface_type    => S_TYPE_INTERNALBRIDGE, | ||||
|                     ), @$to_bridge; | ||||
|                 push @new_surfaces, map Slic3r::Surface->new( | ||||
|                         expolygon       => $_, | ||||
|                         surface_type    => S_TYPE_INTERNALSOLID, | ||||
|                     ), @{diff_ex( | ||||
|                         [ map $_->p, @internal_solid ], | ||||
|                         [ map @$_, @$to_bridge ], | ||||
|                         1, | ||||
|                     )}; | ||||
|                 $layerm->fill_surfaces->clear; | ||||
|                 $layerm->fill_surfaces->append($_) for @new_surfaces; | ||||
|             } | ||||
|              | ||||
|             # exclude infill from the layers below if needed | ||||
|             # see discussion at https://github.com/alexrj/Slic3r/issues/240 | ||||
|             # Update: do not exclude any infill. Sparse infill is able to absorb the excess material. | ||||
|             if (0) { | ||||
|                 my $excess = $layerm->extruders->{infill}->bridge_flow->width - $layerm->height; | ||||
|                 for (my $i = $layer_id-1; $excess >= $self->get_layer($i)->height; $i--) { | ||||
|                     Slic3r::debugf "  skipping infill below those areas at layer %d\n", $i; | ||||
|                     foreach my $lower_layerm (@{$self->get_layer($i)->regions}) { | ||||
|                         my @new_surfaces = (); | ||||
|                         # subtract the area from all types of surfaces | ||||
|                         foreach my $group (@{$lower_layerm->fill_surfaces->group}) { | ||||
|                             push @new_surfaces, map $group->[0]->clone(expolygon => $_), | ||||
|                                 @{diff_ex( | ||||
|                                     [ map $_->p, @$group ], | ||||
|                                     [ map @$_, @$to_bridge ], | ||||
|                                 )}; | ||||
|                             push @new_surfaces, map Slic3r::Surface->new( | ||||
|                                 expolygon       => $_, | ||||
|                                 surface_type    => S_TYPE_INTERNALVOID, | ||||
|                             ), @{intersection_ex( | ||||
|                                 [ map $_->p, @$group ], | ||||
|                                 [ map @$_, @$to_bridge ], | ||||
|                             )}; | ||||
|                         } | ||||
|                         $lower_layerm->fill_surfaces->clear; | ||||
|                         $lower_layerm->fill_surfaces->append($_) for @new_surfaces; | ||||
|                     } | ||||
|                      | ||||
|                     $excess -= $self->get_layer($i)->height; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| sub process_external_surfaces { | ||||
|     my ($self) = @_; | ||||
|      | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci