From eae9a76249f8a6fcd2d8c8425aa2e0c3e3d258a7 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 9 Aug 2023 17:27:43 +0200 Subject: [PATCH] Addressing problem with items slightly out of bed due to simplification solves SPE-1824 --- src/libslic3r/Arrange/Arrange.hpp | 26 ++++++++++++++++++- src/libslic3r/Arrange/ArrangeImpl.hpp | 16 ++++++++++-- src/libslic3r/Arrange/Items/ArrangeItem.cpp | 7 ++--- .../Arrange/Tasks/ArrangeTaskImpl.hpp | 2 +- .../Arrange/Tasks/FillBedTaskImpl.hpp | 2 +- .../Tasks/MultiplySelectionTaskImpl.hpp | 2 +- 6 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/libslic3r/Arrange/Arrange.hpp b/src/libslic3r/Arrange/Arrange.hpp index 96bc007782..36ab838739 100644 --- a/src/libslic3r/Arrange/Arrange.hpp +++ b/src/libslic3r/Arrange/Arrange.hpp @@ -90,6 +90,10 @@ public: virtual ArrItem convert(const Arrangeable &arrbl, coord_t offs = 0) const = 0; + // Returns the extent of simplification that the converter utilizes when + // creating arrange items. Zero shall mean no simplification at all. + virtual coord_t simplification_tolerance() const { return 0; } + static std::unique_ptr create( ArrangeSettingsView::GeometryHandling geometry_handling, coord_t safety_d); @@ -120,11 +124,19 @@ template class BasicItemConverter : public ArrangeableToItemConverter { coord_t m_safety_d; + coord_t m_simplify_tol; public: - BasicItemConverter(coord_t safety_d = 0) : m_safety_d{safety_d} {} + BasicItemConverter(coord_t safety_d = 0, coord_t simpl_tol = 0) + : m_safety_d{safety_d}, m_simplify_tol{simpl_tol} + {} coord_t safety_dist() const noexcept { return m_safety_d; } + + coord_t simplification_tolerance() const override + { + return m_simplify_tol; + } }; template @@ -231,6 +243,18 @@ double get_fit_into_bed_rotation(const ArrItem &itm, const RectangleBed &bed) return ret; } +template +auto get_corrected_bed(const ExtendedBed &bed, + const ArrangeableToItemConverter &converter) +{ + auto bedcpy = bed; + visit_bed([tol = -converter.simplification_tolerance()](auto &rawbed) { + rawbed = offset(rawbed, tol); + }, bedcpy); + + return bedcpy; +} + }} // namespace Slic3r::arr2 #endif // ARRANGE2_HPP diff --git a/src/libslic3r/Arrange/ArrangeImpl.hpp b/src/libslic3r/Arrange/ArrangeImpl.hpp index 3cec1afee9..ce4ee03ebe 100644 --- a/src/libslic3r/Arrange/ArrangeImpl.hpp +++ b/src/libslic3r/Arrange/ArrangeImpl.hpp @@ -416,12 +416,22 @@ ArrItem AdvancedItemConverter::get_arritem(const Arrangeable &arrbl, auto outline = arrbl.full_outline(); auto envelope = arrbl.full_envelope(); + if (infl != 0) { outline = offset_ex(outline, infl); if (! envelope.empty()) envelope = offset_ex(envelope, infl); } + auto simpl_tol = static_cast(this->simplification_tolerance()); + + if (simpl_tol > 0) + { + outline = expolygons_simplify(outline, simpl_tol); + if (!envelope.empty()) + envelope = expolygons_simplify(envelope, simpl_tol); + } + ArrItem ret; set_shape(ret, outline); if (! envelope.empty()) @@ -448,15 +458,17 @@ ArrangeableToItemConverter::create( { std::unique_ptr> ret; + constexpr coord_t SimplifyTol = scaled(.2); + switch(gh) { case arr2::ArrangeSettingsView::ghConvex: ret = std::make_unique>(safety_d); break; case arr2::ArrangeSettingsView::ghBalanced: - ret = std::make_unique>(safety_d); + ret = std::make_unique>(safety_d, SimplifyTol); break; case arr2::ArrangeSettingsView::ghAdvanced: - ret = std::make_unique>(safety_d); + ret = std::make_unique>(safety_d, SimplifyTol); break; default: ; diff --git a/src/libslic3r/Arrange/Items/ArrangeItem.cpp b/src/libslic3r/Arrange/Items/ArrangeItem.cpp index 63d15e75a6..fb4c1845ee 100644 --- a/src/libslic3r/Arrange/Items/ArrangeItem.cpp +++ b/src/libslic3r/Arrange/Items/ArrangeItem.cpp @@ -114,8 +114,7 @@ Vec2crd DecomposedShape::centroid() const DecomposedShape decompose(const ExPolygons &shape) { - ExPolygons shape_s = expolygons_simplify(shape, scaled(.2)); - return DecomposedShape{convex_decomposition_tess(shape_s)}; + return DecomposedShape{convex_decomposition_tess(shape)}; } DecomposedShape decompose(const Polygon &shape) @@ -126,9 +125,7 @@ DecomposedShape decompose(const Polygon &shape) if (is_convex) { convex_shapes.emplace_back(shape); } else { - Polygon shape_s = shape; - shape_s.simplify(scaled(.2)); - convex_shapes = convex_decomposition_tess(shape_s); + convex_shapes = convex_decomposition_tess(shape); } return DecomposedShape{std::move(convex_shapes)}; diff --git a/src/libslic3r/Arrange/Tasks/ArrangeTaskImpl.hpp b/src/libslic3r/Arrange/Tasks/ArrangeTaskImpl.hpp index 703e6866ff..c9f48f93e4 100644 --- a/src/libslic3r/Arrange/Tasks/ArrangeTaskImpl.hpp +++ b/src/libslic3r/Arrange/Tasks/ArrangeTaskImpl.hpp @@ -47,7 +47,7 @@ std::unique_ptr> ArrangeTask::create( task->settings.set_from(sc.settings()); - task->bed = sc.bed(); + task->bed = get_corrected_bed(sc.bed(), converter); extract_selected(*task, sc.model(), converter); diff --git a/src/libslic3r/Arrange/Tasks/FillBedTaskImpl.hpp b/src/libslic3r/Arrange/Tasks/FillBedTaskImpl.hpp index 62b0d78270..a99102418f 100644 --- a/src/libslic3r/Arrange/Tasks/FillBedTaskImpl.hpp +++ b/src/libslic3r/Arrange/Tasks/FillBedTaskImpl.hpp @@ -124,7 +124,7 @@ std::unique_ptr> FillBedTask::create( task->settings.set_from(sc.settings()); - task->bed = sc.bed(); + task->bed = get_corrected_bed(sc.bed(), converter); extract(*task, sc, converter); diff --git a/src/libslic3r/Arrange/Tasks/MultiplySelectionTaskImpl.hpp b/src/libslic3r/Arrange/Tasks/MultiplySelectionTaskImpl.hpp index 0abf31376d..d4c925c3bf 100644 --- a/src/libslic3r/Arrange/Tasks/MultiplySelectionTaskImpl.hpp +++ b/src/libslic3r/Arrange/Tasks/MultiplySelectionTaskImpl.hpp @@ -15,7 +15,7 @@ std::unique_ptr> MultiplySelectionTask:: task.settings.set_from(scene.settings()); - task.bed = scene.bed(); + task.bed = get_corrected_bed(scene.bed(), itm_conv); task.prototype_item = {};