From d69d477480b4ae51661a5084c100d80e1ecb6010 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 18 Aug 2023 13:07:44 +0200 Subject: [PATCH] Fix wipe tower arrangement --- src/libslic3r/Arrange/ArrangeImpl.hpp | 28 ++++++++------------------ src/libslic3r/Arrange/Scene.hpp | 8 ++++++++ src/libslic3r/Arrange/SceneBuilder.cpp | 17 +++++++++++++--- src/libslic3r/Arrange/SceneBuilder.hpp | 7 ++++--- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/src/libslic3r/Arrange/ArrangeImpl.hpp b/src/libslic3r/Arrange/ArrangeImpl.hpp index 2bbe9ab29c..afe919ccff 100644 --- a/src/libslic3r/Arrange/ArrangeImpl.hpp +++ b/src/libslic3r/Arrange/ArrangeImpl.hpp @@ -45,35 +45,22 @@ void arrange(SelectionStrategy &&selstrategy, RectangleBed{bed.bb}, SelStrategyTag{}); std::vector bed_indices = get_bed_indices(items, fixed); - - size_t beds = bed_indices.size(); - - auto fixed_is_empty = [&bed_indices](int bidx) { - auto it = std::lower_bound(bed_indices.begin(), bed_indices.end(), bidx); - return it == bed_indices.end() || *it != bidx; - }; - - auto set_bed_as_empty = [&bed_indices](int bidx) { - auto it = std::lower_bound(bed_indices.begin(), bed_indices.end(), bidx); - if (it != bed_indices.end()) - bed_indices.erase(it); - }; - - std::vector pilebb(bed_indices.size()); + std::map pilebb; + std::map bed_occupied; for (auto &itm : items) { auto bedidx = get_bed_index(itm); if (bedidx >= 0) { pilebb[bedidx].merge(fixed_bounding_box(itm)); if (is_wipe_tower(itm)) - set_bed_as_empty(bedidx); + bed_occupied[bedidx] = true; } } for (auto &fxitm : fixed) { auto bedidx = get_bed_index(fxitm); - if (bedidx >= 0 || is_wipe_tower(fxitm)) - set_bed_as_empty(bedidx); + if (bedidx >= 0) + bed_occupied[bedidx] = true; } auto bedbb = bounding_box(bed); @@ -85,8 +72,9 @@ void arrange(SelectionStrategy &&selstrategy, Pivots pivot = bed.alignment(); - for (size_t bedidx = 0; bedidx < beds; ++bedidx) { - if (! fixed_is_empty(bedidx)) + for (int bedidx : bed_indices) { + if (auto occup_it = bed_occupied.find(bedidx); + occup_it != bed_occupied.end() && occup_it->second) continue; BoundingBox bb; diff --git a/src/libslic3r/Arrange/Scene.hpp b/src/libslic3r/Arrange/Scene.hpp index f917ed3c2f..e7f6c2a7c0 100644 --- a/src/libslic3r/Arrange/Scene.hpp +++ b/src/libslic3r/Arrange/Scene.hpp @@ -161,6 +161,14 @@ template void visit_bed(BedFn &&fn, ExtendedBed &bed) boost::apply_visitor(fn, bed); } +inline BoundingBox bounding_box(const ExtendedBed &bed) +{ + BoundingBox bedbb; + visit_bed([&bedbb](auto &rawbed) { bedbb = bounding_box(rawbed); }, bed); + + return bedbb; +} + class Scene; // SceneBuilderBase is intended for Scene construction. A simple constructor diff --git a/src/libslic3r/Arrange/SceneBuilder.cpp b/src/libslic3r/Arrange/SceneBuilder.cpp index 12c4556670..f9453c9721 100644 --- a/src/libslic3r/Arrange/SceneBuilder.cpp +++ b/src/libslic3r/Arrange/SceneBuilder.cpp @@ -199,6 +199,17 @@ void SceneBuilder::build_arrangeable_slicer_model(ArrangeableSlicerModel &amodel m_wipetower_handler = std::make_unique(); } + if (m_fff_print && !m_xl_printer) + m_xl_printer = is_XL_printer(m_fff_print->config()); + + bool has_wipe_tower = false; + m_wipetower_handler->visit( + [&has_wipe_tower](const Arrangeable &arrbl) { has_wipe_tower = true; }); + + if (m_xl_printer && !has_wipe_tower) { + m_bed = XLBed{bounding_box(m_bed)}; + } + amodel.m_vbed_handler = std::move(m_vbed_handler); amodel.m_model = std::move(m_model); amodel.m_selmask = std::move(m_selection); @@ -443,11 +454,11 @@ SceneBuilder &&SceneBuilder::set_bed(const DynamicPrintConfig &cfg) Points bedpts = get_bed_shape(cfg); if (is_XL_printer(cfg)) { - m_bed = XLBed{get_extents(bedpts)}; - } else { - m_bed = arr2::to_arrange_bed(bedpts); + m_xl_printer = true; } + m_bed = arr2::to_arrange_bed(bedpts); + return std::move(*this); } diff --git a/src/libslic3r/Arrange/SceneBuilder.hpp b/src/libslic3r/Arrange/SceneBuilder.hpp index 54146cd3cc..8f4f8a7797 100644 --- a/src/libslic3r/Arrange/SceneBuilder.hpp +++ b/src/libslic3r/Arrange/SceneBuilder.hpp @@ -205,6 +205,7 @@ protected: AnyPtr m_sla_print; AnyPtr m_fff_print; + bool m_xl_printer = false; void set_brim_and_skirt(); @@ -498,9 +499,9 @@ class ArrangeableSLAPrint : public ArrangeableSlicerModel { static void visit_arrangeable_(Self &&self, const ObjectID &id, Fn &&fn); public: - explicit ArrangeableSLAPrint(const SLAPrint *slaprint, - SceneBuilder &builder) - : m_slaprint{slaprint}, ArrangeableSlicerModel{builder} + explicit ArrangeableSLAPrint(const SLAPrint *slaprint, SceneBuilder &builder) + : m_slaprint{slaprint} + , ArrangeableSlicerModel{builder} { assert(slaprint != nullptr); }