From f2beebc21433da538eb947700030d81320e8cd28 Mon Sep 17 00:00:00 2001 From: Calcousin55 Date: Sun, 31 May 2026 09:16:06 -0700 Subject: [PATCH] =?UTF-8?q?Preserve=20Z=20scale=20and=20apply=20correct=20?= =?UTF-8?q?offset=20when=20Ctrl=E2=80=91dragging=20XY=20corner=20(#13840)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/slic3r/GUI/Gizmos/GLGizmoScale.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index 244ed2a238..77fc7ef46c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -448,7 +448,29 @@ void GLGizmoScale3D::do_scale_uniform(const UpdateData& data) if (ratio > 0.0) { m_scale = m_starting.scale * ratio; - m_offset = Vec3d::Zero(); + if (m_starting.ctrl_down && abs(ratio-1.0f)>0.001) { + m_scale.z() = m_starting.scale.z(); + double local_offset_x = 0.5 * (m_scale.x() - m_starting.scale.x()) * m_starting.box.size().x(); + double local_offset_y = 0.5 * (m_scale.y() - m_starting.scale.y()) * m_starting.box.size().y(); + + Vec3d local_offset_vec = Vec3d::Zero(); + switch (m_hover_id) + { + case 6: { local_offset_vec = Vec3d(-local_offset_x, -local_offset_y, 0.0); break; } + case 7: { local_offset_vec = Vec3d( local_offset_x, -local_offset_y, 0.0); break; } + case 8: { local_offset_vec = Vec3d( local_offset_x, local_offset_y, 0.0); break; } + case 9: { local_offset_vec = Vec3d(-local_offset_x, local_offset_y, 0.0); break; } + default: break; + } + + if (m_object_manipulation->is_world_coordinates()) { + m_offset = local_offset_vec; + } else { + m_offset = m_grabbers_tran.get_matrix_no_offset() * local_offset_vec; + } + } else { + m_offset = Vec3d::Zero(); + } } }