mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 14:55:54 +08:00
Bugfix: narrow solid shells were collapsed when spacing was added before generating infill, so we grow them
This commit is contained in:
parent
b73c301c55
commit
0eecf33198
@ -544,10 +544,9 @@ sub discover_horizontal_shells {
|
|||||||
# find slices of current type for current layer
|
# find slices of current type for current layer
|
||||||
# get both slices and fill_surfaces before the former contains the perimeters area
|
# get both slices and fill_surfaces before the former contains the perimeters area
|
||||||
# and the latter contains the enlarged external surfaces
|
# and the latter contains the enlarged external surfaces
|
||||||
my @surfaces = grep $_->surface_type == $type, @{$layerm->slices}, @{$layerm->fill_surfaces} or next;
|
my $solid = [ map $_->expolygon, grep $_->surface_type == $type, @{$layerm->slices}, @{$layerm->fill_surfaces} ];
|
||||||
my $surfaces_p = [ map $_->p, @surfaces ];
|
next if !@$solid;
|
||||||
Slic3r::debugf "Layer %d has %d surfaces of type '%s'\n",
|
Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == S_TYPE_TOP ? 'top' : 'bottom');
|
||||||
$i, scalar(@surfaces), ($type == S_TYPE_TOP ? 'top' : 'bottom');
|
|
||||||
|
|
||||||
my $solid_layers = ($type == S_TYPE_TOP)
|
my $solid_layers = ($type == S_TYPE_TOP)
|
||||||
? $Slic3r::Config->top_solid_layers
|
? $Slic3r::Config->top_solid_layers
|
||||||
@ -559,17 +558,39 @@ sub discover_horizontal_shells {
|
|||||||
next if $n < 0 || $n >= $self->layer_count;
|
next if $n < 0 || $n >= $self->layer_count;
|
||||||
Slic3r::debugf " looking for neighbors on layer %d...\n", $n;
|
Slic3r::debugf " looking for neighbors on layer %d...\n", $n;
|
||||||
|
|
||||||
my @neighbor_fill_surfaces = @{$self->layers->[$n]->regions->[$region_id]->fill_surfaces};
|
my @neighbor_fill_surfaces = @{$self->layers->[$n]->regions->[$region_id]->fill_surfaces};
|
||||||
|
|
||||||
# find intersection between neighbor and current layer's surfaces
|
# find intersection between neighbor and current layer's surfaces
|
||||||
# intersections have contours and holes
|
# intersections have contours and holes
|
||||||
my $new_internal_solid = intersection_ex(
|
my $new_internal_solid = intersection_ex(
|
||||||
$surfaces_p,
|
[ map @$_, @$solid ],
|
||||||
[ map $_->p, grep { $_->surface_type == S_TYPE_INTERNAL || $_->surface_type == S_TYPE_INTERNALSOLID } @neighbor_fill_surfaces ],
|
[ map $_->p, grep { $_->surface_type == S_TYPE_INTERNAL || $_->surface_type == S_TYPE_INTERNALSOLID } @neighbor_fill_surfaces ],
|
||||||
undef, 1,
|
undef, 1,
|
||||||
);
|
);
|
||||||
next if !@$new_internal_solid;
|
next if !@$new_internal_solid;
|
||||||
|
|
||||||
|
# make sure the new internal solid is wide enough, as it might get collapsed when
|
||||||
|
# spacing is added in Fill.pm
|
||||||
|
{
|
||||||
|
my $margin = 3 * $layerm->infill_flow->scaled_width; # require at least this size
|
||||||
|
my $too_narrow = diff_ex(
|
||||||
|
[ map @$_, @$new_internal_solid ],
|
||||||
|
[ offset([ offset([ map @$_, @$new_internal_solid ], -$margin) ], +$margin) ],
|
||||||
|
);
|
||||||
|
|
||||||
|
# if some parts are going to collapse, let's grow them and add the extra area to the neighbor layer
|
||||||
|
# as well as to our original surfaces so that we support this additional area in the next shell too
|
||||||
|
if (@$too_narrow) {
|
||||||
|
# make sure our grown surfaces don't exceed the fill area
|
||||||
|
my @grown = map @$_, @{intersection_ex(
|
||||||
|
[ offset([ map @$_, @$too_narrow ], +$margin) ],
|
||||||
|
[ map $_->p, @neighbor_fill_surfaces ],
|
||||||
|
)};
|
||||||
|
$new_internal_solid = union_ex([ @grown, (map @$_, @$new_internal_solid) ]);
|
||||||
|
$solid = union_ex([ @grown, (map @$_, @$solid) ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# internal-solid are the union of the existing internal-solid surfaces
|
# internal-solid are the union of the existing internal-solid surfaces
|
||||||
# and new ones
|
# and new ones
|
||||||
my $internal_solid = union_ex([
|
my $internal_solid = union_ex([
|
||||||
@ -611,8 +632,6 @@ sub discover_horizontal_shells {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@{$layerm->fill_surfaces} = grep $_->expolygon->area > $layerm->infill_area_threshold, @{$layerm->fill_surfaces};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user