From 799b0965f5fed77ef64ba76f01e033ca35e3ebbc Mon Sep 17 00:00:00 2001 From: YuSanka Date: Sat, 11 Nov 2023 12:50:41 +0800 Subject: [PATCH] Fix for prusa3d/PrusaSlicer#11487 - Cut Connectors Broken when assigning part to other side + Added check objects after cut + CutUtils: Ensuring that volumes start with solid parts after solid parts merging for proper slicing (cherry picked from commit prusa3d/PrusaSlicer@a9410edc2ccadf12f725cf96eaf9080b378797ca) --- src/libslic3r/CutUtils.cpp | 5 +++++ src/libslic3r/CutUtils.hpp | 2 -- src/slic3r/GUI/Gizmos/GLGizmoCut.cpp | 29 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/CutUtils.cpp b/src/libslic3r/CutUtils.cpp index 5d3ec25c34..cdda3097ac 100644 --- a/src/libslic3r/CutUtils.cpp +++ b/src/libslic3r/CutUtils.cpp @@ -395,6 +395,9 @@ static void distribute_modifiers_from_object(ModelObject* from_obj, const int in for (ModelVolume* vol : from_obj->volumes) if (!vol->is_model_part()) { + // Don't add modifiers which are processed connectors + if (vol->cut_info.is_connector && !vol->cut_info.is_processed) + continue; auto bb = vol->mesh().transformed_bounding_box(inst_matrix * vol->get_matrix()); // Don't add modifiers which are not intersecting with solid parts if (obj1_bb.intersects(bb)) @@ -425,6 +428,8 @@ static void merge_solid_parts_inside_object(ModelObjectPtrs& objects) if (mv->is_model_part() && !mv->is_cut_connector()) mo->delete_volume(i); } + // Ensuring that volumes start with solid parts for proper slicing + mo->sort_volumes(true); } } } diff --git a/src/libslic3r/CutUtils.hpp b/src/libslic3r/CutUtils.hpp index 4607489b27..5067aaaff1 100644 --- a/src/libslic3r/CutUtils.hpp +++ b/src/libslic3r/CutUtils.hpp @@ -65,8 +65,6 @@ public: }; // namespace Cut - - } // namespace Slic3r #endif /* slic3r_CutUtils_hpp_ */ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index cce7e9e9d0..c0267c9888 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -3290,6 +3290,32 @@ void update_object_cut_id(CutObjectBase& cut_id, ModelObjectCutAttributes attrib } } +static void check_objects_after_cut(const ModelObjectPtrs& objects) +{ + std::vector err_objects_names; + for (const ModelObject* object : objects) { + std::vector connectors_names; + connectors_names.reserve(object->volumes.size()); + for (const ModelVolume* vol : object->volumes) + if (vol->cut_info.is_connector) + connectors_names.push_back(vol->name); + const size_t connectors_count = connectors_names.size(); + sort_remove_duplicates(connectors_names); + if (connectors_count != connectors_names.size()) + err_objects_names.push_back(object->name); + } + if (err_objects_names.empty()) + return; + + wxString names = from_u8(err_objects_names[0]); + for (size_t i = 1; i < err_objects_names.size(); i++) + names += ", " + from_u8(err_objects_names[i]); + WarningDialog(wxGetApp().plater(), format_wxstr("Objects(%1%) have duplicated connectors. " + "Some connectors may be missing in slicing result.\n" + "Please report to PrusaSlicer team in which scenario this issue happened.\n" + "Thank you.", names)).ShowModal(); +} + void synchronize_model_after_cut(Model& model, const CutObjectBase& cut_id) { for (ModelObject* obj : model.objects) @@ -3354,6 +3380,9 @@ void GLGizmoCut3D::perform_cut(const Selection& selection) const ModelObjectPtrs& new_objects = cut_by_contour ? cut.perform_by_contour(m_part_selection.get_cut_parts(), dowels_count): cut_with_groove ? cut.perform_with_groove(m_groove, m_rotation_m) : cut.perform_with_plane(); + + check_objects_after_cut(new_objects); + // save cut_id to post update synchronization const CutObjectBase cut_id = cut_mo->cut_id;