mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	support_material_synchronize_layers implementation
This commit is contained in:
		
							parent
							
								
									556204fddc
								
							
						
					
					
						commit
						38cb2842ac
					
				
					 2 changed files with 38 additions and 26 deletions
				
			
		| 
						 | 
					@ -45,6 +45,7 @@ sub generate {
 | 
				
			||||||
    # We now know the upper and lower boundaries for our support material object
 | 
					    # We now know the upper and lower boundaries for our support material object
 | 
				
			||||||
    # (@$contact_z and @$top_z), so we can generate intermediate layers.
 | 
					    # (@$contact_z and @$top_z), so we can generate intermediate layers.
 | 
				
			||||||
    my $support_z = $self->support_layers_z(
 | 
					    my $support_z = $self->support_layers_z(
 | 
				
			||||||
 | 
					        $object,
 | 
				
			||||||
        [ sort keys %$contact ],
 | 
					        [ sort keys %$contact ],
 | 
				
			||||||
        [ sort keys %$top ],
 | 
					        [ sort keys %$top ],
 | 
				
			||||||
        max(map $_->height, @{$object->layers})
 | 
					        max(map $_->height, @{$object->layers})
 | 
				
			||||||
| 
						 | 
					@ -384,7 +385,7 @@ sub object_top {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub support_layers_z {
 | 
					sub support_layers_z {
 | 
				
			||||||
    my ($self, $contact_z, $top_z, $max_object_layer_height) = @_;
 | 
					    my ($self, $object, $contact_z, $top_z, $max_object_layer_height) = @_;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # quick table to check whether a given Z is a top surface
 | 
					    # quick table to check whether a given Z is a top surface
 | 
				
			||||||
    my %top = map { $_ => 1 } @$top_z;
 | 
					    my %top = map { $_ => 1 } @$top_z;
 | 
				
			||||||
| 
						 | 
					@ -397,13 +398,18 @@ sub support_layers_z {
 | 
				
			||||||
    my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter);
 | 
					    my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # initialize known, fixed, support layers
 | 
					    # initialize known, fixed, support layers
 | 
				
			||||||
    my @z = sort { $a <=> $b }
 | 
					    my @z = @$contact_z;
 | 
				
			||||||
        @$contact_z,
 | 
					    my $synchronize = $self->object_config->support_material_synchronize_layers;
 | 
				
			||||||
 | 
					    if (! $synchronize) {
 | 
				
			||||||
 | 
					        push @z, 
 | 
				
			||||||
            # TODO: why we have this?
 | 
					            # TODO: why we have this?
 | 
				
			||||||
            # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z.
 | 
					            # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z.
 | 
				
			||||||
        @$top_z,
 | 
					            @$top_z;
 | 
				
			||||||
 | 
					        push @z,
 | 
				
			||||||
            # Top surfaces of the bottom interface layers.
 | 
					            # Top surfaces of the bottom interface layers.
 | 
				
			||||||
            (map $_ + $contact_distance, @$top_z);
 | 
					            (map $_ + $contact_distance, @$top_z);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    @z = sort { $a <=> $b } @z;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # enforce first layer height
 | 
					    # enforce first layer height
 | 
				
			||||||
    my $first_layer_height = $self->object_config->get_value('first_layer_height');
 | 
					    my $first_layer_height = $self->object_config->get_value('first_layer_height');
 | 
				
			||||||
| 
						 | 
					@ -423,6 +429,11 @@ sub support_layers_z {
 | 
				
			||||||
            1..($self->object_config->raft_layers - 2);
 | 
					            1..($self->object_config->raft_layers - 2);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    if ($synchronize) {
 | 
				
			||||||
 | 
					        @z = splice @z, $self->object_config->raft_layers;
 | 
				
			||||||
 | 
					#            if ($self->object_config->raft_layers > scalar(@z));
 | 
				
			||||||
 | 
					        push @z, map $_->print_z, @{$object->layers};
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
        # create other layers (skip raft layers as they're already done and use thicker layers)
 | 
					        # create other layers (skip raft layers as they're already done and use thicker layers)
 | 
				
			||||||
        for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) {
 | 
					        for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) {
 | 
				
			||||||
            my $target_height = $support_material_height;
 | 
					            my $target_height = $support_material_height;
 | 
				
			||||||
| 
						 | 
					@ -442,6 +453,7 @@ sub support_layers_z {
 | 
				
			||||||
                $i++;
 | 
					                $i++;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # remove duplicates and make sure all 0.x values have the leading 0
 | 
					    # remove duplicates and make sure all 0.x values have the leading 0
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,7 +28,7 @@ use Slic3r::Test;
 | 
				
			||||||
            interface_flow      => $flow,
 | 
					            interface_flow      => $flow,
 | 
				
			||||||
            first_layer_flow    => $flow,
 | 
					            first_layer_flow    => $flow,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        my $support_z = $support->support_layers_z(\@contact_z, \@top_z, $config->layer_height);
 | 
					        my $support_z = $support->support_layers_z($print->print->objects->[0], \@contact_z, \@top_z, $config->layer_height);
 | 
				
			||||||
        my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]);
 | 
					        my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        is $support_z->[0], $config->first_layer_height,
 | 
					        is $support_z->[0], $config->first_layer_height,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue