mirror of
https://github.com/FULU-Foundation/OrcaSlicer-bambulab.git
synced 2026-10-12 10:21:58 +02:00
Merge branch 'sapir-call_get_layer'
This commit is contained in:
commit
7d4114f8b7
4 files changed
+39
-38
No files matched your search
+2
-2
@@ -557,7 +557,7 @@ sub make_skirt {
|
||||
? scalar(@{$object->layers})
|
||||
: min($self->config->skirt_height, scalar(@{$object->layers}));
|
||||
|
||||
my $highest_layer = $object->layers->[$skirt_height-1];
|
||||
my $highest_layer = $object->get_layer($skirt_height - 1);
|
||||
$skirt_height_z = max($skirt_height_z, $highest_layer->print_z);
|
||||
}
|
||||
|
||||
@@ -685,7 +685,7 @@ sub make_brim {
|
||||
my @islands = (); # array of polygons
|
||||
foreach my $obj_idx (0 .. ($self->object_count - 1)) {
|
||||
my $object = $self->objects->[$obj_idx];
|
||||
my $layer0 = $object->layers->[0];
|
||||
my $layer0 = $object->get_layer(0);
|
||||
my @object_islands = (
|
||||
(map $_->contour, @{$layer0->slices}),
|
||||
);
|
||||
|
||||
+34
-33
@@ -161,9 +161,10 @@ sub slice {
|
||||
### Slic3r::debugf "Layer %d: height = %s; slice_z = %s; print_z = %s\n", $id, $height, $slice_z, $print_z;
|
||||
|
||||
$self->add_layer($id, $height, $print_z, $slice_z);
|
||||
if (@{$self->layers} >= 2) {
|
||||
$self->layers->[-2]->set_upper_layer($self->layers->[-1]);
|
||||
$self->layers->[-1]->set_lower_layer($self->layers->[-2]);
|
||||
if ($self->layer_count >= 2) {
|
||||
my $lc = $self->layer_count;
|
||||
$self->get_layer($lc - 2)->set_upper_layer($self->get_layer($lc - 1));
|
||||
$self->get_layer($lc - 1)->set_lower_layer($self->get_layer($lc - 2));
|
||||
}
|
||||
$id++;
|
||||
|
||||
@@ -184,7 +185,7 @@ sub slice {
|
||||
for my $region_id (0..($self->region_count - 1)) {
|
||||
my $expolygons_by_layer = $self->_slice_region($region_id, \@z, 0);
|
||||
for my $layer_id (0..$#$expolygons_by_layer) {
|
||||
my $layerm = $self->layers->[$layer_id]->regions->[$region_id];
|
||||
my $layerm = $self->get_layer($layer_id)->regions->[$region_id];
|
||||
$layerm->slices->clear;
|
||||
foreach my $expolygon (@{ $expolygons_by_layer->[$layer_id] }) {
|
||||
$layerm->slices->append(Slic3r::Surface->new(
|
||||
@@ -205,8 +206,8 @@ sub slice {
|
||||
next if $other_region_id == $region_id;
|
||||
|
||||
for my $layer_id (0..$#$expolygons_by_layer) {
|
||||
my $layerm = $self->layers->[$layer_id]->regions->[$region_id];
|
||||
my $other_layerm = $self->layers->[$layer_id]->regions->[$other_region_id];
|
||||
my $layerm = $self->get_layer($layer_id)->regions->[$region_id];
|
||||
my $other_layerm = $self->get_layer($layer_id)->regions->[$other_region_id];
|
||||
|
||||
my $other_slices = [ map $_->p, @{$other_layerm->slices} ]; # Polygons
|
||||
my $my_parts = intersection_ex(
|
||||
@@ -236,7 +237,7 @@ sub slice {
|
||||
|
||||
# remove last layer(s) if empty
|
||||
$self->delete_layer($self->layer_count - 1)
|
||||
while $self->layer_count && (!map @{$_->slices}, @{$self->layers->[-1]->regions});
|
||||
while $self->layer_count && (!map @{$_->slices}, @{$self->get_layer($self->layer_count - 1)->regions});
|
||||
|
||||
foreach my $layer (@{ $self->layers }) {
|
||||
# apply size compensation
|
||||
@@ -299,7 +300,7 @@ sub slice {
|
||||
# detect slicing errors
|
||||
my $warning_thrown = 0;
|
||||
for my $i (0 .. ($self->layer_count - 1)) {
|
||||
my $layer = $self->layers->[$i];
|
||||
my $layer = $self->get_layer($i);
|
||||
next unless $layer->slicing_errors;
|
||||
if (!$warning_thrown) {
|
||||
warn "The model has overlapping or self-intersecting facets. I tried to repair it, "
|
||||
@@ -316,14 +317,14 @@ sub slice {
|
||||
|
||||
my (@upper_surfaces, @lower_surfaces);
|
||||
for (my $j = $i+1; $j < $self->layer_count; $j++) {
|
||||
if (!$self->layers->[$j]->slicing_errors) {
|
||||
@upper_surfaces = @{$self->layers->[$j]->region($region_id)->slices};
|
||||
if (!$self->get_layer($j)->slicing_errors) {
|
||||
@upper_surfaces = @{$self->get_layer($j)->region($region_id)->slices};
|
||||
last;
|
||||
}
|
||||
}
|
||||
for (my $j = $i-1; $j >= 0; $j--) {
|
||||
if (!$self->layers->[$j]->slicing_errors) {
|
||||
@lower_surfaces = @{$self->layers->[$j]->region($region_id)->slices};
|
||||
if (!$self->get_layer($j)->slicing_errors) {
|
||||
@lower_surfaces = @{$self->get_layer($j)->region($region_id)->slices};
|
||||
last;
|
||||
}
|
||||
}
|
||||
@@ -349,10 +350,10 @@ sub slice {
|
||||
}
|
||||
|
||||
# remove empty layers from bottom
|
||||
while (@{$self->layers} && !@{$self->layers->[0]->slices}) {
|
||||
while (@{$self->layers} && !@{$self->get_layer(0)->slices}) {
|
||||
shift @{$self->layers};
|
||||
for (my $i = 0; $i <= $#{$self->layers}; $i++) {
|
||||
$self->layers->[$i]->id( $self->layers->[$i]->id-1 );
|
||||
$self->get_layer($i)->id( $self->get_layer($i)->id-1 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -423,8 +424,8 @@ sub make_perimeters {
|
||||
|
||||
if ($region->config->extra_perimeters && $region_perimeters > 0 && $region->config->fill_density > 0) {
|
||||
for my $i (0 .. ($self->layer_count - 2)) {
|
||||
my $layerm = $self->layers->[$i]->regions->[$region_id];
|
||||
my $upper_layerm = $self->layers->[$i+1]->regions->[$region_id];
|
||||
my $layerm = $self->get_layer($i)->regions->[$region_id];
|
||||
my $upper_layerm = $self->get_layer($i+1)->regions->[$region_id];
|
||||
my $perimeter_spacing = $layerm->flow(FLOW_ROLE_PERIMETER)->scaled_spacing;
|
||||
my $ext_perimeter_spacing = $layerm->flow(FLOW_ROLE_EXTERNAL_PERIMETER)->scaled_spacing;
|
||||
|
||||
@@ -476,7 +477,7 @@ sub make_perimeters {
|
||||
thread_cb => sub {
|
||||
my $q = shift;
|
||||
while (defined (my $i = $q->dequeue)) {
|
||||
$self->layers->[$i]->make_perimeters;
|
||||
$self->get_layer($i)->make_perimeters;
|
||||
}
|
||||
},
|
||||
collect_cb => sub {},
|
||||
@@ -553,7 +554,7 @@ sub infill {
|
||||
my $q = shift;
|
||||
while (defined (my $obj_layer = $q->dequeue)) {
|
||||
my ($i, $region_id) = @$obj_layer;
|
||||
my $layerm = $self->layers->[$i]->regions->[$region_id];
|
||||
my $layerm = $self->get_layer($i)->regions->[$region_id];
|
||||
$layerm->fills->clear;
|
||||
$layerm->fills->append( $self->fill_maker->make_fill($layerm) );
|
||||
}
|
||||
@@ -618,7 +619,7 @@ sub detect_surfaces_type {
|
||||
|
||||
for my $region_id (0 .. ($self->print->regions_count-1)) {
|
||||
for my $i (0 .. ($self->layer_count - 1)) {
|
||||
my $layerm = $self->layers->[$i]->regions->[$region_id];
|
||||
my $layerm = $self->get_layer($i)->regions->[$region_id];
|
||||
|
||||
# prepare a reusable subroutine to make surface differences
|
||||
my $difference = sub {
|
||||
@@ -636,8 +637,8 @@ sub detect_surfaces_type {
|
||||
|
||||
# comparison happens against the *full* slices (considering all regions)
|
||||
# unless internal shells are requested
|
||||
my $upper_layer = $self->layers->[$i+1];
|
||||
my $lower_layer = $i > 0 ? $self->layers->[$i-1] : undef;
|
||||
my $upper_layer = $i < $self->layer_count - 1 ? $self->get_layer($i+1) : undef;
|
||||
my $lower_layer = $i > 0 ? $self->get_layer($i-1) : undef;
|
||||
|
||||
# find top surfaces (difference between current surfaces
|
||||
# of current layer and upper one)
|
||||
@@ -750,7 +751,7 @@ sub clip_fill_surfaces {
|
||||
|
||||
my $overhangs = []; # arrayref of polygons
|
||||
for my $layer_id (reverse 0..($self->layer_count - 1)) {
|
||||
my $layer = $self->layers->[$layer_id];
|
||||
my $layer = $self->get_layer($layer_id);
|
||||
my @layer_internal = (); # arrayref of Surface objects
|
||||
my @new_internal = (); # arrayref of Surface objects
|
||||
|
||||
@@ -803,9 +804,9 @@ sub bridge_over_infill {
|
||||
next if $fill_density == 100 || $fill_density == 0;
|
||||
|
||||
for my $layer_id (1..($self->layer_count - 1)) {
|
||||
my $layer = $self->layers->[$layer_id];
|
||||
my $layer = $self->get_layer($layer_id);
|
||||
my $layerm = $layer->regions->[$region_id];
|
||||
my $lower_layer = $self->layers->[$layer_id-1];
|
||||
my $lower_layer = $self->get_layer($layer_id-1);
|
||||
|
||||
# compute the areas needing bridge math
|
||||
my @internal_solid = @{$layerm->fill_surfaces->filter_by_type(S_TYPE_INTERNALSOLID)};
|
||||
@@ -841,9 +842,9 @@ sub bridge_over_infill {
|
||||
# Update: do not exclude any infill. Sparse infill is able to absorb the excess material.
|
||||
if (0) {
|
||||
my $excess = $layerm->extruders->{infill}->bridge_flow->width - $layerm->height;
|
||||
for (my $i = $layer_id-1; $excess >= $self->layers->[$i]->height; $i--) {
|
||||
for (my $i = $layer_id-1; $excess >= $self->get_layer($i)->height; $i--) {
|
||||
Slic3r::debugf " skipping infill below those areas at layer %d\n", $i;
|
||||
foreach my $lower_layerm (@{$self->layers->[$i]->regions}) {
|
||||
foreach my $lower_layerm (@{$self->get_layer($i)->regions}) {
|
||||
my @new_surfaces = ();
|
||||
# subtract the area from all types of surfaces
|
||||
foreach my $group (@{$lower_layerm->fill_surfaces->group}) {
|
||||
@@ -864,7 +865,7 @@ sub bridge_over_infill {
|
||||
$lower_layerm->fill_surfaces->append(@new_surfaces);
|
||||
}
|
||||
|
||||
$excess -= $self->layers->[$i]->height;
|
||||
$excess -= $self->get_layer($i)->height;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -875,9 +876,9 @@ sub process_external_surfaces {
|
||||
my ($self) = @_;
|
||||
|
||||
for my $region_id (0 .. ($self->print->regions_count-1)) {
|
||||
$self->layers->[0]->regions->[$region_id]->process_external_surfaces(undef);
|
||||
$self->get_layer(0)->regions->[$region_id]->process_external_surfaces(undef);
|
||||
for my $i (1 .. ($self->layer_count - 1)) {
|
||||
$self->layers->[$i]->regions->[$region_id]->process_external_surfaces($self->layers->[$i-1]);
|
||||
$self->get_layer($i)->regions->[$region_id]->process_external_surfaces($self->get_layer($i-1));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -889,7 +890,7 @@ sub discover_horizontal_shells {
|
||||
|
||||
for my $region_id (0 .. ($self->print->regions_count-1)) {
|
||||
for (my $i = 0; $i < $self->layer_count; $i++) {
|
||||
my $layerm = $self->layers->[$i]->regions->[$region_id];
|
||||
my $layerm = $self->get_layer($i)->regions->[$region_id];
|
||||
|
||||
if ($layerm->config->solid_infill_every_layers && $layerm->config->fill_density > 0
|
||||
&& ($i % $layerm->config->solid_infill_every_layers) == 0) {
|
||||
@@ -923,7 +924,7 @@ sub discover_horizontal_shells {
|
||||
next if $n < 0 || $n >= $self->layer_count;
|
||||
Slic3r::debugf " looking for neighbors on layer %d...\n", $n;
|
||||
|
||||
my $neighbor_layerm = $self->layers->[$n]->regions->[$region_id];
|
||||
my $neighbor_layerm = $self->get_layer($n)->regions->[$region_id];
|
||||
my $neighbor_fill_surfaces = $neighbor_layerm->fill_surfaces;
|
||||
my @neighbor_fill_surfaces = map $_->clone, @$neighbor_fill_surfaces; # clone because we will use these surfaces even after clearing the collection
|
||||
|
||||
@@ -1049,7 +1050,7 @@ sub combine_infill {
|
||||
{
|
||||
my $current_height = my $layers = 0;
|
||||
for my $layer_id (1 .. $#layer_heights) {
|
||||
my $height = $self->layers->[$layer_id]->height;
|
||||
my $height = $self->get_layer($layer_id)->height;
|
||||
|
||||
if ($current_height + $height >= $nozzle_diameter || $layers >= $every) {
|
||||
$combine[$layer_id-1] = $layers;
|
||||
@@ -1064,7 +1065,7 @@ sub combine_infill {
|
||||
# skip bottom layer
|
||||
for my $layer_id (1 .. $#combine) {
|
||||
next unless ($combine[$layer_id] // 1) > 1;
|
||||
my @layerms = map $self->layers->[$_]->regions->[$region_id],
|
||||
my @layerms = map $self->get_layer($_)->regions->[$region_id],
|
||||
($layer_id - ($combine[$layer_id]-1) .. $layer_id);
|
||||
|
||||
# only combine internal infill
|
||||
|
||||
@@ -111,7 +111,7 @@ sub contact_area {
|
||||
# the 'overhangs' of the first object layer
|
||||
last if $layer_id > 0;
|
||||
}
|
||||
my $layer = $object->layers->[$layer_id];
|
||||
my $layer = $object->get_layer($layer_id);
|
||||
|
||||
# detect overhangs and contact areas needed to support them
|
||||
my (@overhang, @contact) = ();
|
||||
@@ -122,7 +122,7 @@ sub contact_area {
|
||||
push @overhang, map $_->clone, map $_->contour, @{$layer->slices};
|
||||
push @contact, @{offset(\@overhang, scale +MARGIN)};
|
||||
} else {
|
||||
my $lower_layer = $object->layers->[$layer_id-1];
|
||||
my $lower_layer = $object->get_layer($layer_id-1);
|
||||
foreach my $layerm (@{$layer->regions}) {
|
||||
my $fw = $layerm->flow(FLOW_ROLE_EXTERNAL_PERIMETER)->scaled_width;
|
||||
my $diff;
|
||||
|
||||
+1
-1
@@ -176,7 +176,7 @@ use Slic3r::Test;
|
||||
my $expolygon = Slic3r::ExPolygon->new([[-71974463,-139999376],[-71731792,-139987456],[-71706544,-139985616],[-71682119,-139982639],[-71441248,-139946912],[-71417487,-139942895],[-71379384,-139933984],[-71141800,-139874480],[-71105247,-139862895],[-70873544,-139779984],[-70838592,-139765856],[-70614943,-139660064],[-70581783,-139643567],[-70368368,-139515680],[-70323751,-139487872],[-70122160,-139338352],[-70082399,-139306639],[-69894800,-139136624],[-69878679,-139121327],[-69707992,-138933008],[-69668575,-138887343],[-69518775,-138685359],[-69484336,-138631632],[-69356423,-138418207],[-69250040,-138193296],[-69220920,-138128976],[-69137992,-137897168],[-69126095,-137860255],[-69066568,-137622608],[-69057104,-137582511],[-69053079,-137558751],[-69017352,-137317872],[-69014392,-137293456],[-69012543,-137268207],[-68999369,-137000000],[-63999999,-137000000],[-63705947,-136985551],[-63654984,-136977984],[-63414731,-136942351],[-63364756,-136929840],[-63129151,-136870815],[-62851950,-136771631],[-62585807,-136645743],[-62377483,-136520895],[-62333291,-136494415],[-62291908,-136463728],[-62096819,-136319023],[-62058644,-136284432],[-61878676,-136121328],[-61680968,-135903184],[-61650275,-135861807],[-61505591,-135666719],[-61354239,-135414191],[-61332211,-135367615],[-61228359,-135148063],[-61129179,-134870847],[-61057639,-134585262],[-61014451,-134294047],[-61000000,-134000000],[-61000000,-107999999],[-61014451,-107705944],[-61057639,-107414736],[-61129179,-107129152],[-61228359,-106851953],[-61354239,-106585808],[-61505591,-106333288],[-61680967,-106096816],[-61878675,-105878680],[-62096820,-105680967],[-62138204,-105650279],[-62333292,-105505591],[-62585808,-105354239],[-62632384,-105332207],[-62851951,-105228360],[-62900463,-105211008],[-63129152,-105129183],[-63414731,-105057640],[-63705947,-105014448],[-63999999,-105000000],[-68999369,-105000000],[-69012543,-104731792],[-69014392,-104706544],[-69017352,-104682119],[-69053079,-104441248],[-69057104,-104417487],[-69066008,-104379383],[-69125528,-104141799],[-69137111,-104105248],[-69220007,-103873544],[-69234136,-103838591],[-69339920,-103614943],[-69356415,-103581784],[-69484328,-103368367],[-69512143,-103323752],[-69661647,-103122160],[-69693352,-103082399],[-69863383,-102894800],[-69878680,-102878679],[-70066999,-102707992],[-70112656,-102668576],[-70314648,-102518775],[-70368367,-102484336],[-70581783,-102356424],[-70806711,-102250040],[-70871040,-102220919],[-71102823,-102137992],[-71139752,-102126095],[-71377383,-102066568],[-71417487,-102057104],[-71441248,-102053079],[-71682119,-102017352],[-71706535,-102014392],[-71731784,-102012543],[-71974456,-102000624],[-71999999,-102000000],[-104000000,-102000000],[-104025536,-102000624],[-104268207,-102012543],[-104293455,-102014392],[-104317880,-102017352],[-104558751,-102053079],[-104582512,-102057104],[-104620616,-102066008],[-104858200,-102125528],[-104894751,-102137111],[-105126455,-102220007],[-105161408,-102234136],[-105385056,-102339920],[-105418215,-102356415],[-105631632,-102484328],[-105676247,-102512143],[-105877839,-102661647],[-105917600,-102693352],[-106105199,-102863383],[-106121320,-102878680],[-106292007,-103066999],[-106331424,-103112656],[-106481224,-103314648],[-106515663,-103368367],[-106643575,-103581783],[-106749959,-103806711],[-106779080,-103871040],[-106862007,-104102823],[-106873904,-104139752],[-106933431,-104377383],[-106942896,-104417487],[-106946920,-104441248],[-106982648,-104682119],[-106985607,-104706535],[-106987456,-104731784],[-107000630,-105000000],[-112000000,-105000000],[-112294056,-105014448],[-112585264,-105057640],[-112870848,-105129184],[-112919359,-105146535],[-113148048,-105228360],[-113194624,-105250392],[-113414191,-105354239],[-113666711,-105505591],[-113708095,-105536279],[-113903183,-105680967],[-114121320,-105878679],[-114319032,-106096816],[-114349720,-106138200],[-114494408,-106333288],[-114645760,-106585808],[-114667792,-106632384],[-114771640,-106851952],[-114788991,-106900463],[-114870815,-107129151],[-114942359,-107414735],[-114985551,-107705943],[-115000000,-107999999],[-115000000,-134000000],[-114985551,-134294048],[-114942359,-134585263],[-114870816,-134870847],[-114853464,-134919359],[-114771639,-135148064],[-114645759,-135414192],[-114494407,-135666720],[-114319031,-135903184],[-114121320,-136121327],[-114083144,-136155919],[-113903184,-136319023],[-113861799,-136349712],[-113666711,-136494416],[-113458383,-136619264],[-113414192,-136645743],[-113148049,-136771631],[-112870848,-136870815],[-112820872,-136883327],[-112585264,-136942351],[-112534303,-136949920],[-112294056,-136985551],[-112000000,-137000000],[-107000630,-137000000],[-106987456,-137268207],[-106985608,-137293440],[-106982647,-137317872],[-106946920,-137558751],[-106942896,-137582511],[-106933991,-137620624],[-106874471,-137858208],[-106862888,-137894751],[-106779992,-138126463],[-106765863,-138161424],[-106660080,-138385055],[-106643584,-138418223],[-106515671,-138631648],[-1064Line truncated
|
||||
my $object = $print->print->objects->[0];
|
||||
$object->slice;
|
||||
my $layer = $object->layers->[1];
|
||||
my $layer = $object->get_layer(1);
|
||||
my $layerm = $layer->regions->[0];
|
||||
$layerm->slices->clear;
|
||||
$layerm->slices->append(Slic3r::Surface->new(surface_type => S_TYPE_INTERNAL, expolygon => $expolygon));
|
||||
|
||||
Reference in new issue
Block a user