diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 91b4a2855..2d57d5eb7 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1700,8 +1700,10 @@ void GLCanvas3D::Selection::flattening_rotate(const Vec3d& normal) } #if !DISABLE_INSTANCES_SYNCH + // we want to synchronize z-rotation as well, otherwise the flattening behaves funny + // when applied on one of several identical instances if (m_mode == Instance) - _synchronize_unselected_instances(); + _synchronize_unselected_instances(true); #endif // !DISABLE_INSTANCES_SYNCH m_bounding_box_dirty = true; @@ -1911,7 +1913,6 @@ void GLCanvas3D::Selection::erase() { items.emplace_back(ItemType::itInstance, i.first, i.second); } - wxGetApp().obj_list()->delete_from_model_and_list(items); } else if (is_mixed()) @@ -2573,7 +2574,7 @@ void GLCanvas3D::Selection::_render_sidebar_size_hint(Axis axis, double length) } #endif // ENABLE_SIDEBAR_VISUAL_HINTS -void GLCanvas3D::Selection::_synchronize_unselected_instances() +void GLCanvas3D::Selection::_synchronize_unselected_instances(bool including_z) { std::set done; // prevent processing volumes twice done.insert(m_list.begin(), m_list.end()); @@ -2606,7 +2607,7 @@ void GLCanvas3D::Selection::_synchronize_unselected_instances() if ((v->object_idx() != object_idx) || (v->instance_idx() == instance_idx)) continue; - v->set_instance_rotation(Vec3d(rotation(0), rotation(1), v->get_instance_rotation()(2))); + v->set_instance_rotation(Vec3d(rotation(0), rotation(1), including_z ? rotation(2) : v->get_instance_rotation()(2))); v->set_instance_scaling_factor(scaling_factor); v->set_instance_mirror(mirror); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index c2f2074c1..63a4edbef 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -597,7 +597,7 @@ public: void _render_sidebar_scale_hint(Axis axis) const; void _render_sidebar_size_hint(Axis axis, double length) const; #endif // ENABLE_SIDEBAR_VISUAL_HINTS - void _synchronize_unselected_instances(); + void _synchronize_unselected_instances(bool including_z = false); void _synchronize_unselected_volumes(); #if ENABLE_ENSURE_ON_BED_WHILE_SCALING void _ensure_on_bed();