diff --git a/xs/src/libslic3r/Format/3mf.cpp b/xs/src/libslic3r/Format/3mf.cpp index b92d969df..b34b8989e 100644 --- a/xs/src/libslic3r/Format/3mf.cpp +++ b/xs/src/libslic3r/Format/3mf.cpp @@ -572,6 +572,9 @@ namespace Slic3r { } } + // fixes the min z of the model if negative + model.adjust_min_z(); + return true; } diff --git a/xs/src/libslic3r/Model.cpp b/xs/src/libslic3r/Model.cpp index 1de99bbf8..f394e553c 100644 --- a/xs/src/libslic3r/Model.cpp +++ b/xs/src/libslic3r/Model.cpp @@ -409,6 +409,25 @@ void Model::convert_multipart_object() this->objects.push_back(object); } +void Model::adjust_min_z() +{ + if (objects.empty()) + return; + + if (bounding_box().min.z < 0.0) + { + for (ModelObject* obj : objects) + { + if (obj != nullptr) + { + coordf_t obj_min_z = obj->bounding_box().min.z; + if (obj_min_z < 0.0) + obj->translate(0.0, 0.0, -obj_min_z); + } + } + } +} + ModelObject::ModelObject(Model *model, const ModelObject &other, bool copy_volumes) : name(other.name), input_file(other.input_file), @@ -671,7 +690,10 @@ void ModelObject::transform(const float* matrix3x4) v->mesh.transform(matrix3x4); } - origin_translation = Pointf3(0.0f, 0.0f, 0.0f); +//##################################################################################################### + origin_translation = Pointf3(0.0, 0.0, 0.0); +// origin_translation = Pointf3(0.0f, 0.0f, 0.0f); +//##################################################################################################### invalidate_bounding_box(); } diff --git a/xs/src/libslic3r/Model.hpp b/xs/src/libslic3r/Model.hpp index cf9bfd85a..d3faf38ef 100644 --- a/xs/src/libslic3r/Model.hpp +++ b/xs/src/libslic3r/Model.hpp @@ -273,6 +273,9 @@ public: bool looks_like_multipart_object() const; void convert_multipart_object(); + // Ensures that the min z of the model is not negative + void adjust_min_z(); + void print_info() const { for (const ModelObject *o : this->objects) o->print_info(); } };