From 7e82159620f99f132534b658dc8e0525fd829983 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Tue, 6 Jan 2015 11:29:34 +0100 Subject: [PATCH] Fixed one more case where only_retract_when_crossing_perimeters didn't apply. #2498 --- lib/Slic3r/GCode.pm | 3 ++- xs/src/libslic3r/Layer.cpp | 11 +++++++++++ xs/src/libslic3r/Layer.hpp | 1 + xs/src/libslic3r/SurfaceCollection.cpp | 11 +++++++++++ xs/src/libslic3r/SurfaceCollection.hpp | 1 + xs/xsp/Layer.xsp | 4 ++++ 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/Slic3r/GCode.pm b/lib/Slic3r/GCode.pm index 0a8f3951c..d4f019755 100644 --- a/lib/Slic3r/GCode.pm +++ b/lib/Slic3r/GCode.pm @@ -352,7 +352,8 @@ sub travel_to { && $self->config->fill_density > 0 && defined($self->layer) && ($self->layer->any_internal_region_slice_contains_line($travel) - || $self->layer->any_internal_region_fill_surface_contains_line($travel))) + || ($self->layer->any_bottom_region_slice_contains_line($travel) + && (!defined $self->layer->upper_layer || $self->layer->upper_layer->slices->contains_line($travel))))) || (defined $role && $role == EXTR_ROLE_SUPPORTMATERIAL && $self->layer->support_islands->contains_line($travel)) ) { # Just perform a straight travel move without any retraction. diff --git a/xs/src/libslic3r/Layer.cpp b/xs/src/libslic3r/Layer.cpp index 47bef8101..d46665d88 100644 --- a/xs/src/libslic3r/Layer.cpp +++ b/xs/src/libslic3r/Layer.cpp @@ -131,6 +131,17 @@ Layer::any_internal_region_slice_contains(const T &item) const } template bool Layer::any_internal_region_slice_contains(const Line &item) const; +template +bool +Layer::any_bottom_region_slice_contains(const T &item) const +{ + FOREACH_LAYERREGION(this, layerm) { + if ((*layerm)->slices.any_bottom_contains(item)) return true; + } + return false; +} +template bool Layer::any_bottom_region_slice_contains(const Line &item) const; + template bool Layer::any_internal_region_fill_surface_contains(const T &item) const diff --git a/xs/src/libslic3r/Layer.hpp b/xs/src/libslic3r/Layer.hpp index 6a4e905c3..6630e2cdc 100644 --- a/xs/src/libslic3r/Layer.hpp +++ b/xs/src/libslic3r/Layer.hpp @@ -94,6 +94,7 @@ class Layer { void make_slices(); template bool any_internal_region_slice_contains(const T &item) const; + template bool any_bottom_region_slice_contains(const T &item) const; template bool any_internal_region_fill_surface_contains(const T &item) const; protected: diff --git a/xs/src/libslic3r/SurfaceCollection.cpp b/xs/src/libslic3r/SurfaceCollection.cpp index ccf1eaa4e..c3b5f6866 100644 --- a/xs/src/libslic3r/SurfaceCollection.cpp +++ b/xs/src/libslic3r/SurfaceCollection.cpp @@ -80,6 +80,17 @@ SurfaceCollection::any_internal_contains(const T &item) const template bool SurfaceCollection::any_internal_contains(const Line &item) const; template bool SurfaceCollection::any_internal_contains(const Polyline &item) const; +template +bool +SurfaceCollection::any_bottom_contains(const T &item) const +{ + for (Surfaces::const_iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) { + if (surface->is_bottom() && surface->expolygon.contains(item)) return true; + } + return false; +} +template bool SurfaceCollection::any_bottom_contains(const Line &item) const; + SurfacesPtr SurfaceCollection::filter_by_type(SurfaceType type) { diff --git a/xs/src/libslic3r/SurfaceCollection.hpp b/xs/src/libslic3r/SurfaceCollection.hpp index 09a46449e..e2ced7f0e 100644 --- a/xs/src/libslic3r/SurfaceCollection.hpp +++ b/xs/src/libslic3r/SurfaceCollection.hpp @@ -16,6 +16,7 @@ class SurfaceCollection void simplify(double tolerance); void group(std::vector *retval); template bool any_internal_contains(const T &item) const; + template bool any_bottom_contains(const T &item) const; SurfacesPtr filter_by_type(SurfaceType type); void filter_by_type(SurfaceType type, Polygons* polygons); }; diff --git a/xs/xsp/Layer.xsp b/xs/xsp/Layer.xsp index cc38b0847..8f512c4e9 100644 --- a/xs/xsp/Layer.xsp +++ b/xs/xsp/Layer.xsp @@ -71,6 +71,8 @@ void make_slices(); bool any_internal_region_slice_contains_line(Line* line) %code%{ RETVAL = THIS->any_internal_region_slice_contains(*line); %}; + bool any_bottom_region_slice_contains_line(Line* line) + %code%{ RETVAL = THIS->any_bottom_region_slice_contains(*line); %}; bool any_internal_region_fill_surface_contains_line(Line* line) %code%{ RETVAL = THIS->any_internal_region_fill_surface_contains(*line); %}; bool any_internal_region_fill_surface_contains_polyline(Polyline* polyline) @@ -123,6 +125,8 @@ bool any_internal_region_slice_contains_line(Line* line) %code%{ RETVAL = THIS->any_internal_region_slice_contains(*line); %}; + bool any_bottom_region_slice_contains_line(Line* line) + %code%{ RETVAL = THIS->any_bottom_region_slice_contains(*line); %}; bool any_internal_region_fill_surface_contains_line(Line* line) %code%{ RETVAL = THIS->any_internal_region_fill_surface_contains(*line); %}; bool any_internal_region_fill_surface_contains_polyline(Polyline* polyline)