diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 7ebcbd815d..e56a4b6e10 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -983,6 +983,16 @@ void ModelObject::mirror(Axis axis) this->invalidate_bounding_box(); } +void ModelObject::scale_mesh(const Vec3d &versor) +{ + for (ModelVolume *v : this->volumes) + { + v->scale_geometry(versor); + v->set_offset(versor.cwiseProduct(v->get_offset())); + } + this->invalidate_bounding_box(); +} + size_t ModelObject::materials_count() const { std::set material_ids; @@ -1514,6 +1524,12 @@ void ModelVolume::mirror(Axis axis) #endif // ENABLE_MODELVOLUME_TRANSFORM } +void ModelVolume::scale_geometry(const Vec3d& versor) +{ + mesh.scale(versor); + m_convex_hull.scale(versor); +} + #if !ENABLE_MODELVOLUME_TRANSFORM void ModelInstance::set_rotation(const Vec3d& rotation) { diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index b396bd1db9..c26eb0f7a7 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -237,6 +237,9 @@ public: void rotate(double angle, Axis axis); void rotate(double angle, const Vec3d& axis); void mirror(Axis axis); + + void scale_mesh(const Vec3d& versor); + size_t materials_count() const; size_t facets_count() const; bool needed_repair() const; @@ -331,6 +334,8 @@ public: void rotate(double angle, const Vec3d& axis); void mirror(Axis axis); + void scale_geometry(const Vec3d& versor); + #if ENABLE_MODELVOLUME_TRANSFORM // translates the mesh and the convex hull so that the origin of their vertices is in the center of this volume's bounding box void center_geometry(); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a261e7e05a..118fb41c86 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1494,7 +1494,7 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode #if !ENABLE_MODELVOLUME_TRANSFORM const Vec3d bed_center = Slic3r::to_3d(bed_shape.center().cast(), 0.0); #endif // !ENABLE_MODELVOLUME_TRANSFORM - const Vec3d bed_size = Slic3r::to_3d(bed_shape.size().cast(), 1.0); + const Vec3d bed_size = Slic3r::to_3d(bed_shape.size().cast(), 1.0) - 2.0 * Vec3d::Ones(); bool need_arrange = false; bool scaled_down = false; @@ -1527,7 +1527,9 @@ std::vector Plater::priv::load_model_objects(const ModelObjectPtrs &mode // the size of the object is too big -> this could lead to overflow when moving to clipper coordinates, // so scale down the mesh double inv = 1. / max_ratio; - object->scale(Vec3d(inv, inv, inv)); + object->scale_mesh(Vec3d(inv, inv, inv)); + object->origin_translation = Vec3d::Zero(); + object->center_around_origin(); scaled_down = true; } else if (max_ratio > 5) { const Vec3d inverse = ratio.cwiseInverse();