From 844ea8943250e645a4fc4be53381beb1588f9a7a Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Thu, 3 Dec 2020 12:00:12 +0100 Subject: [PATCH] Fix out of bed items after arrange. Disabled outline decimation for arrange and added very small (EPSILON) safety offset to bed detection boundaries. --- src/libslic3r/Arrange.cpp | 13 ++++--------- src/libslic3r/Model.cpp | 12 ++++++------ src/slic3r/GUI/3DScene.cpp | 4 ++++ src/slic3r/GUI/3DScene.hpp | 2 ++ src/slic3r/GUI/GLCanvas3D.cpp | 2 +- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index eaa9726dd..bb13a9a0a 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -395,9 +395,7 @@ public: PConfig& config() { return m_pconf; } const PConfig& config() const { return m_pconf; } - inline void preload(std::vector& fixeditems) { - // Build the rtree for queries to work - + inline void preload(std::vector& fixeditems) { for(unsigned idx = 0; idx < fixeditems.size(); ++idx) { Item& itm = fixeditems[idx]; itm.markAsFixedInBin(itm.binId()); @@ -416,13 +414,10 @@ template<> std::function AutoArranger::get_objfn() double score = std::get<0>(result); auto& fullbb = std::get<1>(result); - - auto bin = m_bin; - sl::offset(bin, -EPSILON * (m_bin.width() + m_bin.height())); - double miss = Placer::overfit(fullbb, bin); + double miss = Placer::overfit(fullbb, m_bin); miss = miss > 0? miss : 0; - score += miss*miss; + score += miss * miss; return score; }; @@ -490,7 +485,7 @@ void _arrange( { // Integer ceiling the min distance from the bed perimeters coord_t md = params.min_obj_distance; - md = (md % 2) ? md / 2 + 1 : md / 2; + md = md / 2; auto corrected_bin = bin; sl::offset(corrected_bin, md); diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 7dfc0a726..b06b1f347 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -1846,7 +1846,7 @@ void ModelInstance::transform_polygon(Polygon* polygon) const arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const { - static const double SIMPLIFY_TOLERANCE_MM = 0.1; +// static const double SIMPLIFY_TOLERANCE_MM = 0.1; Vec3d rotation = get_rotation(); rotation.z() = 0.; @@ -1860,11 +1860,11 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const // this may happen for malformed models, see: // https://github.com/prusa3d/PrusaSlicer/issues/2209 - if (!p.points.empty()) { - Polygons pp{p}; - pp = p.simplify(scaled(SIMPLIFY_TOLERANCE_MM)); - if (!pp.empty()) p = pp.front(); - } +// if (!p.points.empty()) { +// Polygons pp{p}; +// pp = p.simplify(scaled(SIMPLIFY_TOLERANCE_MM)); +// if (!pp.empty()) p = pp.front(); +// } arrangement::ArrangePolygon ret; ret.poly.contour = std::move(p); diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index e97ba0764..ddfbca436 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -804,6 +804,10 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M BoundingBoxf3 print_volume(Vec3d(unscale(bed_box_2D.min(0)), unscale(bed_box_2D.min(1)), 0.0), Vec3d(unscale(bed_box_2D.max(0)), unscale(bed_box_2D.max(1)), config->opt_float("max_print_height"))); // Allow the objects to protrude below the print bed print_volume.min(2) = -1e10; + print_volume.min(0) -= BedEpsilon; + print_volume.min(1) -= BedEpsilon; + print_volume.max(0) += BedEpsilon; + print_volume.max(1) += BedEpsilon; ModelInstanceEPrintVolumeState state = ModelInstancePVS_Inside; diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 930f63c8e..ffca86077 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -611,6 +611,8 @@ struct _3DScene static void point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume); }; +static constexpr float BedEpsilon = EPSILON; + } #endif diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e634404a0..13a860ed6 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -4972,7 +4972,7 @@ void GLCanvas3D::_render_objects() const if (m_config != nullptr) { const BoundingBoxf3& bed_bb = wxGetApp().plater()->get_bed().get_bounding_box(false); - m_volumes.set_print_box((float)bed_bb.min(0), (float)bed_bb.min(1), 0.0f, (float)bed_bb.max(0), (float)bed_bb.max(1), (float)m_config->opt_float("max_print_height")); + m_volumes.set_print_box((float)bed_bb.min(0) - BedEpsilon, (float)bed_bb.min(1) - BedEpsilon, 0.0f, (float)bed_bb.max(0) + BedEpsilon, (float)bed_bb.max(1) + BedEpsilon, (float)m_config->opt_float("max_print_height")); m_volumes.check_outside_state(m_config, nullptr); } }