Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbubnikv <bubnikv@gmail.com>2017-02-02 20:49:33 +0300
committerbubnikv <bubnikv@gmail.com>2017-02-02 20:49:33 +0300
commit7e6390c4b633fe79c94fc0eac547a93c51e4dcba (patch)
treeb14eca0306c1fe1d6e400d64aee31942e661a07c /xs/src/libslic3r/ExtrusionEntity.cpp
parent4256af22ff628156c85349c217ff46c1e41321a2 (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.cpp42
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;
}
}