From c1179de25afacb17c4b0041597b9b2bc59d46efa Mon Sep 17 00:00:00 2001 From: "zhou.xu" Date: Mon, 18 Nov 2024 09:19:39 +0800 Subject: [PATCH] FIX:"split to parts" should consider scale_det jira: STUDIO-8789 Change-Id: Id1b224f9e5dc2666fc4364fccde0cd79eb164f05 --- src/libslic3r/Model.cpp | 4 ++-- src/libslic3r/Model.hpp | 2 +- src/libslic3r/TriangleMesh.cpp | 11 ++++++----- src/libslic3r/TriangleMesh.hpp | 4 ++-- src/slic3r/GUI/GUI_ObjectList.cpp | 9 +++++---- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 82328083c..f0ff09589 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -3241,10 +3241,10 @@ std::string ModelVolume::type_to_string(const ModelVolumeType t) // Split this volume, append the result to the object owning this volume. // Return the number of volumes created from this one. // This is useful to assign different materials to different volumes of an object. -size_t ModelVolume::split(unsigned int max_extruders) +size_t ModelVolume::split(unsigned int max_extruders, float scale_det) { std::vector> ships; - std::vector meshes = this->mesh().split_and_save_relationship(ships); + std::vector meshes = this->mesh().split_and_save_relationship(ships, scale_det); if (meshes.size() <= 1) return 1; if (meshes.size() != ships.size()) diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 5cc4b4e7d..5b5bcfc36 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -959,7 +959,7 @@ public: // Split this volume, append the result to the object owning this volume. // Return the number of volumes created from this one. // This is useful to assign different materials to different volumes of an object. - size_t split(unsigned int max_extruders); + size_t split(unsigned int max_extruders, float scale_det = 1.f); void translate(double x, double y, double z) { translate(Vec3d(x, y, z)); } void translate(const Vec3d& displacement); void scale(const Vec3d& scaling_factors); diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 006d9fe16..a597648f1 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -386,8 +386,8 @@ bool TriangleMesh::is_splittable() const { return its_is_splittable(this->its); } - -std::vector TriangleMesh::split() const +const float MIN_MESH_VOLUME = 1e-2f; +std::vector TriangleMesh::split(float scale_det) const { std::vector itss = its_split(this->its); std::vector out; @@ -395,7 +395,7 @@ std::vector TriangleMesh::split() const for (indexed_triangle_set &m : itss) { // The TriangleMesh constructor shall fill in the mesh statistics including volume. TriangleMesh temp_triangle_mesh(std::move(m)); - if (abs(temp_triangle_mesh.volume()< 0.01)) {//0.01mm^3 + if (abs(temp_triangle_mesh.volume() * scale_det) < MIN_MESH_VOLUME) { continue; } if (temp_triangle_mesh.volume() < 0) {// Some source mesh parts may be incorrectly oriented. Correct them. @@ -406,7 +406,8 @@ std::vector TriangleMesh::split() const return out; } -std::vector TriangleMesh::split_and_save_relationship(std::vector> &result) const { +std::vector TriangleMesh::split_and_save_relationship(std::vector> &result, float scale_det) const +{ auto itss_and_ships = its_split_and_save_relationship<>(this->its); std::vector out; out.reserve(itss_and_ships.itses.size()); @@ -415,7 +416,7 @@ std::vector TriangleMesh::split_and_save_relationship(std::vector< for (indexed_triangle_set &m : itss_and_ships.itses) { // The TriangleMesh constructor shall fill in the mesh statistics including volume. TriangleMesh temp_triangle_mesh(std::move(m)); - if (abs(temp_triangle_mesh.volume() < 0.01)) { // 0.01mm^3 + if (abs(temp_triangle_mesh.volume() * scale_det) < MIN_MESH_VOLUME) { index++; continue; } diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 4b1a7a0e5..cdb4cf9f4 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -118,8 +118,8 @@ public: void flip_triangles(); void align_to_origin(); void rotate(double angle, Point* center); - std::vector split() const; - std::vector split_and_save_relationship(std::vector> &result) const; + std::vector split(float scale_det = 1.f) const; + std::vector split_and_save_relationship(std::vector> &result, float scale_det = 1.f) const; void merge(const TriangleMesh &mesh); ExPolygons horizontal_projection() const; // 2D convex hull of a 3D mesh projected into the Z=0 plane. diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 9ce64b1e8..9f40cb7ca 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -2695,12 +2695,13 @@ void ObjectList::split() } take_snapshot("Split to parts"); - - volume->split(filament_cnt); - wxBusyCursor wait; + auto model_object = (*m_objects)[obj_idx]; + auto world_tran = model_object->instances[0]->get_transformation().get_matrix() * volume->get_matrix(); + float scale_det = std::fabs(world_tran.matrix().block(0, 0, 3, 3).determinant()); + volume->split(filament_cnt, scale_det); + - auto model_object = (*m_objects)[obj_idx]; auto parent = m_objects_model->GetObject(item); if (parent)