From dbae2f6305ded3d8d856aab3d83ecc6ce787d385 Mon Sep 17 00:00:00 2001 From: Filip Sykala Date: Wed, 11 May 2022 13:56:34 +0200 Subject: [PATCH] Serialization of text configuration for UndoRedo stack --- src/libslic3r/Model.hpp | 9 +-- src/libslic3r/TextConfiguration.hpp | 87 +++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 17 deletions(-) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index d2609c6709..4ebbef1b92 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -864,6 +864,7 @@ private: cereal::load_by_value(ar, seam_facets); cereal::load_by_value(ar, mmu_segmentation_facets); cereal::load_by_value(ar, config); + cereal::load(ar, text_configuration); assert(m_mesh); if (has_convex_hull) { cereal::load_optional(ar, m_convex_hull); @@ -872,11 +873,6 @@ private: this->calculate_convex_hull(); } else m_convex_hull.reset(); - //TextConfiguration tc; - //cereal::load_by_value(ar, tc); - //if (tc.font_item.type != FontItem::Type::undefined) { - // text_configuration = tc; - //} } template void save(Archive &ar) const { bool has_convex_hull = m_convex_hull.get() != nullptr; @@ -885,10 +881,9 @@ private: cereal::save_by_value(ar, seam_facets); cereal::save_by_value(ar, mmu_segmentation_facets); cereal::save_by_value(ar, config); + cereal::save(ar, text_configuration); if (has_convex_hull) cereal::save_optional(ar, m_convex_hull); - //if (text_configuration.has_value()) - // cereal::save_by_value(ar, *text_configuration); } }; diff --git a/src/libslic3r/TextConfiguration.hpp b/src/libslic3r/TextConfiguration.hpp index 53b76acd1e..b612a4c2d5 100644 --- a/src/libslic3r/TextConfiguration.hpp +++ b/src/libslic3r/TextConfiguration.hpp @@ -4,8 +4,43 @@ #include #include #include +#include +#include +#include +#include #include "Point.hpp" // Transform3d +// Serialization through the Cereal library +namespace cereal { + // Eigen Matrix 4x4 serialization + template void serialize(Archive &ar, ::Slic3r::Matrix4d &m){ + ar(binary_data(m.data(), 4*4*sizeof(double))); + } + + // !!! create duplicit implementation + // General solution for Eigen matrix serialization + //template inline typename std::enable_if, Archive>::value, void>::type + //save(Archive & ar, Eigen::PlainObjectBase const & m){ + // typedef Eigen::PlainObjectBase ArrT; + // if(ArrT::RowsAtCompileTime==Eigen::Dynamic) ar(m.rows()); + // if(ArrT::ColsAtCompileTime==Eigen::Dynamic) ar(m.cols()); + // ar(binary_data(m.data(),m.size()*sizeof(typename Derived::Scalar))); + //} + //template inline typename std::enable_if, Archive>::value, void>::type + //load(Archive & ar, Eigen::PlainObjectBase & m){ + // typedef Eigen::PlainObjectBase ArrT; + // Eigen::Index rows=ArrT::RowsAtCompileTime, cols=ArrT::ColsAtCompileTime; + // if(rows==Eigen::Dynamic) ar(rows); + // if(cols==Eigen::Dynamic) ar(cols); + // m.resize(rows,cols); + // ar(binary_data(m.data(),static_cast(rows*cols*sizeof(typename Derived::Scalar)))); + //} + + // Eigen Transformation serialization + template inline void + serialize(Archive & ar, Eigen::Transform& t){ ar(t.matrix()); } +} + namespace Slic3r { /// @@ -108,10 +143,36 @@ struct FontProp } // undo / redo stack recovery - //template void serialize(Archive &ar) - //{ - // ar(char_gap, line_gap, emboss, boldness, skew, size_in_mm, family, face_name, style, weight); - //} + template void save(Archive &ar) const + { + ar(emboss, use_surface, size_in_mm); + cereal::save(ar, char_gap); + cereal::save(ar, line_gap); + cereal::save(ar, boldness); + cereal::save(ar, skew); + cereal::save(ar, distance); + cereal::save(ar, angle); + cereal::save(ar, collection_number); + cereal::save(ar, family); + cereal::save(ar, face_name); + cereal::save(ar, style); + cereal::save(ar, weight); + } + template void load(Archive &ar) + { + ar(emboss, use_surface, size_in_mm); + cereal::load(ar, char_gap); + cereal::load(ar, line_gap); + cereal::load(ar, boldness); + cereal::load(ar, skew); + cereal::load(ar, distance); + cereal::load(ar, angle); + cereal::load(ar, collection_number); + cereal::load(ar, family); + cereal::load(ar, face_name); + cereal::load(ar, style); + cereal::load(ar, weight); + } }; /// @@ -162,11 +223,10 @@ struct FontItem ; } - //// undo / redo stack recovery - //template void serialize(Archive &ar) - //{ - // ar(name, path, (int) type, prop); - //} + // undo / redo stack recovery + template void serialize(Archive &ar){ + ar(name, path, (int) type, prop); + } }; // Font item name inside list is unique @@ -194,7 +254,14 @@ struct TextConfiguration std::optional fix_3mf_tr; // undo / redo stack recovery - //template void serialize(Archive &ar){ ar(text, font_item); } + template void save(Archive &ar) const{ + ar(text, font_item); + cereal::save(ar, fix_3mf_tr); + } + template void load(Archive &ar){ + ar(text, font_item); + cereal::load(ar, fix_3mf_tr); + } }; } // namespace Slic3r