From 958c6553e79737895c8e63d66350d118b722be09 Mon Sep 17 00:00:00 2001 From: bubnikv Date: Fri, 9 Jun 2017 13:27:35 +0200 Subject: [PATCH] Hopefully a fix of "Layer editing does not trigger reslicing with Background Processing enabled" https://github.com/prusa3d/Slic3r/issues/293 --- lib/Slic3r/GUI/3DScene.pm | 1 + lib/Slic3r/GUI/Plater.pm | 3 +-- slic3r.pl | 3 +++ xs/src/libslic3r/Print.cpp | 30 +++++++++++++----------------- xs/src/libslic3r/PrintObject.cpp | 2 +- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/lib/Slic3r/GUI/3DScene.pm b/lib/Slic3r/GUI/3DScene.pm index 8ecf10de7..b884a3548 100644 --- a/lib/Slic3r/GUI/3DScene.pm +++ b/lib/Slic3r/GUI/3DScene.pm @@ -319,6 +319,7 @@ sub _variable_layer_thickness_action { if ($self->{layer_height_edit_last_object_id} != -1) { # Mark the volume as modified, so Print will pick its layer height profile? Where to mark it? # Start a timer to refresh the print? schedule_background_process() ? + # The PrintObject::adjust_layer_height_profile() call adjusts the profile of its associated ModelObject, it does not modify the profile of the PrintObject itself. $self->{print}->get_object($self->{layer_height_edit_last_object_id})->adjust_layer_height_profile( $self->{layer_height_edit_last_z}, $self->{layer_height_edit_strength}, diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index f4dd41526..5a215edeb 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -116,8 +116,7 @@ sub new { }); $self->{canvas3D}->set_on_model_update(sub { if ($Slic3r::GUI::Settings->{_}{background_processing}) { - $self->{apply_config_timer}->Stop if defined $self->{apply_config_timer}; - $self->async_apply_config(); + $self->schedule_background_process; } else { # Hide the print info box, it is no more valid. $self->{"print_info_box_show"}->(0); diff --git a/slic3r.pl b/slic3r.pl index 681b2fa6d..0cd814ce5 100755 --- a/slic3r.pl +++ b/slic3r.pl @@ -214,8 +214,11 @@ if (@ARGV) { # slicing from command line output_file => $opt{output}, ); + # This is delegated to C++ PrintObject::apply_config(). $sprint->apply_config($config); $sprint->set_model($model); + # Do the apply_config once again to validate the layer height profiles at all the newly added PrintObjects. + $sprint->apply_config($config); if ($opt{export_svg}) { $sprint->export_svg; diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp index 1fef7e731..e570abc4c 100644 --- a/xs/src/libslic3r/Print.cpp +++ b/xs/src/libslic3r/Print.cpp @@ -397,6 +397,16 @@ bool Print::apply_config(DynamicPrintConfig config) PrintObjectConfig new_config = this->default_object_config; // we override the new config with object-specific options normalize_and_apply_config(new_config, object->model_object()->config); + // Force a refresh of a variable layer height profile at the PrintObject if it is not valid. + if (! object->layer_height_profile_valid) { + // The layer_height_profile is not valid for some reason (updated by the user or invalidated due to some option change). + // Invalidate the slicing step, which in turn invalidates everything. + object->invalidate_step(posSlice); + // Following line sets the layer_height_profile_valid flag. + object->update_layer_height_profile(); + // Trigger recalculation. + invalidated = true; + } // check whether the new config is different from the current one t_config_option_keys diff = object->config.diff(new_config); object->config.apply(new_config, diff, true); @@ -475,22 +485,6 @@ exit_for_rearrange_regions: this->objects.back()->update_layer_height_profile(); } invalidated = true; - } else { - // Check validity of the layer height profiles. - for (PrintObject *object : this->objects) { - if (! object->layer_height_profile_valid) { - // The layer_height_profile is not valid for some reason (updated by the user or invalidated due to some option change). - // Start slicing of this object from scratch. - object->invalidate_all_steps(); - // Following line sets the layer_height_profile_valid flag. - object->update_layer_height_profile(); - invalidated = true; - } else if (! step_done(posSlice)) { - // Update layer_height_profile from the main thread as it may pull the data from the associated ModelObject. - // Only update if the slicing was not finished yet. - object->update_layer_height_profile(); - } - } } return invalidated; @@ -585,11 +579,13 @@ std::string Print::validate() const return "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"; if (! equal_layering(slicing_params, slicing_params0)) return "The Wipe Tower is only supported for multiple objects if they are sliced equally."; + bool was_layer_height_profile_valid = object->layer_height_profile_valid; object->update_layer_height_profile(); + object->layer_height_profile_valid = was_layer_height_profile_valid; for (size_t i = 1; i < object->layer_height_profile.size(); i += 2) if (object->layer_height_profile[i-1] > slicing_params.object_print_z_min + EPSILON && std::abs(object->layer_height_profile[i] - object->config.layer_height) > EPSILON) - return "The Wipe Tower is currently only supported with constant Z layer spacing. Layer editing is not allowed."; + return "The Wipe Tower is currently only supported with constant Z layer spacing. Layer editing is not allowed."; } } diff --git a/xs/src/libslic3r/PrintObject.cpp b/xs/src/libslic3r/PrintObject.cpp index 08a825421..ee7d9cb19 100644 --- a/xs/src/libslic3r/PrintObject.cpp +++ b/xs/src/libslic3r/PrintObject.cpp @@ -263,6 +263,7 @@ bool PrintObject::invalidate_step(PrintObjectStep step) } else if (step == posSlice) { invalidated |= this->invalidate_step(posPerimeters); invalidated |= this->invalidate_step(posSupportMaterial); + invalidated |= this->_print->invalidate_step(psWipeTower); } else if (step == posSupportMaterial) { invalidated |= this->_print->invalidate_step(psSkirt); invalidated |= this->_print->invalidate_step(psBrim); @@ -1079,7 +1080,6 @@ void PrintObject::_slice() { this->clear_layers(); // Object layers (pairs of bottom/top Z coordinate), without the raft. - this->update_layer_height_profile(); std::vector object_layers = generate_object_layers(slicing_params, this->layer_height_profile); // Reserve object layers for the raft. Last layer of the raft is the contact layer. int id = int(slicing_params.raft_layers());