From fb91232d104058221776e67df7da5001fed0bc6a Mon Sep 17 00:00:00 2001 From: bubnikv Date: Wed, 27 Feb 2019 10:31:53 +0100 Subject: [PATCH] Fix of Model is marked as defective after opening project #1863 Fixes SPE-613 --- src/libslic3r/Format/3mf.cpp | 9 ++++++++- src/libslic3r/Format/AMF.cpp | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 47f78b360..014e9e606 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -6,6 +6,8 @@ #include "3mf.hpp" +#include + #include #include #include @@ -1749,6 +1751,11 @@ namespace Slic3r { bool _3MF_Exporter::_add_model_file_to_archive(mz_zip_archive& archive, Model& model) { std::stringstream stream; + // https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10 + // Conversion of a floating-point value to text and back is exact as long as at least max_digits10 were used (9 for float, 17 for double). + // It is guaranteed to produce the same floating-point value, even though the intermediate text representation is not exact. + // The default value of std::stream precision is 6 digits only! + stream << std::defaultfloat << std::setprecision(std::numeric_limits::max_digits10); stream << "\n"; stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n"; stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "\n"; @@ -1864,7 +1871,7 @@ namespace Slic3r { for (int i = 0; i < stl.stats.shared_vertices; ++i) { stream << " <" << VERTEX_TAG << " "; - Vec3d v = matrix * stl.v_shared[i].cast(); + Vec3f v = (matrix * stl.v_shared[i].cast()).cast(); stream << "x=\"" << v(0) << "\" "; stream << "y=\"" << v(1) << "\" "; stream << "z=\"" << v(2) << "\" />\n"; diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 2f5284db9..d7b41362c 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -856,6 +857,11 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) return false; std::stringstream stream; + // https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10 + // Conversion of a floating-point value to text and back is exact as long as at least max_digits10 were used (9 for float, 17 for double). + // It is guaranteed to produce the same floating-point value, even though the intermediate text representation is not exact. + // The default value of std::stream precision is 6 digits only! + stream << std::defaultfloat << std::setprecision(std::numeric_limits::max_digits10); stream << "\n"; stream << "\n"; stream << "Slic3r " << SLIC3R_VERSION << "\n"; @@ -927,7 +933,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) for (size_t i = 0; i < stl.stats.shared_vertices; ++i) { stream << " \n"; stream << " \n"; - Vec3d v = matrix * stl.v_shared[i].cast(); + Vec3f v = (matrix * stl.v_shared[i].cast()).cast(); stream << " " << v(0) << "\n"; stream << " " << v(1) << "\n"; stream << " " << v(2) << "\n";