mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Use support material interface extruder for layers above object's top surfaces too. #1939
This commit is contained in:
		
							parent
							
								
									a1a88baa68
								
							
						
					
					
						commit
						473802ce8c
					
				
					 1 changed files with 56 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -66,6 +66,10 @@ sub generate {
 | 
			
		|||
    $self->clip_with_object($base, $support_z, $object);
 | 
			
		||||
    $self->clip_with_shape($base, $shape) if @$shape;
 | 
			
		||||
    
 | 
			
		||||
    # Detect what part of base support layers are "reverse interfaces" because they
 | 
			
		||||
    # lie above object's top surfaces.
 | 
			
		||||
    $self->generate_bottom_interface_layers($support_z, $base, $top, $interface);
 | 
			
		||||
    
 | 
			
		||||
    # Install support layers into object.
 | 
			
		||||
    for my $i (0 .. $#$support_z) {
 | 
			
		||||
        $object->add_support_layer(
 | 
			
		||||
| 
						 | 
				
			
			@ -415,6 +419,48 @@ sub generate_interface_layers {
 | 
			
		|||
    return \%interface;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub generate_bottom_interface_layers {
 | 
			
		||||
    my ($self, $support_z, $base, $top, $interface) = @_;
 | 
			
		||||
    
 | 
			
		||||
    my $area_threshold = $self->interface_flow->scaled_spacing ** 2;
 | 
			
		||||
    
 | 
			
		||||
    # loop through object's top surfaces
 | 
			
		||||
    foreach my $top_z (sort keys %$top) {
 | 
			
		||||
        my $this = $top->{$top_z};
 | 
			
		||||
        
 | 
			
		||||
        # keep a count of the interface layers we generated for this top surface
 | 
			
		||||
        my $interface_layers = 0;
 | 
			
		||||
        
 | 
			
		||||
        # loop through support layers until we find the one(s) right above the top
 | 
			
		||||
        # surface
 | 
			
		||||
        foreach my $layer_id (0 .. $#$support_z) {
 | 
			
		||||
            my $z = $support_z->[$layer_id];
 | 
			
		||||
            next unless $z > $top_z;
 | 
			
		||||
            
 | 
			
		||||
            # get the support material area that should be considered interface
 | 
			
		||||
            my $interface_area = intersection(
 | 
			
		||||
                $base->{$layer_id},
 | 
			
		||||
                $this,
 | 
			
		||||
            );
 | 
			
		||||
            
 | 
			
		||||
            # discard too small areas
 | 
			
		||||
            $interface_area = [ grep abs($_->area) >= $area_threshold, @$interface_area ];
 | 
			
		||||
            
 | 
			
		||||
            # subtract new interface area from base
 | 
			
		||||
            $base->{$layer_id} = diff(
 | 
			
		||||
                $base->{$layer_id},
 | 
			
		||||
                $interface_area,
 | 
			
		||||
            );
 | 
			
		||||
            
 | 
			
		||||
            # add new interface area to interface
 | 
			
		||||
            push @{$interface->{$layer_id}}, @$interface_area;
 | 
			
		||||
            
 | 
			
		||||
            $interface_layers++;
 | 
			
		||||
            last if $interface_layers == $self->object_config->support_material_interface_layers;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub generate_base_layers {
 | 
			
		||||
    my ($self, $support_z, $contact, $interface, $top) = @_;
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -620,6 +666,7 @@ sub generate_toolpaths {
 | 
			
		|||
        # interface and contact infill
 | 
			
		||||
        if (@$interface || @$contact_infill) {
 | 
			
		||||
            $fillers{interface}->angle($interface_angle);
 | 
			
		||||
            $fillers{interface}->spacing($_interface_flow->spacing);
 | 
			
		||||
            
 | 
			
		||||
            # find centerline of the external loop
 | 
			
		||||
            $interface = offset2($interface, +scaled_epsilon, -(scaled_epsilon + $_interface_flow->scaled_width/2));
 | 
			
		||||
| 
						 | 
				
			
			@ -645,20 +692,19 @@ sub generate_toolpaths {
 | 
			
		|||
            
 | 
			
		||||
            my @paths = ();
 | 
			
		||||
            foreach my $expolygon (@{union_ex($interface)}) {
 | 
			
		||||
                my ($params, @p) = $fillers{interface}->fill_surface(
 | 
			
		||||
                my @p = $fillers{interface}->fill_surface(
 | 
			
		||||
                    Slic3r::Surface->new(expolygon => $expolygon, surface_type => S_TYPE_INTERNAL),
 | 
			
		||||
                    density     => $interface_density,
 | 
			
		||||
                    flow        => $_interface_flow,
 | 
			
		||||
                    density      => $interface_density,
 | 
			
		||||
                    layer_height => $layer->height,
 | 
			
		||||
                    complete    => 1,
 | 
			
		||||
                    complete     => 1,
 | 
			
		||||
                );
 | 
			
		||||
                my $mm3_per_mm = $params->{flow}->mm3_per_mm;
 | 
			
		||||
                my $mm3_per_mm = $_interface_flow->mm3_per_mm;
 | 
			
		||||
                
 | 
			
		||||
                push @paths, map Slic3r::ExtrusionPath->new(
 | 
			
		||||
                    polyline    => Slic3r::Polyline->new(@$_),
 | 
			
		||||
                    role        => EXTR_ROLE_SUPPORTMATERIAL_INTERFACE,
 | 
			
		||||
                    mm3_per_mm  => $mm3_per_mm,
 | 
			
		||||
                    width       => $params->{flow}->width,
 | 
			
		||||
                    width       => $_interface_flow->width,
 | 
			
		||||
                    height      => $layer->height,
 | 
			
		||||
                ), @p;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -699,22 +745,22 @@ sub generate_toolpaths {
 | 
			
		|||
                # TODO: use offset2_ex()
 | 
			
		||||
                $to_infill = offset_ex([ map @$_, @$to_infill ], -$_flow->scaled_spacing);
 | 
			
		||||
            }
 | 
			
		||||
            $filler->spacing($base_flow->spacing);
 | 
			
		||||
            
 | 
			
		||||
            foreach my $expolygon (@$to_infill) {
 | 
			
		||||
                my ($params, @p) = $filler->fill_surface(
 | 
			
		||||
                my @p = $filler->fill_surface(
 | 
			
		||||
                    Slic3r::Surface->new(expolygon => $expolygon, surface_type => S_TYPE_INTERNAL),
 | 
			
		||||
                    density     => $density,
 | 
			
		||||
                    flow        => $base_flow,
 | 
			
		||||
                    layer_height => $layer->height,
 | 
			
		||||
                    complete    => 1,
 | 
			
		||||
                );
 | 
			
		||||
                my $mm3_per_mm = $params->{flow}->mm3_per_mm;
 | 
			
		||||
                my $mm3_per_mm = $base_flow->mm3_per_mm;
 | 
			
		||||
                
 | 
			
		||||
                push @paths, map Slic3r::ExtrusionPath->new(
 | 
			
		||||
                    polyline    => Slic3r::Polyline->new(@$_),
 | 
			
		||||
                    role        => EXTR_ROLE_SUPPORTMATERIAL,
 | 
			
		||||
                    mm3_per_mm  => $mm3_per_mm,
 | 
			
		||||
                    width       => $params->{flow}->width,
 | 
			
		||||
                    width       => $base_flow->width,
 | 
			
		||||
                    height      => $layer->height,
 | 
			
		||||
                ), @p;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue