This commit is contained in:
Filip Sykala - NTB T15p 2023-01-11 16:30:43 +01:00
commit 0b655e4b60
6 changed files with 49 additions and 6 deletions

View File

@ -517,6 +517,7 @@ public:
void set_task(const TaskParams &params) override { PrintBaseWithState<PrintStep, psCount>::set_task_impl(params, m_objects); } void set_task(const TaskParams &params) override { PrintBaseWithState<PrintStep, psCount>::set_task_impl(params, m_objects); }
void process() override; void process() override;
void finalize() override { PrintBaseWithState<PrintStep, psCount>::finalize_impl(m_objects); } void finalize() override { PrintBaseWithState<PrintStep, psCount>::finalize_impl(m_objects); }
void cleanup() override;
// Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file. // Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file.
// If preview_data is not null, the preview_data is filled in for the G-code visualization (not used by the command line Slic3r). // If preview_data is not null, the preview_data is filled in for the G-code visualization (not used by the command line Slic3r).
@ -609,6 +610,12 @@ private:
// Return 4 wipe tower corners in the world coordinates (shifted and rotated), including the wipe tower brim. // Return 4 wipe tower corners in the world coordinates (shifted and rotated), including the wipe tower brim.
std::vector<Point> first_layer_wipe_tower_corners() const; std::vector<Point> first_layer_wipe_tower_corners() const;
// Returns true if any of the print_objects has print_object_step valid.
// That means data shared by all print objects of the print_objects span may still use the shared data.
// Otherwise the shared data shall be released.
// Unguarded variant, thus it shall only be called from main thread with background processing stopped.
static bool is_shared_print_object_step_valid_unguarded(SpanOfConstPtrs<PrintObject> print_objects, PrintObjectStep print_object_step);
PrintConfig m_config; PrintConfig m_config;
PrintObjectConfig m_default_object_config; PrintObjectConfig m_default_object_config;
PrintRegionConfig m_default_region_config; PrintRegionConfig m_default_region_config;

View File

@ -1451,6 +1451,9 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
for (PrintObject *object : m_objects) for (PrintObject *object : m_objects)
object->update_slicing_parameters(); object->update_slicing_parameters();
if (apply_status == APPLY_STATUS_CHANGED || apply_status == APPLY_STATUS_INVALIDATED)
this->cleanup();
#ifdef _DEBUG #ifdef _DEBUG
check_model_ids_equal(m_model, model); check_model_ids_equal(m_model, model);
#endif /* _DEBUG */ #endif /* _DEBUG */
@ -1458,4 +1461,25 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
return static_cast<ApplyStatus>(apply_status); return static_cast<ApplyStatus>(apply_status);
} }
void Print::cleanup()
{
// Invalidate data of a single ModelObject shared by multiple PrintObjects.
// Find spans of PrintObjects sharing the same PrintObjectRegions.
std::vector<PrintObject*> all_objects(m_objects);
std::sort(all_objects.begin(), all_objects.end(), [](const PrintObject *l, const PrintObject *r){ return l->shared_regions() < r->shared_regions(); } );
for (auto it = all_objects.begin(); it != all_objects.end();) {
PrintObjectRegions *shared_regions = (*it)->m_shared_regions;
auto it_begin = it;
for (++ it; it != all_objects.end() && shared_regions == (*it)->shared_regions(); ++ it);
auto this_objects = SpanOfConstPtrs<PrintObject>(const_cast<const PrintObject* const* const>(&(*it_begin)), it - it_begin);
if (Print::is_shared_print_object_step_valid_unguarded(this_objects, posSupportSpotsSearch))
shared_regions->generated_support_points.reset();
}
}
bool Print::is_shared_print_object_step_valid_unguarded(SpanOfConstPtrs<PrintObject> print_objects, PrintObjectStep print_object_step)
{
return std::any_of(print_objects.begin(), print_objects.end(), [print_object_step](auto po){ return po->is_step_done_unguarded(print_object_step); });
}
} // namespace Slic3r } // namespace Slic3r

View File

