diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 30745ab806..d43f1cf528 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -671,6 +671,9 @@ sub load_model_objects { # add a default instance and center object around origin $o->center_around_origin; # also aligns object to Z = 0 $o->add_instance(offset => $bed_centerf); + } else { + # if object has defined positions we still need to ensure it's aligned to Z = 0 + $o->align_to_ground; } { diff --git a/xs/src/libslic3r/Model.cpp b/xs/src/libslic3r/Model.cpp index 9182cf56b9..b1694190e3 100644 --- a/xs/src/libslic3r/Model.cpp +++ b/xs/src/libslic3r/Model.cpp @@ -597,6 +597,20 @@ ModelObject::instance_bounding_box(size_t instance_idx) const return bb; } +void +ModelObject::align_to_ground() +{ + // calculate the displacements needed to + // center this object around the origin + BoundingBoxf3 bb; + for (const ModelVolume* v : this->volumes) + if (!v->modifier) + bb.merge(v->mesh.bounding_box()); + + this->translate(0, 0, -bb.min.z); + this->origin_translation.translate(0, 0, -bb.min.z); +} + void ModelObject::center_around_origin() { diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index 9c8e0d1e20..1b6c6d6c20 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -149,6 +149,7 @@ class ModelObject TriangleMesh raw_mesh() const; BoundingBoxf3 raw_bounding_box() const; BoundingBoxf3 instance_bounding_box(size_t instance_idx) const; + void align_to_ground(); void center_around_origin(); void translate(const Vectorf3 &vector); void translate(coordf_t x, coordf_t y, coordf_t z); diff --git a/xs/xsp/Model.xsp b/xs/xsp/Model.xsp index c5c7006068..53f6cc8f3c 100644 --- a/xs/xsp/Model.xsp +++ b/xs/xsp/Model.xsp @@ -207,6 +207,7 @@ ModelMaterial::attributes() bool needed_repair() const; int materials_count() const; int facets_count(); + void align_to_ground(); void center_around_origin(); void translate(double x, double y, double z); void scale_xyz(Pointf3* versor)