mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Refactoring: initialize all layers at once and avoid duplication of slicing height math
This commit is contained in:
		
							parent
							
								
									a1a4d97f9f
								
							
						
					
					
						commit
						08270022dd
					
				
					 3 changed files with 25 additions and 24 deletions
				
			
		| 
						 | 
					@ -477,7 +477,7 @@ sub make_skirt {
 | 
				
			||||||
    $skirt_height = $self->layer_count if $skirt_height > $self->layer_count;
 | 
					    $skirt_height = $self->layer_count if $skirt_height > $self->layer_count;
 | 
				
			||||||
    my @points = ();
 | 
					    my @points = ();
 | 
				
			||||||
    foreach my $obj_idx (0 .. $#{$self->objects}) {
 | 
					    foreach my $obj_idx (0 .. $#{$self->objects}) {
 | 
				
			||||||
        my @layers = map $self->objects->[$obj_idx]->layer($_), 0..($skirt_height-1);
 | 
					        my @layers = map $self->objects->[$obj_idx]->layers->[$_], 0..($skirt_height-1);
 | 
				
			||||||
        my @layer_points = (
 | 
					        my @layer_points = (
 | 
				
			||||||
            (map @$_, map @{$_->expolygon}, map @{$_->slices}, @layers),
 | 
					            (map @$_, map @{$_->expolygon}, map @{$_->slices}, @layers),
 | 
				
			||||||
            (map @$_, map @{$_->thin_walls}, @layers),
 | 
					            (map @$_, map @{$_->thin_walls}, @layers),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,39 +2,42 @@ package Slic3r::Print::Object;
 | 
				
			||||||
use Moo;
 | 
					use Moo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use Slic3r::ExtrusionPath ':roles';
 | 
					use Slic3r::ExtrusionPath ':roles';
 | 
				
			||||||
use Slic3r::Geometry qw(scale unscale deg2rad);
 | 
					use Slic3r::Geometry qw(Z scale unscale deg2rad);
 | 
				
			||||||
use Slic3r::Geometry::Clipper qw(diff_ex intersection_ex union_ex);
 | 
					use Slic3r::Geometry::Clipper qw(diff_ex intersection_ex union_ex);
 | 
				
			||||||
use Slic3r::Surface ':types';
 | 
					use Slic3r::Surface ':types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
has 'input_file'        => (is => 'rw', required => 0);
 | 
					has 'input_file'        => (is => 'rw', required => 0);
 | 
				
			||||||
has 'mesh'              => (is => 'rw', required => 0);
 | 
					has 'mesh'              => (is => 'rw', required => 0);
 | 
				
			||||||
has 'size'              => (is => 'rw', required => 1);
 | 
					has 'size'              => (is => 'rw', required => 1);
 | 
				
			||||||
 | 
					has 'layers'            => (is => 'rw', default => sub { [] } );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
has 'layers' => (
 | 
					sub BUILD {
 | 
				
			||||||
    traits  => ['Array'],
 | 
					    my $self = shift;
 | 
				
			||||||
    is      => 'rw',
 | 
					    
 | 
				
			||||||
    #isa     => 'ArrayRef[Slic3r::Layer]',
 | 
					    # make layers
 | 
				
			||||||
    default => sub { [] },
 | 
					    while (!@{$self->layers} || $self->layers->[-1]->slice_z < $self->size->[Z]) {
 | 
				
			||||||
);
 | 
					        push @{$self->layers}, Slic3r::Layer->new(id => $#{$self->layers} + 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub layer_count {
 | 
					sub layer_count {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
    return scalar @{ $self->layers };
 | 
					    return scalar @{ $self->layers };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub layer {
 | 
					sub get_layer_range {
 | 
				
			||||||
    my $self = shift;
 | 
					    my $self = shift;
 | 
				
			||||||
    my ($layer_id) = @_;
 | 
					    my ($min_z, $max_z) = @_;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # extend our print by creating all necessary layers
 | 
					    my ($min_layer, $max_layer) = (0, undef);
 | 
				
			||||||
    
 | 
					    for my $layer (@{$self->layers}) {
 | 
				
			||||||
    if ($self->layer_count < $layer_id + 1) {
 | 
					        $min_layer = $layer->id if $layer->slice_z <= $min_z;
 | 
				
			||||||
        for (my $i = $self->layer_count; $i <= $layer_id; $i++) {
 | 
					        if ($layer->slice_z >= $max_z) {
 | 
				
			||||||
            push @{ $self->layers }, Slic3r::Layer->new(id => $i);
 | 
					            $max_layer = $layer->id;
 | 
				
			||||||
 | 
					            last;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    return ($min_layer, $max_layer);
 | 
				
			||||||
    return $self->layers->[$layer_id];
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sub slice {
 | 
					sub slice {
 | 
				
			||||||
| 
						 | 
					@ -46,7 +49,7 @@ sub slice {
 | 
				
			||||||
        my $apply_lines = sub {
 | 
					        my $apply_lines = sub {
 | 
				
			||||||
            my $lines = shift;
 | 
					            my $lines = shift;
 | 
				
			||||||
            foreach my $layer_id (keys %$lines) {
 | 
					            foreach my $layer_id (keys %$lines) {
 | 
				
			||||||
                my $layer = $self->layer($layer_id);
 | 
					                my $layer = $self->layers->[$layer_id];
 | 
				
			||||||
                push @{$layer->lines}, @{$lines->{$layer_id}};
 | 
					                push @{$layer->lines}, @{$lines->{$layer_id}};
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
| 
						 | 
					@ -399,7 +402,7 @@ sub combine_infill {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # start from bottom, skip first layer
 | 
					    # start from bottom, skip first layer
 | 
				
			||||||
    for (my $i = 1; $i < $self->layer_count; $i++) {
 | 
					    for (my $i = 1; $i < $self->layer_count; $i++) {
 | 
				
			||||||
        my $layer = $self->layer($i);
 | 
					        my $layer = $self->layers->[$i];
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        # skip layer if no internal fill surfaces
 | 
					        # skip layer if no internal fill surfaces
 | 
				
			||||||
        next if !grep $_->surface_type == S_TYPE_INTERNAL, @{$layer->fill_surfaces};
 | 
					        next if !grep $_->surface_type == S_TYPE_INTERNAL, @{$layer->fill_surfaces};
 | 
				
			||||||
| 
						 | 
					@ -408,7 +411,7 @@ sub combine_infill {
 | 
				
			||||||
        # we do this from the greater depth to the smaller
 | 
					        # we do this from the greater depth to the smaller
 | 
				
			||||||
        for (my $d = $Slic3r::Config->infill_every_layers - 1; $d >= 1; $d--) {
 | 
					        for (my $d = $Slic3r::Config->infill_every_layers - 1; $d >= 1; $d--) {
 | 
				
			||||||
            next if ($i - $d) < 0;
 | 
					            next if ($i - $d) < 0;
 | 
				
			||||||
            my $lower_layer = $self->layer($i - 1);
 | 
					            my $lower_layer = $self->layers->[$i - 1];
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            # select surfaces of the lower layer having the depth we're looking for
 | 
					            # select surfaces of the lower layer having the depth we're looking for
 | 
				
			||||||
            my @lower_surfaces = grep $_->depth_layers == $d && $_->surface_type == S_TYPE_INTERNAL,
 | 
					            my @lower_surfaces = grep $_->depth_layers == $d && $_->surface_type == S_TYPE_INTERNAL,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -401,14 +401,12 @@ sub slice_facet {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    # calculate the layer extents
 | 
					    # calculate the layer extents
 | 
				
			||||||
    my $min_layer = int((unscale($min_z) - ($Slic3r::Config->get_value('first_layer_height') + $Slic3r::Config->layer_height / 2)) / $Slic3r::Config->layer_height) - 2;
 | 
					    my ($min_layer, $max_layer) = $print_object->get_layer_range($min_z, $max_z);
 | 
				
			||||||
    $min_layer = 0 if $min_layer < 0;
 | 
					 | 
				
			||||||
    my $max_layer = int((unscale($max_z) - ($Slic3r::Config->get_value('first_layer_height') + $Slic3r::Config->layer_height / 2)) / $Slic3r::Config->layer_height) + 2;
 | 
					 | 
				
			||||||
    Slic3r::debugf "layers: min = %s, max = %s\n", $min_layer, $max_layer;
 | 
					    Slic3r::debugf "layers: min = %s, max = %s\n", $min_layer, $max_layer;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    my $lines = {};  # layer_id => [ lines ]
 | 
					    my $lines = {};  # layer_id => [ lines ]
 | 
				
			||||||
    for (my $layer_id = $min_layer; $layer_id <= $max_layer; $layer_id++) {
 | 
					    for (my $layer_id = $min_layer; $layer_id <= $max_layer; $layer_id++) {
 | 
				
			||||||
        my $layer = $print_object->layer($layer_id);
 | 
					        my $layer = $print_object->layers->[$layer_id];
 | 
				
			||||||
        $lines->{$layer_id} ||= [];
 | 
					        $lines->{$layer_id} ||= [];
 | 
				
			||||||
        push @{ $lines->{$layer_id} }, $self->intersect_facet($facet_id, $layer->slice_z);
 | 
					        push @{ $lines->{$layer_id} }, $self->intersect_facet($facet_id, $layer->slice_z);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue