From 09e140cf199f2a1f1ae0426b13c95f78aa0f4283 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 28 Sep 2024 18:46:35 +0200 Subject: [PATCH] Core: Fix resetting placement of transformed image The restored Euler angles of a rotation may significantly differ from the input Euler angles so that determining the plane isn't very reliable. To get the plane reliably multiply (0,0,1) with the rotation and use this as reference normal of the plane. --- src/Gui/TaskView/TaskImage.cpp | 44 ++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/Gui/TaskView/TaskImage.cpp b/src/Gui/TaskView/TaskImage.cpp index 27ef04949c..c3fad9ceca 100644 --- a/src/Gui/TaskView/TaskImage.cpp +++ b/src/Gui/TaskView/TaskImage.cpp @@ -288,6 +288,9 @@ void TaskImage::onPreview() // NOLINTNEXTLINE void TaskImage::restoreAngles(const Base::Rotation& rot) { + Base::Vector3d vec(0, 0, 1); + rot.multVec(vec, vec); + double yaw {}; double pitch {}; double roll {}; @@ -300,32 +303,49 @@ void TaskImage::restoreAngles(const Base::Rotation& rot) const double angle2 = 180.0; auto isTopOrBottom = [=](bool& reverse) { - if (fabs(pitch) < tol && (fabs(roll) < tol || fabs(roll - angle2) < tol)) { - if (fabs(roll - angle2) < tol) { - reverse = true; - } + if (std::fabs(vec.z - 1.0) < tol) { + return true; + } + if (std::fabs(vec.z + 1.0) < tol) { + reverse = true; return true; } return false; }; - auto isFrontOrRear = [=](bool& reverse) { - if (fabs(roll - angle1) < tol && (fabs(yaw) < tol || fabs(yaw - angle2) < tol)) { - if (fabs(yaw - angle2) < tol) { - reverse = true; + + auto isFrontOrRear = [&](bool& reverse) { + if (std::fabs(vec.y + 1.0) < tol) { + if (std::fabs(yaw - angle2) < tol) { + pitch = -angle2 - pitch; } return true; } + if (std::fabs(vec.y - 1.0) < tol) { + if (std::fabs(yaw) < tol) { + pitch = -angle2 - pitch; + } + reverse = true; + return true; + } return false; }; - auto isRightOrLeft = [=](bool& reverse) { - if (fabs(roll - angle1) < tol && (fabs(yaw - angle1) < tol || fabs(yaw + angle1) < tol)) { - if (fabs(yaw + angle1) < tol) { - reverse = true; + + auto isRightOrLeft = [&](bool& reverse) { + if (std::fabs(vec.x - 1.0) < tol) { + if (std::fabs(yaw + angle1) < tol) { + pitch = -angle2 - pitch; } return true; } + if (std::fabs(vec.x + 1.0) < tol) { + if (std::fabs(yaw - angle1) < tol) { + pitch = -angle2 - pitch; + } + reverse = true; + return true; + } return false; };