diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index 18a117209..536753317 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -207,10 +207,7 @@ sub export_gcode { # each layer has surfaces with holes $status_cb->(5, "Processing input file"); $status_cb->(10, "Processing triangulated mesh"); - $_->slice for @{$self->objects}; - unless ($params{keep_meshes}) { - $_->mesh(undef) for @{$self->objects}; # free memory - } + $_->slice(keep_meshes => $params{keep_meshes}) for @{$self->objects}; # make perimeters # this will add a set of extrusion loops to each layer diff --git a/lib/Slic3r/Print/Object.pm b/lib/Slic3r/Print/Object.pm index 78c5796d5..ca4c544ea 100644 --- a/lib/Slic3r/Print/Object.pm +++ b/lib/Slic3r/Print/Object.pm @@ -40,6 +40,7 @@ sub layer { sub slice { my $self = shift; + my %params = @_; # process facets { @@ -78,6 +79,9 @@ sub slice { } die "Invalid input file\n" if !@{$self->layers}; + # free memory + $self->mesh(undef) unless $params{keep_meshes}; + # remove last layer if empty # (we might have created it because of the $max_layer = ... + 1 code below) pop @{$self->layers} if !@{$self->layers->[-1]->surfaces} && !@{$self->layers->[-1]->lines}; @@ -94,7 +98,7 @@ sub slice { # inside a closed polyline) # build surfaces from sparse lines - $layer->make_surfaces($self->mesh->make_loops($layer)); + $layer->make_surfaces(Slic3r::TriangleMesh::make_loops($layer)); # free memory $layer->lines(undef); diff --git a/lib/Slic3r/TriangleMesh.pm b/lib/Slic3r/TriangleMesh.pm index f5e9642be..b1ca8b7f1 100644 --- a/lib/Slic3r/TriangleMesh.pm +++ b/lib/Slic3r/TriangleMesh.pm @@ -136,10 +136,15 @@ sub check_manifoldness { } sub make_loops { - my $self = shift; my ($layer) = @_; - my @lines = @{$layer->lines}; + my @lines = map { + my @data = unpack 'ffLLLLLc', $_; + splice @data, 0, 2, [ @data[0,1] ]; + $data[$_] ||= undef for I_A_ID, I_B_ID; + $data[I_FACET_EDGE] = undef if $data[I_FACET_EDGE] == -1; + [@data] + } @{$layer->lines}; # remove tangent edges { @@ -212,7 +217,7 @@ sub make_loops { Slic3r::SVG::output(undef, "same_point.svg", lines => [ map $_->line, grep !defined $_->[I_FACET_EDGE], @lines ], red_lines => [ map $_->line, grep defined $_->[I_FACET_EDGE], @lines ], - points => [ $self->vertices->[$point_id] ], + #points => [ $self->vertices->[$point_id] ], no_arrows => 0, ); } @@ -417,8 +422,8 @@ sub intersect_facet { ($a, $b) = ($b, $a); ($a_id, $b_id) = ($b_id, $a_id); } - push @lines, [ - [$b->[X], $b->[Y]], # I_B + push @lines, pack 'ffLLLLLc', ( + $b->[X], $b->[Y], # I_B $a_id, # I_A_ID $b_id, # I_B_ID $facet_id, # I_FACET_INDEX @@ -428,7 +433,7 @@ sub intersect_facet { # Unused data: # a => [$a->[X], $a->[Y]], - ]; + ); #print "Horizontal edge at $z!\n"; } elsif ($a->[Z] == $z) { @@ -477,20 +482,15 @@ sub intersect_facet { $next_facet_index = +(grep $_ != $facet_id, @{$self->edges_facets->[$points[A][3]]})[0] if defined $points[A][3]; - return [ - [$points[A][X], $points[A][Y]], # I_B - $points[B][2], # I_A_ID - $points[A][2], # I_B_ID - $facet_id, # I_FACET_INDEX - $prev_facet_index, # I_PREV_FACET_INDEX - $next_facet_index, # I_NEXT_FACET_INDEX - undef, # I_FACET_EDGE - - # Unused data: - # a => [$points[B][X], $points[B][Y]], - # prev_edge_id => $points[B][3], - # next_edge_id => $points[A][3], - ]; + return pack 'ffLLLLLc', ( + $points[A][X], $points[A][Y], # I_B + $points[B][2] || 0, # I_A_ID + $points[A][2] || 0, # I_B_ID + $facet_id, # I_FACET_INDEX + $prev_facet_index, # I_PREV_FACET_INDEX + $next_facet_index, # I_NEXT_FACET_INDEX + -1, # I_FACET_EDGE + ); #printf " intersection points at z = %f: %f,%f - %f,%f\n", $z, map @$_, @intersection_points; }