From 2c6431218eef64fa4c539378cd6b03813061f061 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 7 Jul 2022 15:55:05 +0200 Subject: [PATCH 1/7] Add arrange parameter to set min distance from bed implements FR #8442 --- src/slic3r/GUI/GLCanvas3D.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 66759f4c74..367a0e8063 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1111,12 +1111,21 @@ void GLCanvas3D::load_arrange_settings() std::string dist_fff_str = wxGetApp().app_config->get("arrange", "min_object_distance_fff"); + std::string dist_bed_fff_str = + wxGetApp().app_config->get("arrange", "min_bed_distance_fff"); + std::string dist_fff_seq_print_str = wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print"); + std::string dist_bed_fff_seq_print_str = + wxGetApp().app_config->get("arrange", "min_bed_distance_fff_seq_print"); + std::string dist_sla_str = wxGetApp().app_config->get("arrange", "min_object_distance_sla"); + std::string dist_bed_sla_str = + wxGetApp().app_config->get("arrange", "min_bed_distance_sla"); + std::string en_rot_fff_str = wxGetApp().app_config->get("arrange", "enable_rotation_fff"); @@ -1129,12 +1138,21 @@ void GLCanvas3D::load_arrange_settings() if (!dist_fff_str.empty()) m_arrange_settings_fff.distance = string_to_float_decimal_point(dist_fff_str); + if (!dist_bed_fff_str.empty()) + m_arrange_settings_fff.distance_from_bed = string_to_float_decimal_point(dist_bed_fff_str); + if (!dist_fff_seq_print_str.empty()) m_arrange_settings_fff_seq_print.distance = string_to_float_decimal_point(dist_fff_seq_print_str); + if (!dist_bed_fff_seq_print_str.empty()) + m_arrange_settings_fff_seq_print.distance_from_bed = string_to_float_decimal_point(dist_bed_fff_seq_print_str); + if (!dist_sla_str.empty()) m_arrange_settings_sla.distance = string_to_float_decimal_point(dist_sla_str); + if (!dist_bed_sla_str.empty()) + m_arrange_settings_sla.distance_from_bed = string_to_float_decimal_point(dist_bed_sla_str); + if (!en_rot_fff_str.empty()) m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes"); @@ -4525,11 +4543,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) bool settings_changed = false; float dist_min = 0.f; - std::string dist_key = "min_object_distance", rot_key = "enable_rotation"; + float dist_bed_min = 0.f; + std::string dist_key = "min_object_distance"; + std::string dist_bed_key = "min_bed_distance"; + std::string rot_key = "enable_rotation"; std::string postfix; if (ptech == ptSLA) { - dist_min = 0.f; postfix = "_sla"; } else if (ptech == ptFFF) { auto co_opt = m_config->option("complete_objects"); @@ -4543,7 +4563,8 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) } dist_key += postfix; - rot_key += postfix; + dist_bed_key += postfix; + rot_key += postfix; imgui->text(GUI::format_wxstr(_L("Press %1%left mouse button to enter the exact value"), shortkey_ctrl_prefix())); @@ -4554,6 +4575,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) settings_changed = true; } + if (imgui->slider_float(_L("Spacing from bed"), &settings.distance_from_bed, dist_bed_min, 100.0f, "%5.2f") || dist_bed_min > settings.distance_from_bed) { + settings.distance_from_bed = std::max(dist_bed_min, settings.distance_from_bed); + settings_out.distance_from_bed = settings.distance_from_bed; + appcfg->set("arrange", dist_bed_key.c_str(), float_to_string_decimal_point(settings_out.distance_from_bed)); + settings_changed = true; + } + if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) { settings_out.enable_rotation = settings.enable_rotation; appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); @@ -4566,6 +4594,7 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) settings_out = ArrangeSettings{}; settings_out.distance = std::max(dist_min, settings_out.distance); appcfg->set("arrange", dist_key.c_str(), float_to_string_decimal_point(settings_out.distance)); + appcfg->set("arrange", dist_bed_key.c_str(), float_to_string_decimal_point(settings_out.distance_from_bed)); appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); settings_changed = true; } From fa897fbda4fc50441ba1ab327f0b847f46144e3f Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 12 Sep 2022 10:41:24 +0200 Subject: [PATCH 2/7] Fix: bed filling not respecting arrange bounds --- src/slic3r/GUI/Jobs/FillBedJob.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp index c7d69eb500..5eefc14b6f 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.cpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp @@ -117,6 +117,7 @@ void FillBedJob::process(Ctl &ctl) arrangement::ArrangeParams params; params.allow_rotations = settings.enable_rotation; params.min_obj_distance = scaled(settings.distance); + params.min_bed_distance = scaled(settings.distance_from_bed); bool do_stop = false; params.stopcondition = [&ctl, &do_stop]() { From 4d9530deb7df61f239d5e873fd7f0edf6dfde365 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 13 Sep 2022 15:07:40 +0200 Subject: [PATCH 3/7] Prevent potential data races in arrange job --- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index e75304d7aa..cb26fae0b6 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -167,12 +167,16 @@ void ArrangeJob::process(Ctl &ctl) static const auto arrangestr = _u8L("Arranging"); ctl.update_status(0, arrangestr); - ctl.call_on_main_thread([this]{ prepare(); }).wait();; - arrangement::ArrangeParams params = get_arrange_params(m_plater); + arrangement::ArrangeParams params; + Points bedpts; + ctl.call_on_main_thread([this, ¶ms, &bedpts]{ + prepare(); + params = get_arrange_params(m_plater); + bedpts = get_bed_shape(*m_plater->config()); + }).wait();; auto count = unsigned(m_selected.size() + m_unprintable.size()); - Points bedpts = get_bed_shape(*m_plater->config()); params.stopcondition = [&ctl]() { return ctl.was_canceled(); }; From 3e53abf9bd6a44a24ee5bad23e9c3de6feba0ab6 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 13 Sep 2022 16:50:18 +0200 Subject: [PATCH 4/7] Remove junk code --- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index cb26fae0b6..6627b7bb79 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -1,7 +1,6 @@ #include "ArrangeJob.hpp" #include "libslic3r/BuildVolume.hpp" -#include "libslic3r/MTUtils.hpp" #include "libslic3r/Model.hpp" #include "slic3r/GUI/Plater.hpp" @@ -174,7 +173,7 @@ void ArrangeJob::process(Ctl &ctl) prepare(); params = get_arrange_params(m_plater); bedpts = get_bed_shape(*m_plater->config()); - }).wait();; + }).wait(); auto count = unsigned(m_selected.size() + m_unprintable.size()); From 6197acf5760b68834bf0ab8fa408ee99c7bfb16c Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 13 Sep 2022 16:51:20 +0200 Subject: [PATCH 5/7] Don't arrange items if the bed has negative area Also interpret a bounding box with maxCorner lower then minCorner as a negative area box --- .../include/libnest2d/geometry_traits.hpp | 5 +++-- src/libslic3r/Arrange.cpp | 14 ++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index f388e37b11..1192f4d4da 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -198,9 +198,10 @@ public: inline P center() const BP2D_NOEXCEPT; - template> + template> inline Unit area() const BP2D_NOEXCEPT { - return Unit(width())*height(); + Unit s = std::signbit(width()) || std::signbit(height()) ? Unit(-1) : Unit(1); + return s * libnest2d::abs(width() * height()); } static inline _Box infinite(const P ¢er = {TCoord

