From f2c712a68850291847ad05e677f9cee453ffea9c Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Thu, 14 Mar 2024 17:52:42 +0800 Subject: [PATCH] FIX:fix bug of toggle_selection by right click Jira: STUDIO-6511 Change-Id: I24efc6462c97902890bdd1b73ae6005cb3b6d958 --- src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp | 22 +++++++++++++++++++- src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp index 777ffa21f..dcb2ada77 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.cpp @@ -573,6 +573,9 @@ void GLGizmoAdvancedCut::on_start_dragging() void GLGizmoAdvancedCut::on_stop_dragging() { + if (m_is_dragging ==false) { + return; + } m_is_dragging = false; if (m_hover_id == X || m_hover_id == Y || m_hover_id == Z) { Plater::TakeSnapshot snapshot(wxGetApp().plater(), "Rotate cut plane"); @@ -867,7 +870,7 @@ void GLGizmoAdvancedCut::perform_cut(const Selection& selection) }); const bool cut_with_groove = m_cut_mode == CutMode::cutTongueAndGroove; - bool cut_by_contour = false;//!cut_with_groove && !m_cut_to_parts && m_part_selection->valid(); + bool cut_by_contour = !cut_with_groove && m_part_selection->valid() && m_part_selection->has_modified_cut_parts(); ModelObject *cut_mo = cut_by_contour ? m_part_selection->model_object() : nullptr; if (cut_mo) @@ -2577,6 +2580,10 @@ PartSelection::PartSelection( i++; } + m_back_cut_parts_state.resize(m_cut_parts.size()); + for (size_t i = 0; i < m_cut_parts.size(); i++) { + m_back_cut_parts_state[i] = m_cut_parts[i].is_up_part; + } // Now go through the contours and create a map from contours to parts. m_contour_points.clear(); m_contour_to_parts.clear(); @@ -2687,6 +2694,19 @@ std::vector PartSelection::get_cut_parts() return parts; } +bool PartSelection::has_modified_cut_parts() +{ + if (m_back_cut_parts_state.size() == 0 || m_back_cut_parts_state.size() != m_cut_parts.size()) { + return false; + } + for (size_t i = 0; i < m_cut_parts.size(); i++) { + if (m_back_cut_parts_state[i] != m_cut_parts[i].is_up_part) { + return true; + } + } + return false; +} + void PartSelection::toggle_selection(const Vec2d &mouse_pos) { const Camera &camera = wxGetApp().plater()->get_camera(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp index 4d76e6284..01b16aa61 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoAdvancedCut.hpp @@ -51,11 +51,13 @@ public: std::vector get_cut_parts(); std::vector &get_parts() { return m_cut_parts; } + bool has_modified_cut_parts(); private: Model m_model; int m_instance_idx; std::vector m_cut_parts; + std::vector m_back_cut_parts_state; bool m_valid = false; std::vector, std::vector>> m_contour_to_parts; // for each contour, there is a vector of parts above and a vector of parts below std::vector m_ignored_contours; // contour that should not be rendered (the parts on both sides will both be parts of the same object)