mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 09:47:58 -06:00
Completely rewritten the slicing algorithm
It should work with any model now. There are still problems with some bridges.
This commit is contained in:
parent
ad27f25c71
commit
459577f9a2
8 changed files with 137 additions and 246 deletions
|
@ -80,11 +80,6 @@ sub parse_file {
|
|||
foreach my $vertex (@vertices) {
|
||||
$vertex->[$_] = ($Slic3r::scale * $vertex->[$_] / $Slic3r::resolution) + $shift[$_]
|
||||
for X,Y,Z;
|
||||
|
||||
# round Z coordinates to the nearest multiple of layer height
|
||||
# XY will be rounded automatically to integers with coercion
|
||||
$vertex->[Z] = int($vertex->[Z] * $Slic3r::resolution / $Slic3r::layer_height)
|
||||
* $Slic3r::layer_height / $Slic3r::resolution;
|
||||
}
|
||||
|
||||
foreach my $copy (@copies) {
|
||||
|
@ -113,10 +108,14 @@ sub _facet {
|
|||
}
|
||||
Slic3r::debugf "z: min = %.0f, max = %.0f\n", $min_z, $max_z;
|
||||
|
||||
if ($min_z == $max_z) {
|
||||
Slic3r::debugf "Facet is horizontal; ignoring\n";
|
||||
return;
|
||||
}
|
||||
|
||||
# calculate the layer extents
|
||||
my $min_layer = int($min_z * $Slic3r::resolution / $Slic3r::layer_height);
|
||||
my $max_layer = int(0.99999 + ($max_z * $Slic3r::resolution / $Slic3r::layer_height));
|
||||
|
||||
my $max_layer = int($max_z * $Slic3r::resolution / $Slic3r::layer_height);
|
||||
Slic3r::debugf "layers: min = %s, max = %s\n", $min_layer, $max_layer;
|
||||
|
||||
# reorder vertices so that the first one is the one with lowest Z
|
||||
|
@ -127,62 +126,6 @@ sub _facet {
|
|||
@vertices = (splice(@vertices, $z_order[0]), splice(@vertices, 0, $z_order[0]));
|
||||
}
|
||||
|
||||
# is the facet horizontal?
|
||||
# (note that we can have $min_z == $max_z && $min_layer != $max_layer
|
||||
# if $min_z % $layer_height != 0)
|
||||
if ($min_z == $max_z) {
|
||||
my $layer = $print->layer($min_layer);
|
||||
|
||||
# if all vertices are aligned, then facet is not horizontal but vertical
|
||||
# with a height less than layer height: that's why it was squashed on a
|
||||
# single layer
|
||||
##local $Slic3r::Geometry::parallel_degrees_limit = 1;
|
||||
##if (three_points_aligned(@vertices)) {
|
||||
if (0 && abs($normal->[Z]) == 0) {
|
||||
Slic3r::debugf "Facet is vertical with a height less than layer height\n";
|
||||
|
||||
my ($p1, $p2, $p3) = @vertices;
|
||||
$layer->add_line(Slic3r::Line::FacetEdge->cast(
|
||||
$_,
|
||||
edge_type => 'bottom',
|
||||
)) for ([$p1, $p2], [$p2, $p3], [$p1, $p3], [$p2, $p1], [$p3, $p2], [$p3, $p1]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Slic3r::debugf "Facet is horizontal\n";
|
||||
my $surface = $layer->add_surface(@vertices);
|
||||
|
||||
# to determine whether the surface is a top or bottom let's recompute
|
||||
# the normal using the right-hand rule
|
||||
# (this relies on the STL to be well-formed)
|
||||
# recompute the normal using the right-hand rule
|
||||
my $vertices_p = [@vertices];
|
||||
integerize_coordinate_sets($vertices_p);
|
||||
my $clockwise = !is_counter_clockwise($vertices_p);
|
||||
|
||||
# defensive programming and/or input check
|
||||
if (abs($normal->[Z]) == 1) {
|
||||
# while the vertices may belong to the same layer, it doesn't mean the facet
|
||||
# was horizontal in the original model; so this check makes sense only
|
||||
# if the original normal is exactly 1 or -1
|
||||
if (($normal->[Z] > 0 && $clockwise) || ($normal->[Z] < 0 && !$clockwise)) {
|
||||
YYY $normal;
|
||||
die sprintf "STL normal (%.0f) and right-hand rule computation (%s) differ!\n",
|
||||
$normal->[Z], $clockwise ? 'clockwise' : 'counter-clockwise';
|
||||
}
|
||||
}
|
||||
|
||||
if ($layer->id == 0 && !$clockwise) {
|
||||
YYY $normal;
|
||||
die "Right-hand rule gives bad result for facets on base layer!\n";
|
||||
}
|
||||
|
||||
$surface->surface_type($clockwise ? 'bottom' : 'top');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for (my $layer_id = $min_layer; $layer_id <= $max_layer; $layer_id++) {
|
||||
my $layer = $print->layer($layer_id);
|
||||
$layer->add_line($_) for $self->intersect_facet(\@vertices, $layer->z);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue