FIX: auto arranging gets wrong object height

obj->bounding_box().size() is not the real object size if the object has been rotated.

jira: STUDIO-5999
Change-Id: I6553d4c990696efd674e3e57063802127d5d5282
(cherry picked from commit 479ea9fb02f55d24f27c94633f3d852bd5c62c83)
This commit is contained in:
Arthur 2024-04-02 09:29:49 +08:00 committed by Lane.Wei
parent 5a63200c02
commit eb50f3ee58
5 changed files with 15 additions and 10 deletions

View File

@ -1436,11 +1436,15 @@ BoundingBoxf3 ModelObject::instance_bounding_box(const ModelInstance& instance,
//BBS: add convex bounding box
BoundingBoxf3 ModelObject::instance_convex_hull_bounding_box(size_t instance_idx, bool dont_translate) const
{
return instance_convex_hull_bounding_box(this->instances[instance_idx], dont_translate);
}
BoundingBoxf3 ModelObject::instance_convex_hull_bounding_box(const ModelInstance* instance, bool dont_translate) const
{
BoundingBoxf3 bb;
const Transform3d& inst_matrix = this->instances[instance_idx]->get_transformation().get_matrix(dont_translate);
for (ModelVolume *v : this->volumes)
{
const Transform3d& inst_matrix = instance->get_transformation().get_matrix(dont_translate);
for (ModelVolume* v : this->volumes) {
if (v->is_model_part())
bb.merge(v->get_convex_hull().transformed_bounding_box(inst_matrix * v->get_matrix()));
}

View File

@ -449,6 +449,7 @@ public:
//BBS: add instance convex hull bounding box
BoundingBoxf3 instance_convex_hull_bounding_box(size_t instance_idx, bool dont_translate = false) const;
BoundingBoxf3 instance_convex_hull_bounding_box(const ModelInstance* instance, bool dont_translate = false) const;
// Calculate 2D convex hull of of a projection of the transformed printable volumes into the XY plane.
// This method is cheap in that it does not make any unnecessary copy of the volume meshes.

View File

@ -176,7 +176,8 @@ ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const Slic3r::
ap.has_tree_support = true;
}
ap.height = obj->bounding_box().size().z();
auto size = obj->instance_convex_hull_bounding_box(instance).size();
ap.height = size.z();
ap.name = obj->name;
return ap;
}

View File

@ -502,18 +502,17 @@ void ArrangeJob::check_unprintable()
if (it->poly.area() < 0.001 || it->height>params.printable_height)
{
#if SAVE_ARRANGE_POLY
SVG svg("SVG/arrange_unprintable_"+it->name+".svg", get_extents(it->poly));
SVG svg(data_dir() + "/SVG/arrange_unprintable_"+it->name+".svg", get_extents(it->poly));
if (svg.is_opened())
svg.draw_outline(it->poly);
#endif
m_unprintable.push_back(*it);
it = m_selected.erase(it);
if (it->poly.area() < 0.001) {
auto msg = (boost::format(_u8L("Object %1% has zero size and can't be arranged.")) % it->name).str();
m_plater->get_notification_manager()->push_notification(NotificationType::BBLPlateInfo,
NotificationManager::NotificationLevel::WarningNotificationLevel, msg);
}
m_unprintable.push_back(*it);
it = m_selected.erase(it);
}
else
it++;

View File

@ -2987,7 +2987,7 @@ void Selection::paste_objects_from_clipboard()
if (src_objects.size() > 1) {
BoundingBoxf3 bbox_all;
for (const ModelObject *src_object : src_objects) {
BoundingBoxf3 bbox = src_object->instance_convex_hull_bounding_box(0);
BoundingBoxf3 bbox = src_object->instance_convex_hull_bounding_box(size_t(0));
bbox_all.merge(bbox);
}
auto bsize = bbox_all.size();
@ -3003,7 +3003,7 @@ void Selection::paste_objects_from_clipboard()
ModelObject* dst_object = m_model->add_object(*src_object);
// BBS: find an empty cell to put the copied object
BoundingBoxf3 bbox = src_object->instance_convex_hull_bounding_box(0);
BoundingBoxf3 bbox = src_object->instance_convex_hull_bounding_box(size_t(0));
Vec3d displacement;
bool in_current = plate->intersects(bbox);