From 0ae46b06358ef878f98a840b6ffe3266304d2e17 Mon Sep 17 00:00:00 2001 From: Lukas Matena Date: Mon, 22 Jul 2019 13:25:17 +0200 Subject: [PATCH] SLA gizmo and undo/redo: 'autogenerated points' state is now correctly undone/redone --- src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp | 40 ++++++++++++++------ src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp | 2 + 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 8027906a9..6875a5b88 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -82,7 +82,9 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S editing_mode_reload_cache(); } - if (m_editing_mode_cache.empty() && m_model_object->sla_points_status != sla::PointsStatus::UserModified) + if (m_editing_mode_cache.empty() + && m_model_object->sla_points_status != sla::PointsStatus::UserModified + && m_model_object->sla_points_status != sla::PointsStatus::None) get_data_from_backend(); if (m_state == On) { @@ -1122,9 +1124,13 @@ void GLGizmoSlaSupports::on_start_dragging() void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) { + if (m_editing_mode) + editing_mode_discard_changes(); + ar(m_clipping_plane_distance, m_clipping_plane_normal, - m_current_mesh_object_id + m_current_mesh_object_id, + m_editing_mode_cache ); } @@ -1134,7 +1140,8 @@ void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const { ar(m_clipping_plane_distance, m_clipping_plane_normal, - m_current_mesh_object_id + m_current_mesh_object_id, + m_editing_mode_cache ); } @@ -1177,16 +1184,16 @@ void GLGizmoSlaSupports::editing_mode_discard_changes() // If the points were autogenerated, they may not be on the ModelObject yet. // Because the user probably messed with the cache, we will get the data // from the backend again. - - if (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated) + /*if (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated) { get_data_from_backend(); - else { - m_editing_mode_cache.clear(); - for (const sla::SupportPoint& point : m_model_object->sla_support_points) - m_editing_mode_cache.emplace_back(point, false); - } - m_editing_mode = false; - m_unsaved_changes = false; + } + else + editing_mode_reload_cache();*/ + + m_editing_mode_cache = m_old_cache; + + m_editing_mode = false; + m_unsaved_changes = false; } @@ -1196,7 +1203,13 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() // If there are no changes, don't touch the front-end. The data in the cache could have been // taken from the backend and copying them to ModelObject would needlessly invalidate them. if (m_unsaved_changes) { + // In order to make the undo/redo snapshot, we must first temporarily restore + // the editing cache to the state before the edits were made. + std::vector backup = m_editing_mode_cache; + m_editing_mode_cache = m_old_cache; wxGetApp().plater()->take_snapshot(_(L("Support points edit"))); + m_editing_mode_cache = std::move(backup); + m_model_object->sla_points_status = sla::PointsStatus::UserModified; m_model_object->sla_support_points.clear(); for (const CacheEntry& cache_entry : m_editing_mode_cache) @@ -1216,6 +1229,7 @@ void GLGizmoSlaSupports::editing_mode_apply_changes() void GLGizmoSlaSupports::editing_mode_reload_cache() { m_editing_mode_cache.clear(); + for (const sla::SupportPoint& point : m_model_object->sla_support_points) m_editing_mode_cache.emplace_back(point, false); @@ -1271,6 +1285,8 @@ void GLGizmoSlaSupports::switch_to_editing_mode() editing_mode_reload_cache(); m_unsaved_changes = false; m_editing_mode = true; + m_old_cache = m_editing_mode_cache; + select_point(NoPoints); } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index fbc438f1d..5ef1e6aea 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -98,6 +98,8 @@ private: float m_new_point_head_diameter; // Size of a new point. float m_minimal_point_distance = 20.f; mutable std::vector m_editing_mode_cache; // a support point and whether it is currently selected + std::vector m_old_cache; // to restore after discarding changes or undo/redo + float m_clipping_plane_distance = 0.f; mutable float m_old_clipping_plane_distance = 0.f; mutable Vec3d m_old_clipping_plane_normal;