mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-23 14:44:19 -06:00
Revert "Refactoring: initialize all layers at once and avoid duplication of slicing height math". #637
This reverts commit 08270022dd
.
This commit is contained in:
parent
08270022dd
commit
9bd1b0f6ba
3 changed files with 24 additions and 25 deletions
|
@ -477,7 +477,7 @@ sub make_skirt {
|
||||||
$skirt_height = $self->layer_count if $skirt_height > $self->layer_count;
|
$skirt_height = $self->layer_count if $skirt_height > $self->layer_count;
|
||||||
my @points = ();
|
my @points = ();
|
||||||
foreach my $obj_idx (0 .. $#{$self->objects}) {
|
foreach my $obj_idx (0 .. $#{$self->objects}) {
|
||||||
my @layers = map $self->objects->[$obj_idx]->layers->[$_], 0..($skirt_height-1);
|
my @layers = map $self->objects->[$obj_idx]->layer($_), 0..($skirt_height-1);
|
||||||
my @layer_points = (
|
my @layer_points = (
|
||||||
(map @$_, map @{$_->expolygon}, map @{$_->slices}, @layers),
|
(map @$_, map @{$_->expolygon}, map @{$_->slices}, @layers),
|
||||||
(map @$_, map @{$_->thin_walls}, @layers),
|
(map @$_, map @{$_->thin_walls}, @layers),
|
||||||
|
|
|
@ -2,42 +2,39 @@ package Slic3r::Print::Object;
|
||||||
use Moo;
|
use Moo;
|
||||||
|
|
||||||
use Slic3r::ExtrusionPath ':roles';
|
use Slic3r::ExtrusionPath ':roles';
|
||||||
use Slic3r::Geometry qw(Z scale unscale deg2rad);
|
use Slic3r::Geometry qw(scale unscale deg2rad);
|
||||||
use Slic3r::Geometry::Clipper qw(diff_ex intersection_ex union_ex);
|
use Slic3r::Geometry::Clipper qw(diff_ex intersection_ex union_ex);
|
||||||
use Slic3r::Surface ':types';
|
use Slic3r::Surface ':types';
|
||||||
|
|
||||||
has 'input_file' => (is => 'rw', required => 0);
|
has 'input_file' => (is => 'rw', required => 0);
|
||||||
has 'mesh' => (is => 'rw', required => 0);
|
has 'mesh' => (is => 'rw', required => 0);
|
||||||
has 'size' => (is => 'rw', required => 1);
|
has 'size' => (is => 'rw', required => 1);
|
||||||
has 'layers' => (is => 'rw', default => sub { [] } );
|
|
||||||
|
|
||||||
sub BUILD {
|
has 'layers' => (
|
||||||
my $self = shift;
|
traits => ['Array'],
|
||||||
|
is => 'rw',
|
||||||
# make layers
|
#isa => 'ArrayRef[Slic3r::Layer]',
|
||||||
while (!@{$self->layers} || $self->layers->[-1]->slice_z < $self->size->[Z]) {
|
default => sub { [] },
|
||||||
push @{$self->layers}, Slic3r::Layer->new(id => $#{$self->layers} + 1);
|
);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub layer_count {
|
sub layer_count {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
return scalar @{ $self->layers };
|
return scalar @{ $self->layers };
|
||||||
}
|
}
|
||||||
|
|
||||||
sub get_layer_range {
|
sub layer {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($min_z, $max_z) = @_;
|
my ($layer_id) = @_;
|
||||||
|
|
||||||
my ($min_layer, $max_layer) = (0, undef);
|
# extend our print by creating all necessary layers
|
||||||
for my $layer (@{$self->layers}) {
|
|
||||||
$min_layer = $layer->id if $layer->slice_z <= $min_z;
|
if ($self->layer_count < $layer_id + 1) {
|
||||||
if ($layer->slice_z >= $max_z) {
|
for (my $i = $self->layer_count; $i <= $layer_id; $i++) {
|
||||||
$max_layer = $layer->id;
|
push @{ $self->layers }, Slic3r::Layer->new(id => $i);
|
||||||
last;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ($min_layer, $max_layer);
|
|
||||||
|
return $self->layers->[$layer_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
sub slice {
|
sub slice {
|
||||||
|
@ -49,7 +46,7 @@ sub slice {
|
||||||
my $apply_lines = sub {
|
my $apply_lines = sub {
|
||||||
my $lines = shift;
|
my $lines = shift;
|
||||||
foreach my $layer_id (keys %$lines) {
|
foreach my $layer_id (keys %$lines) {
|
||||||
my $layer = $self->layers->[$layer_id];
|
my $layer = $self->layer($layer_id);
|
||||||
push @{$layer->lines}, @{$lines->{$layer_id}};
|
push @{$layer->lines}, @{$lines->{$layer_id}};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -402,7 +399,7 @@ sub combine_infill {
|
||||||
|
|
||||||
# start from bottom, skip first layer
|
# start from bottom, skip first layer
|
||||||
for (my $i = 1; $i < $self->layer_count; $i++) {
|
for (my $i = 1; $i < $self->layer_count; $i++) {
|
||||||
my $layer = $self->layers->[$i];
|
my $layer = $self->layer($i);
|
||||||
|
|
||||||
# skip layer if no internal fill surfaces
|
# skip layer if no internal fill surfaces
|
||||||
next if !grep $_->surface_type == S_TYPE_INTERNAL, @{$layer->fill_surfaces};
|
next if !grep $_->surface_type == S_TYPE_INTERNAL, @{$layer->fill_surfaces};
|
||||||
|
@ -411,7 +408,7 @@ sub combine_infill {
|
||||||
# we do this from the greater depth to the smaller
|
# we do this from the greater depth to the smaller
|
||||||
for (my $d = $Slic3r::Config->infill_every_layers - 1; $d >= 1; $d--) {
|
for (my $d = $Slic3r::Config->infill_every_layers - 1; $d >= 1; $d--) {
|
||||||
next if ($i - $d) < 0;
|
next if ($i - $d) < 0;
|
||||||
my $lower_layer = $self->layers->[$i - 1];
|
my $lower_layer = $self->layer($i - 1);
|
||||||
|
|
||||||
# select surfaces of the lower layer having the depth we're looking for
|
# select surfaces of the lower layer having the depth we're looking for
|
||||||
my @lower_surfaces = grep $_->depth_layers == $d && $_->surface_type == S_TYPE_INTERNAL,
|
my @lower_surfaces = grep $_->depth_layers == $d && $_->surface_type == S_TYPE_INTERNAL,
|
||||||
|
|
|
@ -401,12 +401,14 @@ sub slice_facet {
|
||||||
}
|
}
|
||||||
|
|
||||||
# calculate the layer extents
|
# calculate the layer extents
|
||||||
my ($min_layer, $max_layer) = $print_object->get_layer_range($min_z, $max_z);
|
my $min_layer = int((unscale($min_z) - ($Slic3r::Config->get_value('first_layer_height') + $Slic3r::Config->layer_height / 2)) / $Slic3r::Config->layer_height) - 2;
|
||||||
|
$min_layer = 0 if $min_layer < 0;
|
||||||
|
my $max_layer = int((unscale($max_z) - ($Slic3r::Config->get_value('first_layer_height') + $Slic3r::Config->layer_height / 2)) / $Slic3r::Config->layer_height) + 2;
|
||||||
Slic3r::debugf "layers: min = %s, max = %s\n", $min_layer, $max_layer;
|
Slic3r::debugf "layers: min = %s, max = %s\n", $min_layer, $max_layer;
|
||||||
|
|
||||||
my $lines = {}; # layer_id => [ lines ]
|
my $lines = {}; # layer_id => [ lines ]
|
||||||
for (my $layer_id = $min_layer; $layer_id <= $max_layer; $layer_id++) {
|
for (my $layer_id = $min_layer; $layer_id <= $max_layer; $layer_id++) {
|
||||||
my $layer = $print_object->layers->[$layer_id];
|
my $layer = $print_object->layer($layer_id);
|
||||||
$lines->{$layer_id} ||= [];
|
$lines->{$layer_id} ||= [];
|
||||||
push @{ $lines->{$layer_id} }, $self->intersect_facet($facet_id, $layer->slice_z);
|
push @{ $lines->{$layer_id} }, $self->intersect_facet($facet_id, $layer->slice_z);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue