mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-11-02 20:51:23 -07:00 
			
		
		
		
	Bugfix: ambiguous semantics of the layers_count() method caused M73 to go beyond 100%. #1670
This commit is contained in:
		
							parent
							
								
									a32f548a23
								
							
						
					
					
						commit
						5c02bfd310
					
				
					 4 changed files with 66 additions and 39 deletions
				
			
		| 
						 | 
				
			
			@ -93,9 +93,12 @@ sub init_config {
 | 
			
		|||
    $self->config(Slic3r::Config->merge($self->print->config, $self->config_overrides));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# this is the *total* layer count
 | 
			
		||||
# this value is not supposed to be compared with $layer->id
 | 
			
		||||
# since they have different semantics
 | 
			
		||||
sub layer_count {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    return scalar @{ $self->layers };
 | 
			
		||||
    return scalar @{ $self->layers } + scalar @{ $self->support_layers };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bounding_box {
 | 
			
		||||
| 
						 | 
				
			
			@ -219,9 +222,10 @@ sub make_perimeters {
 | 
			
		|||
    # hollow objects
 | 
			
		||||
    if ($self->config->extra_perimeters && $self->config->perimeters > 0 && $self->config->fill_density > 0) {
 | 
			
		||||
        for my $region_id (0 .. ($self->print->regions_count-1)) {
 | 
			
		||||
            for my $layer_id (0 .. $self->layer_count-2) {
 | 
			
		||||
                my $layerm          = $self->layers->[$layer_id]->regions->[$region_id];
 | 
			
		||||
                my $upper_layerm    = $self->layers->[$layer_id+1]->regions->[$region_id];
 | 
			
		||||
            for my $i (0 .. $#{$self->layers}-1) {
 | 
			
		||||
                # remember that $i != $layer->id
 | 
			
		||||
                my $layerm          = $self->layers->[$i]->regions->[$region_id];
 | 
			
		||||
                my $upper_layerm    = $self->layers->[$i+1]->regions->[$region_id];
 | 
			
		||||
                my $perimeter_spacing       = $layerm->perimeter_flow->scaled_spacing;
 | 
			
		||||
                
 | 
			
		||||
                my $overlap = $perimeter_spacing;  # one perimeter
 | 
			
		||||
| 
						 | 
				
			
			@ -258,7 +262,7 @@ sub make_perimeters {
 | 
			
		|||
                        
 | 
			
		||||
                        # only add the perimeter if there's an intersection with the collapsed area
 | 
			
		||||
                        last CYCLE if !@{ intersection($diff, $hypothetical_perimeter) };
 | 
			
		||||
                        Slic3r::debugf "  adding one more perimeter at layer %d\n", $layer_id;
 | 
			
		||||
                        Slic3r::debugf "  adding one more perimeter at layer %d\n", $layerm->id;
 | 
			
		||||
                        $slice->extra_perimeters($extra_perimeters);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -267,11 +271,11 @@ sub make_perimeters {
 | 
			
		|||
    }
 | 
			
		||||
    
 | 
			
		||||
    Slic3r::parallelize(
 | 
			
		||||
        items => sub { 0 .. ($self->layer_count-1) },
 | 
			
		||||
        items => sub { 0 .. $#{$self->layers} },
 | 
			
		||||
        thread_cb => sub {
 | 
			
		||||
            my $q = shift;
 | 
			
		||||
            while (defined (my $layer_id = $q->dequeue)) {
 | 
			
		||||
                $self->layers->[$layer_id]->make_perimeters;
 | 
			
		||||
            while (defined (my $i = $q->dequeue)) {
 | 
			
		||||
                $self->layers->[$i]->make_perimeters;
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        collect_cb => sub {},
 | 
			
		||||
| 
						 | 
				
			
			@ -286,7 +290,7 @@ sub detect_surfaces_type {
 | 
			
		|||
    Slic3r::debugf "Detecting solid surfaces...\n";
 | 
			
		||||
    
 | 
			
		||||
    for my $region_id (0 .. ($self->print->regions_count-1)) {
 | 
			
		||||
        for my $i (0 .. ($self->layer_count-1)) {
 | 
			
		||||
        for my $i (0 .. $#{$self->layers}) {
 | 
			
		||||
            my $layerm = $self->layers->[$i]->regions->[$region_id];
 | 
			
		||||
        
 | 
			
		||||
            # prepare a reusable subroutine to make surface differences
 | 
			
		||||
| 
						 | 
				
			
			@ -516,8 +520,8 @@ sub process_external_surfaces {
 | 
			
		|||
    
 | 
			
		||||
    for my $region_id (0 .. ($self->print->regions_count-1)) {
 | 
			
		||||
        $self->layers->[0]->regions->[$region_id]->process_external_surfaces(undef);
 | 
			
		||||
        for my $layer_id (1 .. ($self->layer_count-1)) {
 | 
			
		||||
            $self->layers->[$layer_id]->regions->[$region_id]->process_external_surfaces($self->layers->[$layer_id-1]);
 | 
			
		||||
        for my $i (1 .. $#{$self->layers}) {
 | 
			
		||||
            $self->layers->[$i]->regions->[$region_id]->process_external_surfaces($self->layers->[$i-1]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +532,7 @@ sub discover_horizontal_shells {
 | 
			
		|||
    Slic3r::debugf "==> DISCOVERING HORIZONTAL SHELLS\n";
 | 
			
		||||
    
 | 
			
		||||
    for my $region_id (0 .. ($self->print->regions_count-1)) {
 | 
			
		||||
        for (my $i = 0; $i < $self->layer_count; $i++) {
 | 
			
		||||
        for (my $i = 0; $i <= $#{$self->layers}; $i++) {
 | 
			
		||||
            my $layerm = $self->layers->[$i]->regions->[$region_id];
 | 
			
		||||
            
 | 
			
		||||
            if ($self->config->solid_infill_every_layers && $self->config->fill_density > 0
 | 
			
		||||
| 
						 | 
				
			
			@ -560,7 +564,7 @@ sub discover_horizontal_shells {
 | 
			
		|||
                        abs($n - $i) <= $solid_layers-1; 
 | 
			
		||||
                        ($type == S_TYPE_TOP) ? $n-- : $n++) {
 | 
			
		||||
                    
 | 
			
		||||
                    next if $n < 0 || $n >= $self->layer_count;
 | 
			
		||||
                    next if $n < 0 || $n > $#{$self->layers};
 | 
			
		||||
                    Slic3r::debugf "  looking for neighbors on layer %d...\n", $n;
 | 
			
		||||
                    
 | 
			
		||||
                    my $neighbor_fill_surfaces = $self->layers->[$n]->regions->[$region_id]->fill_surfaces;
 | 
			
		||||
| 
						 | 
				
			
			@ -666,8 +670,7 @@ sub combine_infill {
 | 
			
		|||
    return unless $self->config->infill_every_layers > 1 && $self->config->fill_density > 0;
 | 
			
		||||
    my $every = $self->config->infill_every_layers;
 | 
			
		||||
    
 | 
			
		||||
    my $layer_count = $self->layer_count;
 | 
			
		||||
    my @layer_heights = map $self->layers->[$_]->height, 0 .. $layer_count-1;
 | 
			
		||||
    my @layer_heights = map $_->height, @{$self->layers};
 | 
			
		||||
    
 | 
			
		||||
    for my $region_id (0 .. ($self->print->regions_count-1)) {
 | 
			
		||||
        # limit the number of combined layers to the maximum height allowed by this regions' nozzle
 | 
			
		||||
| 
						 | 
				
			
			@ -774,7 +777,7 @@ sub combine_infill {
 | 
			
		|||
sub generate_support_material {
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    return unless ($self->config->support_material || $self->config->raft_layers > 0)
 | 
			
		||||
        && $self->layer_count >= 2;
 | 
			
		||||
        && scalar(@{$self->layers}) >= 2;
 | 
			
		||||
    
 | 
			
		||||
    Slic3r::Print::SupportMaterial
 | 
			
		||||
        ->new(config => $self->config, flow => $self->print->support_material_flow)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue