diff options
author | bubnikv <bubnikv@gmail.com> | 2017-02-15 16:39:08 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2017-02-15 16:39:08 +0300 |
commit | 4d739c41a00250508b9c31c8e66b8f59e505ce2e (patch) | |
tree | 22c0c43d802cfd88c02f0be1e7a995525d7cd60f /xs | |
parent | d2d7c5beade5566111beca79bb3b072f67f6e8c6 (diff) |
Improvements of the layer height spline editing close to the top
of the object.
Diffstat (limited to 'xs')
-rw-r--r-- | xs/src/libslic3r/Slicing.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/xs/src/libslic3r/Slicing.cpp b/xs/src/libslic3r/Slicing.cpp index 87c2e8fde..de6cd1c3b 100644 --- a/xs/src/libslic3r/Slicing.cpp +++ b/xs/src/libslic3r/Slicing.cpp @@ -386,7 +386,8 @@ void adjust_layer_height_profile( // 3) Densify the profile inside z +- band_width/2, remove duplicate Zs from the height profile inside the band. coordf_t lo = std::max(z_span_variable.first, z - 0.5 * band_width); - coordf_t hi = std::min(z_span_variable.second, z + 0.5 * band_width); + // Do not limit the upper side of the band, so that the modifications to the top point of the profile will be allowed. + coordf_t hi = z + 0.5 * band_width; coordf_t z_step = 0.1; size_t idx = 0; while (idx < layer_height_profile.size() && layer_height_profile[idx] < lo) @@ -436,12 +437,25 @@ void adjust_layer_height_profile( assert(false); break; } + height = clamp(slicing_params.min_layer_height, slicing_params.max_layer_height, height); + if (zz == z_span_variable.second) { + // This is the last point of the profile. + if (profile_new[profile_new.size() - 2] + EPSILON > zz) { + profile_new.pop_back(); + profile_new.pop_back(); + } + profile_new.push_back(zz); + profile_new.push_back(height); + idx = layer_height_profile.size(); + break; + } // Avoid entering a too short segment. if (profile_new[profile_new.size() - 2] + EPSILON < zz) { profile_new.push_back(zz); - profile_new.push_back(clamp(slicing_params.min_layer_height, slicing_params.max_layer_height, height)); + profile_new.push_back(height); } - zz += z_step; + // Limit zz to the object height, so the next iteration the last profile point will be set. + zz = std::min(zz + z_step, z_span_variable.second); idx = next; while (idx < layer_height_profile.size() && layer_height_profile[idx] < zz) idx += 2; @@ -456,12 +470,16 @@ void adjust_layer_height_profile( assert(zz <= layer_height_profile[idx]); profile_new.insert(profile_new.end(), layer_height_profile.begin() + idx, layer_height_profile.end()); } - else if (profile_new[profile_new.size() - 2] + 0.5 * EPSILON < slicing_params.object_print_z_height()) { + else if (profile_new[profile_new.size() - 2] + 0.5 * EPSILON < z_span_variable.second) { profile_new.insert(profile_new.end(), layer_height_profile.end() - 2, layer_height_profile.end()); } layer_height_profile = std::move(profile_new); if (action == LAYER_HEIGHT_EDIT_ACTION_SMOOTH) { + if (i_resampled_start == 0) + ++ i_resampled_start; + if (i_resampled_end == layer_height_profile.size()) + i_resampled_end -= 2; size_t n_rounds = 6; for (size_t i_round = 0; i_round < n_rounds; ++ i_round) { profile_new = layer_height_profile; |