Fix raft_layers according to the new support material logic
This commit is contained in:
parent
d7656f5fdc
commit
3f7adfc07d
@ -25,30 +25,18 @@ sub BUILD {
|
||||
$self->init_config;
|
||||
|
||||
# make layers taking custom heights into account
|
||||
my $print_z = my $slice_z = my $height = 0;
|
||||
my $print_z = my $slice_z = my $height = my $id = 0;
|
||||
|
||||
# add raft layers
|
||||
for my $id (0 .. $self->config->raft_layers-1) {
|
||||
$height = ($id == 0)
|
||||
? $Slic3r::Config->get_value('first_layer_height')
|
||||
: $Slic3r::Config->layer_height;
|
||||
|
||||
$print_z += $height;
|
||||
|
||||
push @{$self->layers}, Slic3r::Layer->new(
|
||||
object => $self,
|
||||
id => $id,
|
||||
height => $height,
|
||||
print_z => $print_z,
|
||||
slice_z => -1,
|
||||
);
|
||||
if ($self->config->raft_layers > 0) {
|
||||
$print_z += $Slic3r::Config->get_value('first_layer_height');
|
||||
$print_z += $Slic3r::Config->layer_height * ($self->config->raft_layers - 1);
|
||||
$id += $self->config->raft_layers;
|
||||
}
|
||||
|
||||
# loop until we have at least one layer and the max slice_z reaches the object height
|
||||
my $max_z = unscale $self->size->[Z];
|
||||
while (!@{$self->layers} || ($slice_z - $height) <= $max_z) {
|
||||
my $id = $#{$self->layers} + 1;
|
||||
|
||||
# assign the default height to the layer according to the general settings
|
||||
$height = ($id == 0)
|
||||
? $Slic3r::Config->get_value('first_layer_height')
|
||||
@ -77,6 +65,7 @@ sub BUILD {
|
||||
print_z => $print_z,
|
||||
slice_z => scale $slice_z,
|
||||
);
|
||||
$id++;
|
||||
|
||||
$slice_z += $height/2; # add the other half layer
|
||||
}
|
||||
|
@ -80,8 +80,14 @@ sub contact_area {
|
||||
# determine contact areas
|
||||
my %contact = (); # contact_z => [ polygons ]
|
||||
my %overhang = (); # contact_z => [ polygons ] - this stores the actual overhang supported by each contact layer
|
||||
for my $layer_id (1 .. $#{$object->layers}) {
|
||||
last if $layer_id > $self->config->raft_layers && !$self->config->support_material;
|
||||
for my $layer_id (0 .. $#{$object->layers}) {
|
||||
if ($self->config->raft_layers == 0) {
|
||||
next if $layer_id == 0;
|
||||
} elsif (!$self->config->support_material) {
|
||||
# if we are only going to generate raft just check
|
||||
# the 'overhangs' of the first object layer
|
||||
last if $layer_id > 0;
|
||||
}
|
||||
my $layer = $object->layers->[$layer_id];
|
||||
my $lower_layer = $object->layers->[$layer_id-1];
|
||||
|
||||
@ -93,7 +99,8 @@ sub contact_area {
|
||||
|
||||
# If a threshold angle was specified, use a different logic for detecting overhangs.
|
||||
if (defined $threshold_rad
|
||||
|| $layer_id <= $self->config->support_material_enforce_layers + $self->config->raft_layers) {
|
||||
|| $layer_id < $self->config->support_material_enforce_layers
|
||||
|| $self->config->raft_layers > 0) {
|
||||
my $d = defined $threshold_rad
|
||||
? scale $lower_layer->height * ((cos $threshold_rad) / (sin $threshold_rad))
|
||||
: 0;
|
||||
@ -233,6 +240,17 @@ sub support_layers_z {
|
||||
shift @z while @z && $z[0] <= $first_layer_height;
|
||||
unshift @z, $first_layer_height;
|
||||
|
||||
# add raft layers by dividing the space between first layer and
|
||||
# first contact layer evenly
|
||||
if ($self->config->raft_layers > 1) {
|
||||
# $z[1] is last raft layer (contact layer for the first layer object)
|
||||
my $height = ($z[1] - $z[0]) / ($self->config->raft_layers - 1);
|
||||
splice @z, 1, 0,
|
||||
map { int($_*100)/100 }
|
||||
map { $z[0] + $height * $_ }
|
||||
0..($self->config->raft_layers - 1);
|
||||
}
|
||||
|
||||
for (my $i = $#z; $i >= 0; $i--) {
|
||||
my $target_height = $support_material_height;
|
||||
if ($i > 0 && $top{ $z[$i-1] }) {
|
||||
|
Loading…
Reference in New Issue
Block a user