From a86e7107a5d4549cf313c4097f87c309c3ff4d2c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 9 Feb 2021 17:04:32 +0100 Subject: [PATCH] Added check for loaded STL file if it was saved in meters. Related to #4521 (Some files are imported in the wrong size) --- src/libslic3r/Model.cpp | 23 +++++++++++++++++++++++ src/libslic3r/Model.hpp | 2 ++ src/slic3r/GUI/Plater.cpp | 13 ++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index c25026cc4..a07708669 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -472,6 +472,29 @@ void Model::convert_from_imperial_units(bool only_small_volumes) } } +bool Model::looks_like_saved_in_meters() const +{ + if (this->objects.size() == 0) + return false; + + for (ModelObject* obj : this->objects) + if (obj->get_object_stl_stats().volume < 0.001) // 0.001 = 0.1*0.1*0.1; + return true; + + return false; +} + +void Model::convert_from_meters(bool only_small_volumes) +{ + double m_to_mm = 1000; + for (ModelObject* obj : this->objects) + if (! only_small_volumes || obj->get_object_stl_stats().volume < 0.001) { // 0.001 = 0.1*0.1*0.1; + obj->scale_mesh_after_creation(Vec3d(m_to_mm, m_to_mm, m_to_mm)); + for (ModelVolume* v : obj->volumes) + v->source.is_converted_from_inches = true; + } +} + void Model::adjust_min_z() { if (objects.empty()) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 99db132f6..b06ecf527 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -1019,6 +1019,8 @@ public: void convert_multipart_object(unsigned int max_extruders); bool looks_like_imperial_units() const; void convert_from_imperial_units(bool only_small_volumes); + bool looks_like_saved_in_meters() const; + void convert_from_meters(bool only_small_volumes); // Ensures that the min z of the model is not negative void adjust_min_z(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8ca335fa8..9912e7aa0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2415,13 +2415,24 @@ std::vector Plater::priv::load_files(const std::vector& input_ auto convert_from_imperial_units = [](Model& model, bool only_small_volumes) { model.convert_from_imperial_units(only_small_volumes); // wxGetApp().app_config->set("use_inches", "1"); - wxGetApp().sidebar().update_ui_from_settings(); +// wxGetApp().sidebar().update_ui_from_settings(); }; if (!is_project_file) { if (imperial_units) // Convert even if the object is big. convert_from_imperial_units(model, false); + else if (model.looks_like_saved_in_meters()) { + wxMessageDialog msg_dlg(q, format_wxstr(_L_PLURAL( + "The object in file %s looks like saved in meters.\n" + "Should I consider it as a saved in meters and convert it?", + "Some objects in file %s look like saved in meters.\n" + "Should I consider them as a saved in meters and convert them?", model.objects.size()), from_path(filename)) + "\n", + _L("The object appears to be saved in meters"), wxICON_WARNING | wxYES | wxNO); + if (msg_dlg.ShowModal() == wxID_YES) + //FIXME up-scale only the small parts? + model.convert_from_meters(true); + } else if (model.looks_like_imperial_units()) { wxMessageDialog msg_dlg(q, format_wxstr(_L_PLURAL( "The object in file %s looks like saved in inches.\n"