diff options
author | bubnikv <bubnikv@gmail.com> | 2017-02-02 20:49:33 +0300 |
---|---|---|
committer | bubnikv <bubnikv@gmail.com> | 2017-02-02 20:49:33 +0300 |
commit | 7e6390c4b633fe79c94fc0eac547a93c51e4dcba (patch) | |
tree | b14eca0306c1fe1d6e400d64aee31942e661a07c /xs/src/libslic3r/ExtrusionEntity.cpp | |
parent | 4256af22ff628156c85349c217ff46c1e41321a2 (diff) |
Avoid placement of seams on bridging perimeters, if random seam is enabled.
https://github.com/alexrj/Slic3r/issues/3526#issuecomment-263125049
Diffstat (limited to 'xs/src/libslic3r/ExtrusionEntity.cpp')
-rw-r--r-- | xs/src/libslic3r/ExtrusionEntity.cpp | 42 |
1 files changed, 29 insertions, 13 deletions
diff --git a/xs/src/libslic3r/ExtrusionEntity.cpp b/xs/src/libslic3r/ExtrusionEntity.cpp index d960e2838..dc7cfe061 100644 --- a/xs/src/libslic3r/ExtrusionEntity.cpp +++ b/xs/src/libslic3r/ExtrusionEntity.cpp @@ -204,22 +204,38 @@ ExtrusionLoop::split_at_vertex(const Point &point) return false; } -void -ExtrusionLoop::split_at(const Point &point) +// Splitting an extrusion loop, possibly made of multiple segments, some of the segments may be bridging. +void ExtrusionLoop::split_at(const Point &point, bool prefer_non_overhang) { - if (this->paths.empty()) return; + if (this->paths.empty()) + return; - // find the closest path and closest point belonging to that path + // Find the closest path and closest point belonging to that path. Avoid overhangs, if asked for. size_t path_idx = 0; - Point p = this->paths.front().first_point(); - double min = point.distance_to(p); - for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) { - Point p_tmp = point.projection_onto(path->polyline); - double dist = point.distance_to(p_tmp); - if (dist < min) { - p = p_tmp; - min = dist; - path_idx = path - this->paths.begin(); + Point p; + { + double min = std::numeric_limits<double>::max(); + Point p_non_overhang; + size_t path_idx_non_overhang = 0; + double min_non_overhang = std::numeric_limits<double>::max(); + for (ExtrusionPaths::const_iterator path = this->paths.begin(); path != this->paths.end(); ++path) { + Point p_tmp = point.projection_onto(path->polyline); + double dist = point.distance_to(p_tmp); + if (dist < min) { + p = p_tmp; + min = dist; + path_idx = path - this->paths.begin(); + } + if (prefer_non_overhang && ! path->is_bridge() && dist < min_non_overhang) { + p_non_overhang = p_tmp; + min_non_overhang = dist; + path_idx_non_overhang = path - this->paths.begin(); + } + } + if (prefer_non_overhang && min_non_overhang != std::numeric_limits<double>::max()) { + // Only apply the non-overhang point if there is one. + path_idx = path_idx_non_overhang; + p = p_non_overhang; } } |