From 7a4a219f60ee86950e99733345c37f770c30d720 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 19 Feb 2019 15:06:39 +0100 Subject: [PATCH 1/4] Some Ukrainian localization improvements --- resources/localization/uk/Slic3rPE.mo | Bin 127582 -> 128643 bytes resources/localization/uk/Slic3rPE_uk.po | 26 +++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/resources/localization/uk/Slic3rPE.mo b/resources/localization/uk/Slic3rPE.mo index 56af728d6ea773025608b4cfe31c23da78883474..08bf555b589bf67c38bc6a25ba05944a9d7361de 100644 GIT binary patch delta 15389 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 diff --git a/resources/localization/uk/Slic3rPE_uk.po b/resources/localization/uk/Slic3rPE_uk.po index 9db2b919a..7880453bb 100644 --- a/resources/localization/uk/Slic3rPE_uk.po +++ b/resources/localization/uk/Slic3rPE_uk.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-17 13:39+0100\n" -"PO-Revision-Date: 2019-01-21 11:25+0100\n" +"PO-Revision-Date: 2019-02-19 14:42+0100\n" "Last-Translator: Oleksandra Iushchenko \n" "Language-Team: \n" "Language: uk\n" @@ -624,48 +624,48 @@ msgstr "" #: src/slic3r/GUI/GLGizmo.cpp:2207 msgid "Left mouse click - add point" -msgstr "" +msgstr "Ліва кнопка миші - додати точку" #: src/slic3r/GUI/GLGizmo.cpp:2208 msgid "Right mouse click - remove point" -msgstr "" +msgstr "Права кнопка миші - видалити точку" #: src/slic3r/GUI/GLGizmo.cpp:2211 msgid "Generate points automatically" -msgstr "" +msgstr "Генерувати точки автоматично" #: src/slic3r/GUI/GLGizmo.cpp:2212 msgid "Remove all points" -msgstr "" +msgstr "Видалити всі точки" #: src/slic3r/GUI/GLGizmo.cpp:2245 msgid "SLA Support Points" -msgstr "" +msgstr "Точки SLA підтримки" #: src/slic3r/GUI/GLGizmo.cpp:2268 src/slic3r/GUI/GLGizmo.cpp:2468 msgid "Rotate lower part upwards" -msgstr "" +msgstr "Повернути нижню частину вгору" #: src/slic3r/GUI/GLGizmo.cpp:2269 src/slic3r/GUI/GLGizmo.cpp:2470 msgid "Perform cut" -msgstr "" +msgstr "Виконати розріз" #: src/slic3r/GUI/GLGizmo.cpp:2276 msgid "Cut object:" -msgstr "" +msgstr "Розрізати об'єкт:" #: src/slic3r/GUI/GLGizmo.cpp:2356 src/slic3r/GUI/GLGizmo.cpp:2461 #: src/libslic3r/PrintConfig.cpp:3016 msgid "Cut" -msgstr "" +msgstr "Розрізати" #: src/slic3r/GUI/GLGizmo.cpp:2466 msgid "Keep upper part" -msgstr "" +msgstr "Залишити верхню частину" #: src/slic3r/GUI/GLGizmo.cpp:2467 msgid "Keep lower part" -msgstr "" +msgstr "Залишити нижню частину" #: src/slic3r/GUI/GUI.cpp:242 msgid "Notice" @@ -5636,7 +5636,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:3017 msgid "Cut model at the given Z." -msgstr "" +msgstr "Розрізати модель за заданим Z." #: src/libslic3r/PrintConfig.cpp:3022 msgid "Dont arrange" From c86a4f3ac6a5882b4da24fa0ee3b3e79a9af5053 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Feb 2019 08:44:07 +0100 Subject: [PATCH 2/4] Fix of "Change of object type support blocker to enforcer does nothing (and vice versa) (#1818)" WIP: Limited background processing for SLA supports. --- src/libslic3r/Print.cpp | 12 +++++--- src/libslic3r/PrintBase.hpp | 26 ++++++++++++++++ src/libslic3r/SLAPrint.cpp | 59 +++++++++++++++++++++++++++++++++++-- src/libslic3r/SLAPrint.hpp | 8 +++-- 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 6416a709a..d47cdf99f 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -280,7 +280,7 @@ bool Print::is_step_done(PrintObjectStep step) const return false; tbb::mutex::scoped_lock lock(this->state_mutex()); for (const PrintObject *object : m_objects) - if (! object->m_state.is_done_unguarded(step)) + if (! object->is_step_done_unguarded(step)) return false; return true; } @@ -549,10 +549,14 @@ void Print::model_volume_list_update_supports(ModelObject &model_object_dst, con assert(! it->second); // not consumed yet it->second = true; ModelVolume *model_volume_dst = const_cast(it->first); - assert(model_volume_dst->type() == model_volume_src->type()); + // For support modifiers, the type may have been switched from blocker to enforcer and vice versa. + assert((model_volume_dst->is_support_modifier() && model_volume_src->is_support_modifier()) || model_volume_dst->type() == model_volume_src->type()); model_object_dst.volumes.emplace_back(model_volume_dst); - if (model_volume_dst->is_support_modifier()) - model_volume_dst->set_transformation(model_volume_src->get_transformation()); + if (model_volume_dst->is_support_modifier()) { + // For support modifiers, the type may have been switched from blocker to enforcer and vice versa. + model_volume_dst->set_type(model_volume_src->type()); + model_volume_dst->set_transformation(model_volume_src->get_transformation()); + } assert(model_volume_dst->get_matrix().isApprox(model_volume_src->get_matrix())); } else { // The volume was not found in the old list. Create a new copy. diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index f67ec4b72..154fa3649 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -62,6 +62,10 @@ public: return state; } + bool is_started(StepType step, tbb::mutex &mtx) const { + return this->state_with_timestamp(step, mtx).state == STARTED; + } + bool is_done(StepType step, tbb::mutex &mtx) const { return this->state_with_timestamp(step, mtx).state == DONE; } @@ -70,6 +74,10 @@ public: return m_state[step]; } + bool is_started_unguarded(StepType step) const { + return this->state_with_timestamp_unguarded(step).state == STARTED; + } + bool is_done_unguarded(StepType step) const { return this->state_with_timestamp_unguarded(step).state == DONE; } @@ -235,6 +243,18 @@ public: virtual ApplyStatus apply(const Model &model, const DynamicPrintConfig &config) = 0; const Model& model() const { return m_model; } + struct TaskParams { + TaskParams() : single_model_object(0), single_model_instance_only(false), to_object_step(-1), to_print_step(-1) {} + // If non-empty, limit the processing to this ModelObject. + ModelID single_model_object; + // If set, only process single_model_object. Otherwise process everything, but single_model_object first. + bool single_model_instance_only; + // If non-negative, stop processing at the successive object step. + int to_object_step; + // If non-negative, stop processing at the successive print step. + int to_print_step; + }; + virtual void process() = 0; struct SlicingStatus { @@ -350,6 +370,9 @@ protected: bool invalidate_all_steps() { return m_state.invalidate_all(this->cancel_callback()); } + bool is_step_started_unguarded(PrintStepEnum step) const { return m_state.is_started_unguarded(step); } + bool is_step_done_unguarded(PrintStepEnum step) const { return m_state.is_done_unguarded(step); } + private: PrintState m_state; }; @@ -383,6 +406,9 @@ protected: bool invalidate_all_steps() { return m_state.invalidate_all(PrintObjectBase::cancel_callback(m_print)); } + bool is_step_started_unguarded(PrintObjectStepEnum step) const { return m_state.is_started_unguarded(step); } + bool is_step_done_unguarded(PrintObjectStepEnum step) const { return m_state.is_done_unguarded(step); } + protected: // If the background processing stop was requested, throw CanceledException. // To be called by the worker thread and its sub-threads (mostly launched on the TBB thread pool) regularly. diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index f25087cbe..0c486e95a 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -51,7 +51,7 @@ const std::array OBJ_STEP_LABELS = L("Slicing model"), // slaposObjectSlice, L("Generating support points"), // slaposSupportPoints, L("Generating support tree"), // slaposSupportTree, - L("Generating base pool"), // slaposBasePool, + L("Generating pad"), // slaposBasePool, L("Slicing supports"), // slaposSliceSupports, L("Slicing supports") // slaposIndexSlices, }; @@ -402,6 +402,61 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf return static_cast(apply_status); } +void SLAPrint::set_task(const TaskParams ¶ms) +{ + // Grab the lock for the Print / PrintObject milestones. + tbb::mutex::scoped_lock lock(this->state_mutex()); + + int n_object_steps = params.to_object_step + 1; + if (n_object_steps = 0) + n_object_steps = (int)slaposCount; + + if (params.single_model_object.valid()) { + SLAPrintObject *print_object = nullptr; + size_t idx_print_object = 0; + for (; idx_print_object < m_objects.size(); ++idx_print_object) + if (m_objects[idx_print_object]->model_object()->id() == params.single_model_object) { + print_object = m_objects[idx_print_object]; + break; + } + assert(print_object != nullptr); + bool shall_cancel = false; + for (int istep = 0; istep < n_object_steps; ++istep) + if (! print_object->m_stepmask[istep]) { + shall_cancel = true; + break; + } + bool running = false; + if (!shall_cancel) { + for (int istep = 0; istep < n_object_steps; ++ istep) + if (print_object->is_step_started_unguarded(SLAPrintObjectStep(istep))) { + running = true; + break; + } + } + if (!running) + this->cancel_callback(); + + // Now the background process is either stopped, or it is inside one of the print object steps to be calculated anyway. + if (params.single_model_instance_only) { + // Suppress all the steps of other instances. + for (SLAPrintObject *po : m_objects) + for (int istep = 0; istep < (int)slaposCount; ++istep) + print_object->m_stepmask[istep] = false; + } + else if (!running) { + // Swap the print objects, so that the selected print_object is first in the row. + // At this point the background processing must be stopped, so it is safe to shuffle print objects. + if (idx_print_object != 0) + std::swap(m_objects.front(), m_objects[idx_print_object]); + } + for (int istep = 0; istep < n_object_steps; ++ istep) + print_object->m_stepmask[istep] = true; + for (int istep = 0; istep < (int)slaposCount; ++ istep) + print_object->m_stepmask[istep] = false; + } +} + namespace { // Compile the argument for support creation from the static print config. sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { @@ -1035,7 +1090,7 @@ bool SLAPrint::is_step_done(SLAPrintObjectStep step) const return false; tbb::mutex::scoped_lock lock(this->state_mutex()); for (const SLAPrintObject *object : m_objects) - if (! object->m_state.is_done_unguarded(step)) + if (! object->is_step_done_unguarded(step)) return false; return true; } diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 9aaba6a47..be862095c 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -139,6 +139,10 @@ protected: // Invalidate steps based on a set of parameters changed. bool invalidate_state_by_config_options(const std::vector &opt_keys); + // Which steps have to be performed. Implicitly: all + // to be accessible from SLAPrint + std::vector m_stepmask; + private: // Object specific configuration, pulled from the configuration layer. SLAPrintObjectConfig m_config; @@ -146,9 +150,6 @@ private: Transform3d m_trafo = Transform3d::Identity(); std::vector m_instances; - // Which steps have to be performed. Implicitly: all - std::vector m_stepmask; - // Individual 2d slice polygons from lower z to higher z levels std::vector m_model_slices; @@ -194,6 +195,7 @@ public: void clear() override; bool empty() const override { return m_objects.empty(); } ApplyStatus apply(const Model &model, const DynamicPrintConfig &config) override; + void set_task(const TaskParams ¶ms); void process() override; // Returns true if an object step is done on all objects and there's at least one object. bool is_step_done(SLAPrintObjectStep step) const; From 5bc20401cdb15c7f08be2875ee8c844b71abada7 Mon Sep 17 00:00:00 2001 From: YuSanka Date: Wed, 20 Feb 2019 16:09:18 +0100 Subject: [PATCH 3/4] Fix of #1801 --- src/slic3r/GUI/Tab.cpp | 36 +++++++++++++++++++++--------------- src/slic3r/GUI/Tab.hpp | 3 +++ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 788276357..2e847b2b3 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -656,6 +656,7 @@ void Tab::load_config(const DynamicPrintConfig& config) bool modified = 0; for(auto opt_key : m_config->diff(config)) { m_config->set_key_value(opt_key, config.option(opt_key)->clone()); + m_dirty_options.emplace(opt_key); modified = 1; } if (modified) { @@ -738,17 +739,7 @@ void Tab::load_key_value(const std::string& opt_key, const boost::any& value, bo void Tab::on_value_change(const std::string& opt_key, const boost::any& value) { - wxCommandEvent event(EVT_TAB_VALUE_CHANGED); - event.SetEventObject(this); - event.SetString(opt_key); - if (opt_key == "extruders_count") - { - int val = boost::any_cast(value); - event.SetInt(val); - } - - wxPostEvent(this, event); - + m_dirty_options.erase(opt_key); ConfigOptionsGroup* og_freq_chng_params = wxGetApp().sidebar().og_freq_chng_params(supports_printer_technology(ptFFF)); if (opt_key == "fill_density" || opt_key == "supports_enable" || opt_key == "pad_enable") @@ -775,6 +766,21 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) update_wiping_button_visibility(); update(); + + // Post event to the Plater after updating of the all dirty options + // It helps to avoid needless schedule_background_processing + if (update_completed()) { + wxCommandEvent event(EVT_TAB_VALUE_CHANGED); + event.SetEventObject(this); + event.SetString(opt_key); + if (opt_key == "extruders_count") + { + const int val = boost::any_cast(value); + event.SetInt(val); + } + + wxPostEvent(this, event); + } } // Show/hide the 'purging volumes' button @@ -1150,8 +1156,8 @@ void TabPrint::update() // KillFocus() for the wxSpinCtrl use CallAfter function. So, // to except the duplicate call of the update() after dialog->ShowModal(), // let check if this process is already started. - if (is_msg_dlg_already_exist) - return; +// if (is_msg_dlg_already_exist) // ! It looks like a fixed problem after start to using of a m_dirty_options +// return; // ! TODO Let delete this part of code after a common aplication testing Freeze(); @@ -1168,7 +1174,7 @@ void TabPrint::update() "- no ensure_vertical_shell_thickness\n" "\nShall I adjust those settings in order to enable Spiral Vase?")); auto dialog = new wxMessageDialog(parent(), msg_text, _(L("Spiral Vase")), wxICON_WARNING | wxYES | wxNO); - is_msg_dlg_already_exist = true; +// is_msg_dlg_already_exist = true; DynamicPrintConfig new_conf = *m_config; if (dialog->ShowModal() == wxID_YES) { new_conf.set_key_value("perimeters", new ConfigOptionInt(1)); @@ -1184,7 +1190,7 @@ void TabPrint::update() } load_config(new_conf); on_value_change("fill_density", fill_density); - is_msg_dlg_already_exist = false; +// is_msg_dlg_already_exist = false; } if (m_config->opt_bool("wipe_tower") && m_config->opt_bool("support_material") && diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index e00e87b62..602fe527e 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -203,6 +203,8 @@ protected: void set_type(); + std::set m_dirty_options = {}; + public: PresetBundle* m_preset_bundle; bool m_show_btn_incompatible_presets = false; @@ -281,6 +283,7 @@ protected: void update_frequently_changed_parameters(); void fill_icon_descriptions(); void set_tooltips_text(); + bool update_completed() const { return m_dirty_options.empty(); } }; class TabPrint : public Tab From 159041747dc0e084544b5ec913c59b2d45a96209 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Thu, 21 Feb 2019 11:40:56 +0100 Subject: [PATCH 4/4] WIP: SLA support "Generate points" and "Apply Changes" will reslice just the selected object. Added "Host upload active" check on background processing state. Documented requirements on "update_background_process" to control the upcoming single "Slice Now" / "Export" button. --- src/libslic3r/PrintBase.hpp | 7 ++++- src/libslic3r/SLAPrint.cpp | 27 ++++++++++++++--- src/libslic3r/SLAPrint.hpp | 3 +- src/slic3r/GUI/BackgroundSlicingProcess.cpp | 7 +++++ src/slic3r/GUI/BackgroundSlicingProcess.hpp | 4 +++ src/slic3r/GUI/Plater.cpp | 33 +++++++++++++++++++++ src/slic3r/GUI/Plater.hpp | 2 ++ 7 files changed, 77 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp index 154fa3649..e70edd20d 100644 --- a/src/libslic3r/PrintBase.hpp +++ b/src/libslic3r/PrintBase.hpp @@ -254,8 +254,13 @@ public: // If non-negative, stop processing at the successive print step. int to_print_step; }; - + // After calling the apply() function, call set_task() to limit the task to be processed by process(). + virtual void set_task(const TaskParams ¶ms) {} + // Perform the calculation. This is the only method that is to be called at a worker thread. virtual void process() = 0; + // Clean up after process() finished, either with success, error or if canceled. + // The adjustments on the Print / PrintObject data due to set_task() are to be reverted here. + virtual void finalize() {} struct SlicingStatus { SlicingStatus(int percent, const std::string &text, unsigned int flags = 0) : percent(percent), text(text), flags(flags) {} diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 0c486e95a..213437612 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -402,13 +402,14 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, const DynamicPrintConf return static_cast(apply_status); } +// After calling the apply() function, set_task() may be called to limit the task to be processed by process(). void SLAPrint::set_task(const TaskParams ¶ms) { // Grab the lock for the Print / PrintObject milestones. tbb::mutex::scoped_lock lock(this->state_mutex()); - int n_object_steps = params.to_object_step + 1; - if (n_object_steps = 0) + int n_object_steps = int(params.to_object_step) + 1; + if (n_object_steps == 0) n_object_steps = (int)slaposCount; if (params.single_model_object.valid()) { @@ -442,7 +443,7 @@ void SLAPrint::set_task(const TaskParams ¶ms) // Suppress all the steps of other instances. for (SLAPrintObject *po : m_objects) for (int istep = 0; istep < (int)slaposCount; ++istep) - print_object->m_stepmask[istep] = false; + po->m_stepmask[istep] = false; } else if (!running) { // Swap the print objects, so that the selected print_object is first in the row. @@ -452,9 +453,27 @@ void SLAPrint::set_task(const TaskParams ¶ms) } for (int istep = 0; istep < n_object_steps; ++ istep) print_object->m_stepmask[istep] = true; - for (int istep = 0; istep < (int)slaposCount; ++ istep) + for (int istep = n_object_steps; istep < (int)slaposCount; ++istep) print_object->m_stepmask[istep] = false; } + + if (params.to_object_step != -1 || params.to_print_step != -1) { + // Limit the print steps. + size_t istep = (params.to_object_step != -1) ? 0 : size_t(params.to_print_step) + 1; + for (; istep < m_stepmask.size(); ++ istep) + m_stepmask[istep] = false; + } +} + +// Clean up after process() finished, either with success, error or if canceled. +// The adjustments on the SLAPrint / SLAPrintObject data due to set_task() are to be reverted here. +void SLAPrint::finalize() +{ + for (SLAPrintObject *po : m_objects) + for (int istep = 0; istep < (int)slaposCount; ++ istep) + po->m_stepmask[istep] = true; + for (int istep = 0; istep < (int)slapsCount; ++ istep) + m_stepmask[istep] = true; } namespace { diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index be862095c..68a0d34aa 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -195,8 +195,9 @@ public: void clear() override; bool empty() const override { return m_objects.empty(); } ApplyStatus apply(const Model &model, const DynamicPrintConfig &config) override; - void set_task(const TaskParams ¶ms); + void set_task(const TaskParams ¶ms) override; void process() override; + void finalize() override; // Returns true if an object step is done on all objects and there's at least one object. bool is_step_done(SLAPrintObjectStep step) const; // Returns true if the last step was finished with success. diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 463be8397..7c8164f6b 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -196,6 +196,7 @@ void BackgroundSlicingProcess::thread_proc() } catch (...) { error = "Unknown C++ exception."; } + m_print->finalize(); lck.lock(); m_state = m_print->canceled() ? STATE_CANCELED : STATE_FINISHED; if (m_print->cancel_status() != Print::CANCELED_INTERNAL) { @@ -362,6 +363,12 @@ Print::ApplyStatus BackgroundSlicingProcess::apply(const Model &model, const Dyn return invalidated; } +void BackgroundSlicingProcess::set_task(const PrintBase::TaskParams ¶ms) +{ + assert(m_print != nullptr); + m_print->set_task(params); +} + // Set the output path of the G-code. void BackgroundSlicingProcess::schedule_export(const std::string &path) { diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp index 5911c8a02..a2299e7bf 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -78,6 +78,9 @@ public: // 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. Print::ApplyStatus apply(const Model &model, const DynamicPrintConfig &config); + // After calling the apply() function, set_task() may be called to limit the task to be processed by process(). + // This is useful for calculating SLA supports for a single object only. + void set_task(const PrintBase::TaskParams ¶ms); // After calling apply, the empty() call will report whether there is anything to slice. bool empty() const; // Validate the print. Returns an empty string if valid, returns an error message if invalid. @@ -94,6 +97,7 @@ public: void reset_export(); // Once the G-code export is scheduled, the apply() methods will do nothing. bool is_export_scheduled() const { return ! m_export_path.empty(); } + bool is_upload_scheduled() const { return ! m_upload_job.empty(); } 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). diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a59ea8dad..5056fe72e 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2032,6 +2032,13 @@ unsigned int Plater::priv::update_background_process(bool force_validation) wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone()); } + //FIXME update "Slice Now / Schedule background process" + //background_process.is_export_scheduled() - byl zavolan "Export G-code", background processing ma jmeno export souboru + //background_process.is_upload_scheduled() - byl zavolan "Send to OctoPrint", jeste nebylo doslajsovano (pak se preda upload fronte a background process zapomene) + //background_process.empty() - prazdna plocha + // pokud (invalidated != Print::APPLY_STATUS_UNCHANGED) a ! background_process.empty() -> je neco ke slajsovani (povol tlacitko) + // pokud (return_state & UPDATE_BACKGROUND_PROCESS_INVALID) != 0 -> doslo k chybe (gray out "Slice now") + return return_state; } @@ -2999,6 +3006,32 @@ void Plater::reslice() this->p->restart_background_process(state | priv::UPDATE_BACKGROUND_PROCESS_FORCE_RESTART); } +void Plater::reslice_SLA_supports(const ModelObject &object) +{ + //FIXME Don't reslice if export of G-code or sending to OctoPrint is running. + // bitmask of UpdateBackgroundProcessReturnState + unsigned int state = this->p->update_background_process(true); + if (state & priv::UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) + this->p->view3D->reload_scene(false); + + if (this->p->background_process.empty() || (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)) + // Nothing to do on empty input or invalid configuration. + return; + + // Limit calculation to the single object only. + PrintBase::TaskParams task; + task.single_model_object = object.id(); + // If the background processing is not enabled, calculate supports just for the single instance. + // Otherwise calculate everything, but start with the provided object. + if (!this->p->background_processing_enabled()) { + task.single_model_instance_only = true; + task.to_object_step = slaposBasePool; + } + this->p->background_process.set_task(task); + // and let the background processing start. + this->p->restart_background_process(state | priv::UPDATE_BACKGROUND_PROCESS_FORCE_RESTART); +} + void Plater::send_gcode() { if (p->model.objects.empty()) { return; } diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 5dfe5528d..ddd8cd5bd 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -19,6 +19,7 @@ class wxString; namespace Slic3r { class Model; +class ModelObject; class Print; class SLAPrint; @@ -145,6 +146,7 @@ public: void export_amf(); void export_3mf(const boost::filesystem::path& output_path = boost::filesystem::path()); void reslice(); + void reslice_SLA_supports(const ModelObject &object); void changed_object(int obj_idx); void fix_through_netfabb(const int obj_idx, const int vol_idx = -1); void send_gcode();