Ported some methods to XS

This commit is contained in:
Alessandro Ranellucci 2014-08-03 18:41:09 +02:00
parent 1813a309a7
commit 380dd8adfc
13 changed files with 176 additions and 93 deletions

View file

@ -135,7 +135,7 @@ sub process_layer {
}
# tweak region ordering to save toolchanges
my @region_ids = 0 .. ($self->print->regions_count-1);
my @region_ids = 0 .. ($self->print->region_count-1);
if ($self->gcodegen->multiple_extruders) {
my $last_extruder = $self->gcodegen->extruder;
my $best_region_id = first { $self->print->regions->[$_]->config->perimeter_extruder-1 eq $last_extruder } @region_ids;

View file

@ -135,7 +135,7 @@ sub set_z {
my $interlaced = (defined first { $_->config->support_material } @{$print->objects})
|| (defined first { $_->config->infill_every_layers > 1 } @{$print->regions});
my $max_layer_height = $print->max_layer_height;
my $max_layer_height = $print->max_allowed_layer_height;
my @layers = ();
foreach my $object (@{$print->objects}) {

View file

@ -39,24 +39,6 @@ sub regions {
return [ map $self->get_region($_), 0..($self->region_count-1) ];
}
# merge all regions' slices to get islands
sub make_slices {
my $self = shift;
my $slices;
if (@{$self->regions} == 1) {
$slices = [ map $_->expolygon->clone, @{$self->regions->[0]->slices} ];
} else {
$slices = union_ex([ map $_->p, map @{$_->slices}, @{$self->regions} ]);
}
# sort slices
$slices = [ @$slices[@{chained_path([ map $_->contour->first_point, @$slices ])}] ];
$self->slices->clear;
$self->slices->append(@$slices);
}
sub merge_slices {
my ($self) = @_;
$_->merge_slices for @{$self->regions};

View file

@ -148,13 +148,6 @@ sub apply_config {
return $invalidated;
}
sub has_support_material {
my $self = shift;
return (first { $_->config->support_material } @{$self->objects})
|| (first { $_->config->raft_layers > 0 } @{$self->objects})
|| (first { $_->config->support_material_enforce_layers > 0 } @{$self->objects});
}
# caller is responsible for supplying models whose objects don't collide
# and have explicit instance positions
sub add_model_object {
@ -311,43 +304,6 @@ sub validate {
}
}
# 0-based indices of used extruders
sub extruders {
my ($self) = @_;
# initialize all extruder(s) we need
my @used_extruders = ();
foreach my $region (@{$self->regions}) {
push @used_extruders,
map $region->config->get("${_}_extruder")-1,
qw(perimeter infill);
}
foreach my $object (@{$self->objects}) {
push @used_extruders,
map $object->config->get("${_}_extruder")-1,
qw(support_material support_material_interface);
}
my %h = map { $_ => 1 } @used_extruders;
return [ sort keys %h ];
}
sub init_extruders {
my $self = shift;
return if $self->step_done(STEP_INIT_EXTRUDERS);
$self->set_step_started(STEP_INIT_EXTRUDERS);
# enforce tall skirt if using ooze_prevention
# FIXME: this is not idempotent (i.e. switching ooze_prevention off will not revert skirt settings)
if ($self->config->ooze_prevention && @{$self->extruders} > 1) {
$self->config->set('skirt_height', -1);
$self->config->set('skirts', 1) if $self->config->skirts == 0;
}
$self->set_step_done(STEP_INIT_EXTRUDERS);
}
# this value is not supposed to be compared with $layer->id
# since they have different semantics
sub total_layer_count {
@ -355,16 +311,6 @@ sub total_layer_count {
return max(map $_->total_layer_count, @{$self->objects});
}
sub regions_count {
my $self = shift;
return scalar @{$self->regions};
}
sub max_layer_height {
my ($self) = @_;
return max(@{$self->config->nozzle_diameter});
}
# the bounding box of objects placed in copies position
# (without taking skirt/brim/support material into account)
sub bounding_box {
@ -410,16 +356,6 @@ sub size {
return $self->bounding_box->size;
}
sub _simplify_slices {
my $self = shift;
my ($distance) = @_;
foreach my $layer (map @{$_->layers}, @{$self->objects}) {
$layer->slices->simplify($distance);
$_->slices->simplify($distance) for @{$layer->regions};
}
}
sub process {
my ($self) = @_;

View file

@ -173,7 +173,7 @@ sub slice {
}
# make sure all layers contain layer region objects for all regions
my $regions_count = $self->print->regions_count;
my $regions_count = $self->print->region_count;
foreach my $layer (@{ $self->layers }) {
$layer->region($_) for 0 .. ($regions_count-1);
}
@ -427,7 +427,7 @@ sub make_perimeters {
# but we don't generate any extra perimeter if fill density is zero, as they would be floating
# inside the object - infill_only_where_needed should be the method of choice for printing
# hollow objects
for my $region_id (0 .. ($self->print->regions_count-1)) {
for my $region_id (0 .. ($self->print->region_count-1)) {
my $region = $self->print->regions->[$region_id];
my $region_perimeters = $region->config->perimeters;
@ -555,7 +555,7 @@ sub infill {
threads => $self->print->config->threads,
items => sub {
my @items = (); # [layer_id, region_id]
for my $region_id (0 .. ($self->print->regions_count-1)) {
for my $region_id (0 .. ($self->print->region_count-1)) {
push @items, map [$_, $region_id], 0..($self->layer_count - 1);
}
@items;
@ -627,7 +627,7 @@ sub detect_surfaces_type {
my $self = shift;
Slic3r::debugf "Detecting solid surfaces...\n";
for my $region_id (0 .. ($self->print->regions_count-1)) {
for my $region_id (0 .. ($self->print->region_count-1)) {
for my $i (0 .. ($self->layer_count - 1)) {
my $layerm = $self->get_layer($i)->regions->[$region_id];
@ -885,7 +885,7 @@ sub bridge_over_infill {
sub process_external_surfaces {
my ($self) = @_;
for my $region_id (0 .. ($self->print->regions_count-1)) {
for my $region_id (0 .. ($self->print->region_count-1)) {
$self->get_layer(0)->regions->[$region_id]->process_external_surfaces(undef);
for my $i (1 .. ($self->layer_count - 1)) {
$self->get_layer($i)->regions->[$region_id]->process_external_surfaces($self->get_layer($i-1));
@ -898,7 +898,7 @@ sub discover_horizontal_shells {
Slic3r::debugf "==> DISCOVERING HORIZONTAL SHELLS\n";
for my $region_id (0 .. ($self->print->regions_count-1)) {
for my $region_id (0 .. ($self->print->region_count-1)) {
for (my $i = 0; $i < $self->layer_count; $i++) {
my $layerm = $self->get_layer($i)->regions->[$region_id];
@ -1048,7 +1048,7 @@ sub combine_infill {
my @layer_heights = map $_->height, @{$self->layers};
for my $region_id (0 .. ($self->print->regions_count-1)) {
for my $region_id (0 .. ($self->print->region_count-1)) {
my $region = $self->print->regions->[$region_id];
my $every = $region->config->infill_every_layers;