Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/slic3r/GUI/BackgroundSlicingProcess.hpp')
-rw-r--r--src/slic3r/GUI/BackgroundSlicingProcess.hpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp
new file mode 100644
index 000000000..cc7a6db30
--- /dev/null
+++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp
@@ -0,0 +1,91 @@
+#ifndef slic3r_GUI_BackgroundSlicingProcess_hpp_
+#define slic3r_GUI_BackgroundSlicingProcess_hpp_
+
+#include <string>
+#include <condition_variable>
+#include <mutex>
+#include <thread>
+
+namespace Slic3r {
+
+class DynamicPrintConfig;
+class GCodePreviewData;
+class Print;
+
+// Support for the GUI background processing (Slicing and G-code generation).
+// As of now this class is not declared in Slic3r::GUI due to the Perl bindings limits.
+class BackgroundSlicingProcess
+{
+public:
+ BackgroundSlicingProcess();
+ // Stop the background processing and finalize the bacgkround processing thread, remove temp files.
+ ~BackgroundSlicingProcess();
+
+ void set_print(Print *print) { m_print = print; }
+ void set_gcode_preview_data(GCodePreviewData *gpd) { m_gcode_preview_data = gpd; }
+ // The following wxCommandEvent will be sent to the UI thread / Platter window, when the slicing is finished
+ // and the background processing will transition into G-code export.
+ // The wxCommandEvent is sent to the UI thread asynchronously without waiting for the event to be processed.
+ void set_sliced_event(int event_id) { m_event_sliced_id = event_id; }
+ // The following wxCommandEvent will be sent to the UI thread / Platter window, when the G-code export is finished.
+ // The wxCommandEvent is sent to the UI thread asynchronously without waiting for the event to be processed.
+ void set_finished_event(int event_id) { m_event_finished_id = event_id; }
+
+ // Set the output path of the G-code.
+ void set_output_path(const std::string &path) { m_output_path = path; }
+ // Start the background processing. Returns false if the background processing was already running.
+ bool start();
+ // Cancel the background processing. Returns false if the background processing was not running.
+ // A stopped background processing may be restarted with start().
+ bool stop();
+
+ // Apply config over the print. Returns false, if the new config values caused any of the already
+ // processed steps to be invalidated, therefore the task will need to be restarted.
+ bool apply_config(const DynamicPrintConfig &config);
+
+ enum State {
+ // m_thread is not running yet, or it did not reach the STATE_IDLE yet (it does not wait on the condition yet).
+ STATE_INITIAL = 0,
+ // m_thread is waiting for the task to execute.
+ STATE_IDLE,
+ STATE_STARTED,
+ // m_thread is executing a task.
+ STATE_RUNNING,
+ // m_thread finished executing a task, and it is waiting until the UI thread picks up the results.
+ STATE_FINISHED,
+ // m_thread finished executing a task, the task has been canceled by the UI thread, therefore the UI thread will not be notified.
+ STATE_CANCELED,
+ // m_thread exited the loop and it is going to finish. The UI thread should join on m_thread.
+ STATE_EXIT,
+ STATE_EXITED,
+ };
+ 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; }
+
+private:
+ void thread_proc();
+ void join_background_thread();
+
+ Print *m_print = nullptr;
+ // Data structure, to which the G-code export writes its annotations.
+ GCodePreviewData *m_gcode_preview_data = nullptr;
+ std::string m_temp_output_path;
+ std::string m_output_path;
+ // Thread, on which the background processing is executed. The thread will always be present
+ // and ready to execute the slicing process.
+ std::thread m_thread;
+ // Mutex and condition variable to synchronize m_thread with the UI thread.
+ std::mutex m_mutex;
+ std::condition_variable m_condition;
+ State m_state = STATE_INITIAL;
+
+ // wxWidgets command ID to be sent to the platter to inform that the slicing is finished, and the G-code export will continue.
+ int m_event_sliced_id = 0;
+ // wxWidgets command ID to be sent to the platter to inform that the task finished.
+ int m_event_finished_id = 0;
+};
+
+}; // namespace Slic3r
+
+#endif /* slic3r_GUI_BackgroundSlicingProcess_hpp_ */