Recent changes made Slic3r less tolerant with dirty STL files. Now we are able again to slice Prusa parts. #16
This commit is contained in:
parent
eb64cc4965
commit
b79ae44e3d
@ -38,7 +38,7 @@ use constant MIN => 0;
|
|||||||
use constant MAX => 1;
|
use constant MAX => 1;
|
||||||
our $parallel_degrees_limit = abs(deg2rad(3));
|
our $parallel_degrees_limit = abs(deg2rad(3));
|
||||||
|
|
||||||
our $epsilon = 1E-6;
|
our $epsilon = 1E-4;
|
||||||
sub epsilon () { $epsilon }
|
sub epsilon () { $epsilon }
|
||||||
|
|
||||||
sub scale ($) { $_[0] / $Slic3r::resolution }
|
sub scale ($) { $_[0] / $Slic3r::resolution }
|
||||||
@ -212,7 +212,7 @@ sub polyline_lines {
|
|||||||
my @lines = ();
|
my @lines = ();
|
||||||
my $last_point;
|
my $last_point;
|
||||||
foreach my $point (@$polygon) {
|
foreach my $point (@$polygon) {
|
||||||
push @lines, [ $last_point, $point ] if $last_point;
|
push @lines, Slic3r::Line->new($last_point, $point) if $last_point;
|
||||||
$last_point = $point;
|
$last_point = $point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ package Slic3r::TriangleMesh;
|
|||||||
use Moo;
|
use Moo;
|
||||||
|
|
||||||
use Slic3r::Geometry qw(X Y Z A B PI epsilon same_point points_coincide angle3points
|
use Slic3r::Geometry qw(X Y Z A B PI epsilon same_point points_coincide angle3points
|
||||||
merge_collinear_lines nearest_point);
|
merge_collinear_lines nearest_point polyline_lines);
|
||||||
use XXX;
|
use XXX;
|
||||||
|
|
||||||
has 'facets' => (is => 'ro', default => sub { [] });
|
has 'facets' => (is => 'ro', default => sub { [] });
|
||||||
@ -194,17 +194,28 @@ sub make_loops {
|
|||||||
Slic3r::debugf " %d lines out of %d were discarded and %d polylines were not closed\n",
|
Slic3r::debugf " %d lines out of %d were discarded and %d polylines were not closed\n",
|
||||||
scalar(@discarded_lines), scalar(@lines), scalar(@discarded_polylines);
|
scalar(@discarded_lines), scalar(@lines), scalar(@discarded_polylines);
|
||||||
print " Warning: errors while parsing this layer (dirty or non-manifold model).\n";
|
print " Warning: errors while parsing this layer (dirty or non-manifold model).\n";
|
||||||
|
|
||||||
|
my $total_detected_length = 0;
|
||||||
|
$total_detected_length += $_->length for map $_->lines, @polygons;
|
||||||
|
my $total_discarded_length = 0;
|
||||||
|
$total_discarded_length += $_->length for map polyline_lines($_), @discarded_polylines;
|
||||||
|
$total_discarded_length += $_->length for @discarded_lines;
|
||||||
|
my $discarded_ratio = $total_discarded_length / $total_detected_length;
|
||||||
|
|
||||||
|
Slic3r::debugf " length ratio of discarded lines is %f\n", $discarded_ratio;
|
||||||
|
|
||||||
|
if ($discarded_ratio > 0.00001) {
|
||||||
print " Retrying with slower algorithm.\n";
|
print " Retrying with slower algorithm.\n";
|
||||||
|
|
||||||
if (0) {
|
if (0) {
|
||||||
require "Slic3r/SVG.pm";
|
require "Slic3r/SVG.pm";
|
||||||
Slic3r::SVG::output(undef, "layer" . $self->id . "_detected.svg",
|
Slic3r::SVG::output(undef, "layer" . $layer->id . "_detected.svg",
|
||||||
white_polygons => \@polygons,
|
white_polygons => \@polygons,
|
||||||
);
|
);
|
||||||
Slic3r::SVG::output(undef, "layer" . $self->id . "_discarded_lines.svg",
|
Slic3r::SVG::output(undef, "layer" . $layer->id . "_discarded_lines.svg",
|
||||||
red_lines => \@discarded_lines,
|
red_lines => \@discarded_lines,
|
||||||
);
|
);
|
||||||
Slic3r::SVG::output(undef, "layer" . $self->id . "_discarded_polylines.svg",
|
Slic3r::SVG::output(undef, "layer" . $layer->id . "_discarded_polylines.svg",
|
||||||
polylines => \@discarded_polylines,
|
polylines => \@discarded_polylines,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -218,6 +229,7 @@ sub make_loops {
|
|||||||
$layer->slicing_errors(1);
|
$layer->slicing_errors(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return [@polygons];
|
return [@polygons];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user