mirror of https://github.com/vitalif/Slic3r
Keep the full geometries in $layer->slices, including thin walls
parent
504962712b
commit
0634437364
|
@ -87,28 +87,18 @@ sub make_surfaces {
|
||||||
return if !@$loops;
|
return if !@$loops;
|
||||||
$self->slices([ _merge_loops($loops) ]);
|
$self->slices([ _merge_loops($loops) ]);
|
||||||
|
|
||||||
# the contours must be offsetted by half extrusion width inwards
|
# detect thin walls by offsetting slices by half extrusion inwards
|
||||||
{
|
{
|
||||||
my $distance = $self->perimeter_flow->scaled_width / 2;
|
my $width = $self->perimeter_flow->scaled_width;
|
||||||
my @surfaces = @{$self->slices};
|
my $outgrown = union_ex([
|
||||||
@{$self->slices} = ();
|
Slic3r::Geometry::Clipper::offset(
|
||||||
foreach my $surface (@surfaces) {
|
[Slic3r::Geometry::Clipper::offset([ map @$_, map $_->expolygon, @{$self->slices} ], -$width)],
|
||||||
push @{$self->slices}, map Slic3r::Surface->new
|
+$width,
|
||||||
(expolygon => $_, surface_type => S_TYPE_INTERNAL),
|
),
|
||||||
@{union_ex([
|
]);
|
||||||
Slic3r::Geometry::Clipper::offset(
|
|
||||||
[Slic3r::Geometry::Clipper::offset($surface->expolygon, -2*$distance)],
|
|
||||||
+$distance,
|
|
||||||
),
|
|
||||||
])};
|
|
||||||
}
|
|
||||||
|
|
||||||
# now detect thin walls by re-outgrowing offsetted surfaces and subtracting
|
|
||||||
# them from the original slices
|
|
||||||
my $outgrown = [ Slic3r::Geometry::Clipper::offset([ map $_->p, @{$self->slices} ], $distance) ];
|
|
||||||
my $diff = diff_ex(
|
my $diff = diff_ex(
|
||||||
[ map $_->p, @surfaces ],
|
[ map $_->p, @{$self->slices} ],
|
||||||
$outgrown,
|
[ map @$_, @$outgrown ],
|
||||||
1,
|
1,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -223,18 +213,21 @@ sub make_perimeters {
|
||||||
|
|
||||||
# generate perimeters inwards (loop 0 is the external one)
|
# generate perimeters inwards (loop 0 is the external one)
|
||||||
my $loop_number = $Slic3r::Config->perimeters + ($surface->additional_inner_perimeters || 0);
|
my $loop_number = $Slic3r::Config->perimeters + ($surface->additional_inner_perimeters || 0);
|
||||||
push @perimeters, [[@last_offsets]] if $loop_number > 0;
|
push @perimeters, [] if $loop_number > 0;
|
||||||
|
|
||||||
# do one more loop (<= instead of <) so that we can detect gaps even after the desired
|
# do one more loop (<= instead of <) so that we can detect gaps even after the desired
|
||||||
# number of perimeters has been generated
|
# number of perimeters has been generated
|
||||||
for (my $loop = 1; $loop <= $loop_number; $loop++) {
|
for (my $loop = 0; $loop <= $loop_number; $loop++) {
|
||||||
|
my $spacing = $perimeter_spacing;
|
||||||
|
$spacing /= 2 if $loop == 0;
|
||||||
|
|
||||||
# offsetting a polygon can result in one or many offset polygons
|
# offsetting a polygon can result in one or many offset polygons
|
||||||
my @new_offsets = ();
|
my @new_offsets = ();
|
||||||
foreach my $expolygon (@last_offsets) {
|
foreach my $expolygon (@last_offsets) {
|
||||||
my @offsets = @{union_ex([
|
my @offsets = @{union_ex([
|
||||||
Slic3r::Geometry::Clipper::offset(
|
Slic3r::Geometry::Clipper::offset(
|
||||||
[Slic3r::Geometry::Clipper::offset($expolygon, -1.5*$perimeter_spacing)],
|
[Slic3r::Geometry::Clipper::offset($expolygon, -1.5*$spacing)],
|
||||||
+0.5*$perimeter_spacing,
|
+0.5*$spacing,
|
||||||
),
|
),
|
||||||
])};
|
])};
|
||||||
push @new_offsets, @offsets;
|
push @new_offsets, @offsets;
|
||||||
|
@ -242,10 +235,10 @@ sub make_perimeters {
|
||||||
# where the above check collapses the expolygon, then there's no room for an inner loop
|
# where the above check collapses the expolygon, then there's no room for an inner loop
|
||||||
# and we can extract the gap for later processing
|
# and we can extract the gap for later processing
|
||||||
my $diff = diff_ex(
|
my $diff = diff_ex(
|
||||||
[ map @$_, $expolygon->offset_ex(-0.5*$perimeter_spacing) ],
|
[ map @$_, $expolygon->offset_ex(-0.5*$spacing) ],
|
||||||
# +2 on the offset here makes sure that Clipper float truncation
|
# +2 on the offset here makes sure that Clipper float truncation
|
||||||
# won't shrink the clip polygon to be smaller than intended.
|
# won't shrink the clip polygon to be smaller than intended.
|
||||||
[ Slic3r::Geometry::Clipper::offset([map @$_, @offsets], +0.5*$perimeter_spacing + 2) ],
|
[ Slic3r::Geometry::Clipper::offset([map @$_, @offsets], +0.5*$spacing + 2) ],
|
||||||
);
|
);
|
||||||
push @gaps, grep $_->area >= $gap_area_threshold, @$diff;
|
push @gaps, grep $_->area >= $gap_area_threshold, @$diff;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue