From 09c539a24233a0ff41b54720870fec3725f130d7 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Tue, 11 Dec 2018 17:49:31 +0100 Subject: [PATCH] Trigger background processing update when switching to a preview tab. Implements "Go Direct to the preview screen after slicing #152" --- src/libslic3r/Print.hpp | 3 +++ src/libslic3r/PrintBase.hpp | 2 ++ src/libslic3r/SLAPrint.cpp | 12 ++++++++++++ src/libslic3r/SLAPrint.hpp | 3 +++ src/slic3r/GUI/BackgroundSlicingProcess.hpp | 5 +++++ src/slic3r/GUI/Plater.cpp | 3 ++- xs/xsp/Print.xsp | 5 ----- 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 529608445..04de0f95c 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -297,7 +297,10 @@ public: // methods for handling state bool is_step_done(PrintStep step) const { return Inherited::is_step_done(step); } + // Returns true if an object step is done on all objects and there's at least one object. bool is_step_done(PrintObjectStep step) const; + // Returns true if the last step was finished with success. + bool finished() const override { return this->is_step_done(psGCodeExport); } bool has_infinite_skirt() const; bool has_skirt() const; diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index ca4d4eaf3..401718773 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -285,6 +285,8 @@ public: void cancel_internal() { m_cancel_status = CANCELED_INTERNAL; } // Cancel the running computation. Stop execution of all the background threads. void restart() { m_cancel_status = NOT_CANCELED; } + // Returns true if the last step was finished with success. + virtual bool finished() const = 0; const PlaceholderParser& placeholder_parser() const { return m_placeholder_parser; } PlaceholderParser& placeholder_parser() { return m_placeholder_parser; } diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 239c86eca..07de3596a 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -936,6 +936,18 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vectorstate_mutex()); + for (const SLAPrintObject *object : m_objects) + if (! object->m_state.is_done_unguarded(step)) + return false; + return true; +} + SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object): Inherited(print, model_object), m_stepmask(slaposCount, true), diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index ebdc3f854..d74294761 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -185,6 +185,9 @@ public: bool empty() const override { return m_objects.empty(); } ApplyStatus apply(const Model &model, const DynamicPrintConfig &config) override; void process() override; + bool is_step_done(SLAPrintObjectStep step) const; + // Returns true if the last step was finished with success. + bool finished() const override { return this->is_step_done(slaposIndexSlices); } template void export_raster(const std::string& fname) { if(m_printer) m_printer->save(fname); diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp index 981bf6bbf..bb072fb98 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -110,6 +110,11 @@ public: State state() const { return m_state; } bool idle() const { return m_state == STATE_IDLE; } bool running() const { return m_state == STATE_STARTED || m_state == STATE_RUNNING || m_state == STATE_FINISHED || m_state == STATE_CANCELED; } + // Returns true if the last step of the active print was finished with success. + // The "finished" flag is reset by the apply() method, if it changes the state of the print. + // This "finished" flag does not account for the final export of the output file (.gcode or zipped PNGs), + // and it does not account for the OctoPrint scheduling. + bool finished() const { return m_print->finished(); } private: void thread_proc(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ae5743f67..af8769814 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2212,6 +2212,7 @@ void Plater::priv::set_current_panel(wxPanel* panel) } else if (current_panel == preview) { + this->q->reslice(); preview->reload_print(); preview->set_canvas_as_dirty(); } @@ -3064,7 +3065,7 @@ void Plater::reslice() #else this->p->canvas3D->reload_scene(false); #endif // ENABLE_REMOVE_TABS_FROM_PLATER - if ((state & priv::UPDATE_BACKGROUND_PROCESS_INVALID) == 0 && !this->p->background_process.running()) { + if ((state & priv::UPDATE_BACKGROUND_PROCESS_INVALID) == 0 && !this->p->background_process.running() && !this->p->background_process.finished()) { // The print is valid and it can be started. if (this->p->background_process.start()) this->p->statusbar()->set_cancel_callback([this]() { diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp index 5d17ac258..aa90a3ad9 100644 --- a/xs/xsp/Print.xsp +++ b/xs/xsp/Print.xsp @@ -49,8 +49,6 @@ _constant() Ref config() %code%{ RETVAL = &THIS->config(); %}; Points copies(); - t_layer_height_ranges layer_height_ranges() - %code%{ RETVAL = THIS->layer_height_ranges; %}; std::vector layer_height_profile() %code%{ RETVAL = THIS->layer_height_profile; %}; Clone bounding_box(); @@ -58,9 +56,6 @@ _constant() Points _shifted_copies() %code%{ RETVAL = THIS->copies(); %}; - void set_layer_height_ranges(t_layer_height_ranges layer_height_ranges) - %code%{ THIS->layer_height_ranges = layer_height_ranges; %}; - size_t layer_count(); Ref get_layer(int idx);