(0), TCoord

(0)}); diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index a313c46263..a6aecd205c 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -497,11 +497,11 @@ void _arrange( mod_params.min_obj_distance = 0; AutoArranger arranger{corrected_bin, mod_params, progressfn, stopfn}; - + auto infl = coord_t(std::ceil(params.min_obj_distance / 2.0)); for (Item& itm : shapes) itm.inflate(infl); for (Item& itm : excludes) itm.inflate(infl); - + remove_large_items(excludes, corrected_bin); // If there is something on the plate @@ -511,7 +511,7 @@ void _arrange( inp.reserve(shapes.size() + excludes.size()); for (auto &itm : shapes ) inp.emplace_back(itm); for (auto &itm : excludes) inp.emplace_back(itm); - + // Use the minimum bounding box rotation as a starting point. // TODO: This only works for convex hull. If we ever switch to concave // polygon nesting, a convex hull needs to be calculated. @@ -528,7 +528,13 @@ void _arrange( } } - arranger(inp.begin(), inp.end()); + if (sl::area(corrected_bin) > 0) + arranger(inp.begin(), inp.end()); + else { + for (Item &itm : inp) + itm.binId(BIN_ID_UNSET); + } + for (Item &itm : inp) itm.inflate(-infl); } From 66bc6ecc5c7efcf2885cf2a991e7f6b4cd42e171 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 14 Sep 2022 13:21:14 +0200 Subject: [PATCH 6/7] Fix build on msvc --- src/libnest2d/include/libnest2d/geometry_traits.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index 1192f4d4da..0096ef6109 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -200,7 +200,8 @@ public: template> inline Unit area() const BP2D_NOEXCEPT { - Unit s = std::signbit(width()) || std::signbit(height()) ? Unit(-1) : Unit(1); + constexpr TCoord

Zero{0}; + Unit s = width() < Zero || height() < Zero ? Unit(-1) : Unit(1); return s * libnest2d::abs(width() * height()); } From 086fb28299160c702c76230b3b60c37b8dbdab9e Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Wed, 14 Sep 2022 16:39:18 +0200 Subject: [PATCH 7/7] Fix failing tests --- src/libnest2d/include/libnest2d/geometry_traits.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp index 0096ef6109..134ec73a0b 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -202,7 +202,7 @@ public: inline Unit area() const BP2D_NOEXCEPT { constexpr TCoord

Zero{0}; Unit s = width() < Zero || height() < Zero ? Unit(-1) : Unit(1); - return s * libnest2d::abs(width() * height()); + return s * libnest2d::abs(Unit(width()) * height()); } static inline _Box infinite(const P ¢er = {TCoord

(0), TCoord

(0)});