diff --git a/lib/Slic3r/GUI/SkeinPanel.pm b/lib/Slic3r/GUI/SkeinPanel.pm index 66bcfdfba..f7d29fabb 100644 --- a/lib/Slic3r/GUI/SkeinPanel.pm +++ b/lib/Slic3r/GUI/SkeinPanel.pm @@ -143,13 +143,20 @@ sub do_slice { my $skein = Slic3r::Skein->new( input_file => $input_file, output_file => $main::opt{output}, + status_cb => sub { + my ($percent, $message) = @_; + $process_dialog->Update($percent, $message); + }, ); $skein->go; $process_dialog->Destroy; undef $process_dialog; if (!$main::opt{close_after_slicing}) { - Wx::MessageDialog->new($self, "$input_file_basename was successfully sliced.", 'Done!', + my $message = sprintf "%s was successfully sliced in %d minutes and %.3f seconds.", + $input_file_basename, int($skein->processing_time/60), + $skein->processing_time - int($skein->processing_time/60)*60; + Wx::MessageDialog->new($self, $message, 'Done!', wxOK | wxICON_INFORMATION)->ShowModal; } else { $self->GetParent->Destroy(); # quit diff --git a/lib/Slic3r/Skein.pm b/lib/Slic3r/Skein.pm index b5426bde1..2a93d559c 100644 --- a/lib/Slic3r/Skein.pm +++ b/lib/Slic3r/Skein.pm @@ -6,6 +6,8 @@ use XXX; has 'input_file' => (is => 'ro', required => 1); has 'output_file' => (is => 'rw', required => 0); +has 'status_cb' => (is => 'rw', required => 0, default => sub { sub {} }); +has 'processing_time' => (is => 'rw', required => 0); sub go { my $self = shift; @@ -17,14 +19,17 @@ sub go { # skein the STL into layers # each layer has surfaces with holes + $self->status_cb->(10, "Processing triangulated mesh..."); my $print = Slic3r::Print->new_from_stl($self->input_file); # make skirt + $self->status_cb->(15, "Generating skirt..."); $print->extrude_skirt; # make perimeters # this will add a set of extrusion loops to each layer # as well as generate infill boundaries + $self->status_cb->(20, "Generating perimeters..."); { my $perimeter_maker = Slic3r::Perimeter->new; $perimeter_maker->make_perimeter($_) for @{$print->layers}; @@ -32,35 +37,43 @@ sub go { # this will prepare surfaces for perimeters by merging all # surfaces in each layer; it will also clip $layer->surfaces - # to infill boundaries and split them in top/bottom/internal surfaces + # to the infill boundaries and split them in top/bottom/internal surfaces + $self->status_cb->(30, "Detecting solid surfaces..."); $print->detect_surfaces_type; # this will remove unprintable surfaces # (those that are too tight for extrusion) + $self->status_cb->(40, "Cleaning up..."); $_->remove_small_surfaces for @{$print->layers}; # this will detect bridges and reverse bridges # and rearrange top/bottom/internal surfaces + $self->status_cb->(45, "Detect bridges..."); $_->process_bridges for @{$print->layers}; # this will remove unprintable perimeter loops # (those that are too tight for extrusion) + $self->status_cb->(50, "Cleaning up the perimeters..."); $_->remove_small_perimeters for @{$print->layers}; # detect which fill surfaces are near external layers # they will be split in internal and internal-solid surfaces + $self->status_cb->(60, "Generating horizontal shells..."); $print->discover_horizontal_shells; # combine fill surfaces to honor the "infill every N layers" option + $self->status_cb->(70, "Combining infill..."); $print->infill_every_layers; # this will generate extrusion paths for each layer + $self->status_cb->(80, "Infilling layers..."); { my $fill_maker = Slic3r::Fill->new('print' => $print); $fill_maker->make_fill($_) for @{$print->layers}; } # output everything to a GCODE file + $self->status_cb->(90, "Exporting GCODE..."); if (!$self->output_file) { my $output_file = $self->input_file; $output_file =~ s/\.stl$/.gcode/i; @@ -69,9 +82,10 @@ sub go { $print->export_gcode($self->output_file); # output some statistics - my $processing_time = tv_interval($t0); + $self->processing_time(tv_interval($t0)); printf "Done. Process took %d minutes and %.3f seconds\n", - int($processing_time/60), $processing_time - int($processing_time/60)*60; + int($self->processing_time/60), + $self->processing_time - int($self->processing_time/60)*60; # TODO: more statistics! }