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

github.com/supermerill/SuperSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsupermerill <merill@free.fr>2021-12-11 21:34:58 +0300
committersupermerill <merill@free.fr>2021-12-11 21:34:58 +0300
commit4f5e801ecf98f8ab7d2600e2a36d54935c6fe079 (patch)
tree91aa39d9db17002cf464d1126f3b3b6a0ff34307 /src
parentb2669f711f781665f224c80dd7ac1414ff5e5997 (diff)
fix some seam_gap issues:
* fix scale * continue traveling up to the old gap position (or continue with wipe_extra_perimeter) supermerill/SuperSlicer#57
Diffstat (limited to 'src')
-rw-r--r--src/libslic3r/ExtrusionEntity.cpp14
-rw-r--r--src/libslic3r/ExtrusionEntity.hpp2
-rw-r--r--src/libslic3r/GCode.cpp41
3 files changed, 41 insertions, 16 deletions
diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp
index 5ed878499..250359aef 100644
--- a/src/libslic3r/ExtrusionEntity.cpp
+++ b/src/libslic3r/ExtrusionEntity.cpp
@@ -213,21 +213,25 @@ void ExtrusionLoop::split_at(const Point &point, bool prefer_non_overhang)
this->split_at_vertex(p);
}
-void ExtrusionLoop::clip_end(double distance, ExtrusionPaths* paths) const
+ExtrusionPaths clip_end(ExtrusionPaths& paths, double distance)
{
- *paths = this->paths;
+ ExtrusionPaths removed;
- while (distance > 0 && !paths->empty()) {
- ExtrusionPath &last = paths->back();
+ while (distance > 0 && !paths.empty()) {
+ ExtrusionPath& last = paths.back();
+ removed.push_back(last);
double len = last.length();
if (len <= distance) {
- paths->pop_back();
+ paths.pop_back();
distance -= len;
} else {
last.polyline.clip_end(distance);
+ removed.back().polyline.clip_start(removed.back().polyline.length() - distance);
break;
}
}
+ std::reverse(removed.begin(), removed.end());
+ return removed;
}
bool ExtrusionLoop::has_overhang_point(const Point &point) const
diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp
index 5369998cf..36198f125 100644
--- a/src/libslic3r/ExtrusionEntity.hpp
+++ b/src/libslic3r/ExtrusionEntity.hpp
@@ -279,6 +279,7 @@ protected:
ExtrusionRole m_role;
};
typedef std::vector<ExtrusionPath> ExtrusionPaths;
+ExtrusionPaths clip_end(ExtrusionPaths& paths, double distance);
class ExtrusionPath3D : public ExtrusionPath {
public:
@@ -451,7 +452,6 @@ public:
double length() const override;
bool split_at_vertex(const Point &point);
void split_at(const Point &point, bool prefer_non_overhang);
- void clip_end(double distance, ExtrusionPaths* paths) const;
// Test, whether the point is extruded by a bridging flow.
// This used to be used to avoid placing seams on overhangs, but now the EdgeGrid is used instead.
bool has_overhang_point(const Point &point) const;
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index edf1677b2..b4f546bf7 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -2949,13 +2949,23 @@ std::string GCode::extrude_loop_vase(const ExtrusionLoop &original_loop, const s
// clip the path to avoid the extruder to get exactly on the first point of the loop;
// if polyline was shorter than the clipping distance we'd get a null polyline, so
// we discard it in that case
- double clip_length = 0;
+ coordf_t clip_length = 0;
+ coordf_t min_clip_length = scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)) * 0.15;
if (m_enable_loop_clipping && m_writer.tool_is_extruder())
- clip_length = m_config.seam_gap.get_abs_value(m_writer.tool()->id(), scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
+ clip_length = scale_(m_config.seam_gap.get_abs_value(m_writer.tool()->id(), EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
// get paths
- ExtrusionPaths paths;
- loop.clip_end(clip_length, &paths);
+ ExtrusionPaths paths = loop.paths;
+ ExtrusionPaths clipped;
+ if (clip_length > min_clip_length) {
+ clipped = clip_end(paths, clip_length);
+ clip_end(clipped, min_clip_length);
+ for (ExtrusionPath& ep : clipped)
+ ep.mm3_per_mm = 0;
+ append(paths, clipped);
+ } else {
+ clip_end(paths, clip_length);
+ }
if (paths.empty()) return "";
// apply the small/external? perimeter speed
@@ -3063,7 +3073,9 @@ std::string GCode::extrude_loop_vase(const ExtrusionLoop &original_loop, const s
double e_per_mm_per_height = (path->mm3_per_mm / this->m_layer->height)
* m_writer.tool()->e_per_mm3()
* this->config().print_extrusion_multiplier.get_abs_value(1);
- if (m_writer.extrusion_axis().empty()) e_per_mm_per_height = 0;
+ if (m_writer.extrusion_axis().empty())
+ e_per_mm_per_height = 0;
+ //extrude
{
std::string comment = m_config.gcode_comments ? description : "";
for (const Line &line : path->polyline.lines()) {
@@ -3271,13 +3283,23 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
// clip the path to avoid the extruder to get exactly on the first point of the loop;
// if polyline was shorter than the clipping distance we'd get a null polyline, so
// we discard it in that case
- double clip_length = 0;
+ coordf_t clip_length = 0;
+ coordf_t min_clip_length = scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)) * 0.15;
if (m_enable_loop_clipping && m_writer.tool_is_extruder())
- clip_length = m_config.seam_gap.get_abs_value(m_writer.tool()->id(), scale_(EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
+ clip_length = scale_(m_config.seam_gap.get_abs_value(m_writer.tool()->id(), EXTRUDER_CONFIG_WITH_DEFAULT(nozzle_diameter, 0)));
// get paths
- ExtrusionPaths paths;
- loop.clip_end(clip_length, &paths);
+ ExtrusionPaths paths = loop.paths;
+ ExtrusionPaths clipped;
+ if (clip_length > min_clip_length) {
+ clipped = clip_end(paths, clip_length);
+ clip_end(clipped, min_clip_length);
+ for (ExtrusionPath& ep : clipped)
+ ep.mm3_per_mm = 0;
+ append(paths, clipped);
+ } else {
+ clip_end(paths, clip_length);
+ }
if (paths.empty()) return "";
// apply the small perimeter speed
@@ -3298,7 +3320,6 @@ std::string GCode::extrude_loop(const ExtrusionLoop &original_loop, const std::s
std::string gcode;
for (ExtrusionPaths::iterator path = paths.begin(); path != paths.end(); ++path) {
//path->simplify(SCALED_RESOLUTION); //should already be simplified
- //gcode += this->_extrude(*path, description, speed);
if(path->polyline.points.size()>1)
gcode += extrude_path(*path, description, speed);
}