diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 72b9412d3..f824a50e1 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -1379,23 +1379,31 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl:: float sharp_angle_weight = angle_weight(SeamPlacer::sharp_angle_snapping_threshold); //gather points positions and weights - size_t segments_count = 0; + float total_length = 0.0f; + float sharp_length = 0.0f; + Vec3f prev_pos = layers[seam_string[0].first].points[seam_string[0].second].position; for (size_t index = 0; index < seam_string.size(); ++index) { const SeamCandidate &point = layers[seam_string[index].first].points[seam_string[index].second]; Vec3f pos = point.position; + float dist = (pos - prev_pos).norm(); + total_length += dist; observations[index] = pos.head<2>(); observation_points[index] = pos.z(); weights[index] = angle_weight(point.local_ccw_angle); bool is_enforced = point.type == EnforcedBlockedSeamPoint::Enforced; - if (is_enforced || weights[index] > sharp_angle_weight) { - segments_count++; + if (is_enforced) { + weights[index] = std::max(weights[index], 6.0f); } + if (is_enforced || weights[index] > sharp_angle_weight) { + sharp_length+= dist; + } + prev_pos = pos; } // Curve Fitting size_t number_of_segments = std::max( - std::max(size_t(1), seam_string.size() / 200), - size_t(segments_count / SeamPlacer::seam_align_seams_per_segment)); + std::max(size_t(1), size_t(total_length / 30.0f)), + size_t(sharp_length / SeamPlacer::seam_align_mm_per_segment)); auto curve = Geometry::fit_cubic_bspline(observations, observation_points, weights, number_of_segments); // Do alignment - compute fitted point for each point in the string from its Z coord, and store the position into diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp index cc1e50513..c905fe8f6 100644 --- a/src/libslic3r/GCode/SeamPlacer.hpp +++ b/src/libslic3r/GCode/SeamPlacer.hpp @@ -147,8 +147,8 @@ public: static constexpr float seam_align_tolerable_dist_factor = 4.0f; // minimum number of seams needed in cluster to make alignment happen static constexpr size_t seam_align_minimum_string_seams = 6; - // number of seams per bspline segment - static constexpr float seam_align_seams_per_segment = 8.0f; + // millimeters covered by spline; determines number of splines for the given string + static constexpr size_t seam_align_mm_per_segment = 4.0f; //The following data structures hold all perimeter points for all PrintObject. std::unordered_map m_seam_per_object;