@ -408,6 +408,10 @@ public:
// Clean up after process() finished, either with success, error or if canceled. // 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. // The adjustments on the Print / PrintObject data due to set_task() are to be reverted here.
virtual void finalize() = 0; virtual void finalize() = 0;
// Clean up print step / print object step data after
// 1) some print step / print object step was invalidated inside PrintBase::apply() while holding the milestone mutex locked.
// 2) background thread finished being canceled.
virtual void cleanup() = 0;
struct SlicingStatus { struct SlicingStatus {
SlicingStatus(int percent, const std::string &text, unsigned int flags = 0) : percent(percent), text(text), flags(flags) {} SlicingStatus(int percent, const std::string &text, unsigned int flags = 0) : percent(percent), text(text), flags(flags) {}

View File

@ -412,6 +412,7 @@ public:
void set_task(const TaskParams &params) override { PrintBaseWithState<SLAPrintStep, slapsCount>::set_task_impl(params, m_objects); } void set_task(const TaskParams &params) override { PrintBaseWithState<SLAPrintStep, slapsCount>::set_task_impl(params, m_objects); }
void process() override; void process() override;
void finalize() override { PrintBaseWithState<SLAPrintStep, slapsCount>::finalize_impl(m_objects); } void finalize() override { PrintBaseWithState<SLAPrintStep, slapsCount>::finalize_impl(m_objects); }
void cleanup() override {}
// Returns true if an object step is done on all objects and there's at least one object. // 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; bool is_step_done(SLAPrintObjectStep step) const;
// Returns true if the last step was finished with success. // Returns true if the last step was finished with success.

View File

@ -251,6 +251,9 @@ void BackgroundSlicingProcess::thread_proc()
(m_state == STATE_CANCELED) ? SlicingProcessCompletedEvent::Cancelled : (m_state == STATE_CANCELED) ? SlicingProcessCompletedEvent::Cancelled :
exception ? SlicingProcessCompletedEvent::Error : SlicingProcessCompletedEvent::Finished, exception); exception ? SlicingProcessCompletedEvent::Error : SlicingProcessCompletedEvent::Finished, exception);
wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone()); wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone());
// Cancelled by the user, not internally, thus cleanup() was not called yet.
// Otherwise cleanup() is called from Print::apply()
m_print->cleanup();
} }
m_print->restart(); m_print->restart();
lck.unlock(); lck.unlock();

View File

@ -983,20 +983,24 @@ Sidebar::Sidebar(Plater *parent)
Sidebar::~Sidebar() {} Sidebar::~Sidebar() {}
void Sidebar::init_filament_combo(PlaterPresetComboBox **combo, const int extr_idx) { void Sidebar::init_filament_combo(PlaterPresetComboBox** combo, const int extr_idx)
{
*combo = new PlaterPresetComboBox(p->presets_panel, Slic3r::Preset::TYPE_FILAMENT); *combo = new PlaterPresetComboBox(p->presets_panel, Slic3r::Preset::TYPE_FILAMENT);
// # copy icons from first choice
// $choice->SetItemBitmap($_, $choices->[0]->GetItemBitmap($_)) for 0..$#presets;
(*combo)->set_extruder_idx(extr_idx); (*combo)->set_extruder_idx(extr_idx);
#ifdef __WXMSW__
// When project is loading and progress dialog is processing
// In this case mainframe is marked as a disabled, that is why new created filament preset comboboxes are disabled
if (wxWindow* mf = wxGetApp().mainframe; mf && !mf->IsThisEnabled())
mf->Enable();
#endif //__WXMSW__
auto combo_and_btn_sizer = new wxBoxSizer(wxHORIZONTAL); auto combo_and_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
combo_and_btn_sizer->Add(*combo, 1, wxEXPAND); combo_and_btn_sizer->Add(*combo, 1, wxEXPAND);
combo_and_btn_sizer->Add((*combo)->edit_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, combo_and_btn_sizer->Add((*combo)->edit_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT,
int(0.3*wxGetApp().em_unit())); int(0.3*wxGetApp().em_unit()));
auto /***/sizer_filaments = this->p->sizer_filaments; this->p->sizer_filaments->Add(combo_and_btn_sizer, 1, wxEXPAND |
sizer_filaments->Add(combo_and_btn_sizer, 1, wxEXPAND |
#ifdef __WXGTK3__ #ifdef __WXGTK3__
wxRIGHT, int(0.5 * wxGetApp().em_unit())); wxRIGHT, int(0.5 * wxGetApp().em_unit()));
#else #else