Bugfix: some solid layers were skipped. #47
This commit is contained in:
parent
9ab81880c9
commit
47c0da8110
@ -4,7 +4,7 @@ use Moo;
|
||||
use Math::Clipper ':all';
|
||||
use Slic3r::Geometry qw(polygon_lines points_coincide angle3points polyline_lines nearest_point
|
||||
line_length collinear X Y A B PI);
|
||||
use Slic3r::Geometry::Clipper qw(safety_offset union_ex);
|
||||
use Slic3r::Geometry::Clipper qw(safety_offset union_ex PFT_EVENODD);
|
||||
use XXX;
|
||||
|
||||
# a sequential number of layer, starting at 0
|
||||
@ -301,7 +301,7 @@ sub make_surfaces {
|
||||
}
|
||||
|
||||
{
|
||||
my $expolygons = union_ex([ @polygons ]);
|
||||
my $expolygons = union_ex([ @polygons ], PFT_EVENODD);
|
||||
Slic3r::debugf " %d surface(s) having %d holes detected from %d polylines\n",
|
||||
scalar(@$expolygons), scalar(map $_->holes, @$expolygons), scalar(@polygons);
|
||||
|
||||
|
@ -103,23 +103,6 @@ sub detect_surfaces_type {
|
||||
if ($upper_layer) {
|
||||
# offset upper layer surfaces by extrusion_width * perimeters
|
||||
@top = $surface_difference->($layer->surfaces, $upper_layer->surfaces, 'top');
|
||||
|
||||
# now check whether each resulting top surfaces is large enough to have its
|
||||
# own perimeters or whether it may be sufficient to use the lower layer's
|
||||
# perimeters
|
||||
|
||||
# offset upper layer's surfaces
|
||||
my $upper_surfaces_offsetted;
|
||||
{
|
||||
my $distance = $Slic3r::flow_width * ($Slic3r::perimeter_offsets + 1) / $Slic3r::resolution;
|
||||
$upper_surfaces_offsetted = offset([ map $_->p, @{$upper_layer->surfaces} ], $distance, 100, JT_MITER, 2);
|
||||
}
|
||||
|
||||
@top = grep {
|
||||
my $surface = $_;
|
||||
my $diff = diff_ex([ map $_->p, $surface ], $upper_surfaces_offsetted);
|
||||
@$diff;
|
||||
} @top;
|
||||
} else {
|
||||
# if no upper layer, all surfaces of this one are solid
|
||||
@top = @{$layer->surfaces};
|
||||
@ -146,25 +129,18 @@ sub detect_surfaces_type {
|
||||
@{$surface->contour->points} = map Slic3r::Point->new($_), @{ $offset->[0] };
|
||||
}
|
||||
|
||||
use Slic3r::SVG;
|
||||
Slic3r::SVG::output(undef, "layer_" . $layer->id . "_diff.svg",
|
||||
green_polygons => [ map $_->p, @{$layer->surfaces} ],
|
||||
red_polygons => [ map $_->p, @{$lower_layer->surfaces} ],
|
||||
);exit if $layer->id == 3;
|
||||
|
||||
# offset lower layer's surfaces
|
||||
my $lower_surfaces_offsetted;
|
||||
{
|
||||
my $distance = $Slic3r::flow_width * ($Slic3r::perimeter_offsets + 1) / $Slic3r::resolution;
|
||||
$lower_surfaces_offsetted = offset([ map $_->p, @{$lower_layer->surfaces} ], $distance, 100, JT_MITER, 2);
|
||||
if (0) {
|
||||
require "Slic3r/SVG.pm";
|
||||
Slic3r::SVG::output(undef, "layer_" . $layer->id . "_surfaces.svg",
|
||||
green_polygons => [ map $_->p, @{$layer->surfaces} ],
|
||||
red_polygons => [ map $_->p, @{$lower_layer->surfaces} ],
|
||||
);
|
||||
Slic3r::SVG::output(undef, "layer_" . $layer->id . "_diff.svg",
|
||||
red_polygons => [ map $_->p, @bottom ],
|
||||
);
|
||||
exit if $layer->id == 3;
|
||||
}
|
||||
|
||||
@bottom = grep {
|
||||
my $surface = $_;
|
||||
my $diff = diff_ex([ map $_->p, $surface ], $lower_surfaces_offsetted);
|
||||
@$diff;
|
||||
} @bottom;
|
||||
|
||||
} else {
|
||||
# if no lower layer, all surfaces of this one are solid
|
||||
@bottom = @{$layer->surfaces};
|
||||
|
Loading…
Reference in New Issue
Block a user