From 221af991c2474a8f382042b667269e3346dab25e Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 14 May 2021 11:52:33 +0200 Subject: [PATCH 1/3] Fixed update of PrintRegions after removing an object. The bug has been introduced during recent PrintRegion refactoring. --- src/libslic3r/PrintApply.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index f0e262fdc..c906a0041 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -372,6 +372,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ std::set model_object_status; // 1) Synchronize model objects. + bool print_regions_reshuffled = false; if (model.id() != m_model.id()) { // Kill everything, initialize from scratch. // Stop background processing. @@ -383,6 +384,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ delete object; } m_objects.clear(); + print_regions_reshuffled = true; m_model.assign_copy(model); for (const ModelObject *model_object : m_model.objects) model_object_status.emplace(model_object->id(), ModelObjectStatus::New); @@ -462,6 +464,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ } for (ModelObject *model_object : model_objects_old) delete model_object; + print_regions_reshuffled = true; } } } @@ -595,7 +598,6 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ } // 4) Generate PrintObjects from ModelObjects and their instances. - bool print_regions_reshuffled = false; { PrintObjectPtrs print_objects_new; print_objects_new.reserve(std::max(m_objects.size(), m_model.objects.size())); From 2b9e41e6955f2bdf5a1a498bb96f6173a4780ee1 Mon Sep 17 00:00:00 2001 From: Vojtech Bubnik Date: Fri, 14 May 2021 14:57:41 +0200 Subject: [PATCH 2/3] Fix of a special case in auto color print feature, which crashed with single layer PrintObjects. Fixes Segmentation fault (GLib-GObject null pointer) #6516 --- src/slic3r/GUI/GUI_Preview.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 52223b3d4..769ab3f59 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -661,31 +661,32 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee // if it's sign, than object have not to be a too height double height = object->height(); coord_t longer_side = std::max(object_x, object_y); - if (height / longer_side > 0.3) + auto num_layers = int(object->layers().size()); + if (height / longer_side > 0.3 || num_layers < 2) continue; const ExPolygons& bottom = object->get_layer(0)->lslices; double bottom_area = area(bottom); // at least 30% of object's height have to be a solid - size_t i; - for (i = 1; i < size_t(0.3 * object->layers().size()); i++) { + int i; + for (i = 1; i < int(0.3 * num_layers); ++ i) { double cur_area = area(object->get_layer(i)->lslices); if (cur_area != bottom_area && fabs(cur_area - bottom_area) > scale_(scale_(1))) break; } - if (i < size_t(0.3 * object->layers().size())) + if (i < size_t(0.3 * num_layers)) continue; // bottom layer have to be a biggest, so control relation between bottom layer and object size double prev_area = area(object->get_layer(i)->lslices); - for ( i++; i < object->layers().size(); i++) { + for ( i++; i < num_layers; i++) { double cur_area = area(object->get_layer(i)->lslices); if (cur_area > prev_area && prev_area - cur_area > scale_(scale_(1))) break; prev_area = cur_area; } - if (i < object->layers().size()) + if (i < num_layers) continue; double top_area = area(object->get_layer(int(object->layers().size()) - 1)->lslices); From ca14ea4c33a0cb368e7bf4dc1576c80900882e24 Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Fri, 14 May 2021 15:02:54 +0200 Subject: [PATCH 3/3] Tech ENABLE_ALLOW_NEGATIVE_Z -> ModelObject::convex_hull_2d() and sequential_print_horizontal_clearance_valid() modified to take in account for sinking instances --- src/libslic3r/Model.cpp | 10 ++++++++-- src/libslic3r/Print.cpp | 12 +++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index a02eb738b..2a5f73645 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -901,13 +901,19 @@ Polygon ModelObject::convex_hull_2d(const Transform3d &trafo_instance) const for (const stl_facet &facet : stl.facet_start) for (size_t j = 0; j < 3; ++ j) { Vec3d p = trafo * facet.vertex[j].cast(); - pts.emplace_back(coord_t(scale_(p.x())), coord_t(scale_(p.y()))); +#if ENABLE_ALLOW_NEGATIVE_Z + if (p.z() >= 0.0) +#endif // ENABLE_ALLOW_NEGATIVE_Z + pts.emplace_back(coord_t(scale_(p.x())), coord_t(scale_(p.y()))); } } else { // Using the shared vertices should be a bit quicker than using the STL faces. for (size_t i = 0; i < its.vertices.size(); ++ i) { Vec3d p = trafo * its.vertices[i].cast(); - pts.emplace_back(coord_t(scale_(p.x())), coord_t(scale_(p.y()))); +#if ENABLE_ALLOW_NEGATIVE_Z + if (p.z() >= 0.0) +#endif // ENABLE_ALLOW_NEGATIVE_Z + pts.emplace_back(coord_t(scale_(p.x())), coord_t(scale_(p.y()))); } } } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 538ee6009..99119f566 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -371,6 +371,15 @@ static inline bool sequential_print_horizontal_clearance_valid(const Print &prin // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) // which causes that the warning will be showed after arrangement with the // appropriate object distance. Even if I set this to jtMiter the warning still shows up. +#if ENABLE_ALLOW_NEGATIVE_Z + it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, + offset(print_object->model_object()->convex_hull_2d( + Geometry::assemble_transform({ 0.0, 0.0, model_instance0->get_offset().z() }, model_instance0->get_rotation(), model_instance0->get_scaling_factor(), model_instance0->get_mirror())), + // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects + // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. + float(scale_(0.5 * print.config().extruder_clearance_radius.value - EPSILON)), + jtRound, float(scale_(0.1))).front()); +#else it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, offset(print_object->model_object()->convex_hull_2d( Geometry::assemble_transform(Vec3d::Zero(), model_instance0->get_rotation(), model_instance0->get_scaling_factor(), model_instance0->get_mirror())), @@ -378,7 +387,8 @@ static inline bool sequential_print_horizontal_clearance_valid(const Print &prin // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. float(scale_(0.5 * print.config().extruder_clearance_radius.value - EPSILON)), jtRound, float(scale_(0.1))).front()); - } +#endif // ENABLE_ALLOW_NEGATIVE_Z + } // Make a copy, so it may be rotated for instances. Polygon convex_hull0 = it_convex_hull->second; double z_diff = Geometry::rotation_diff_z(model_instance0->get_rotation(), print_object->instances().front().model_instance->get_rotation());