FIX:fix bug of toggle_selection by right click

Jira: STUDIO-6511
Change-Id: I24efc6462c97902890bdd1b73ae6005cb3b6d958
This commit is contained in:
zhou.xu 2024-03-14 17:52:42 +08:00 committed by Lane.Wei
parent 94f62f7389
commit f2c712a688
2 changed files with 23 additions and 1 deletions

View File

@ -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<Cut::Part> 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();

View File

@ -51,11 +51,13 @@ public:
std::vector<Cut::Part> get_cut_parts();
std::vector<PartPara> &get_parts() { return m_cut_parts; }
bool has_modified_cut_parts();
private:
Model m_model;
int m_instance_idx;
std::vector<PartPara> m_cut_parts;
std::vector<bool> m_back_cut_parts_state;
bool m_valid = false;
std::vector<std::pair<std::vector<size_t>, std::vector<size_t>>> m_contour_to_parts; // for each contour, there is a vector of parts above and a vector of parts below
std::vector<size_t> m_ignored_contours; // contour that should not be rendered (the parts on both sides will both be parts of the same object)