From 5d55f091d02049e73b67dfb5d0547df17abf8e1e Mon Sep 17 00:00:00 2001 From: forbes Date: Sat, 21 Feb 2026 09:59:04 -0600 Subject: [PATCH] fix(assembly): update flip-detection baseline during drag steps During drag operations, validateNewPlacements() compared each solver result against the pre-drag positions saved once in preDrag(). As the user dragged further, the cumulative rotation from that fixed baseline easily exceeded the 91-degree threshold, causing valid intermediate results to be rejected with 'flipped orientation' warnings and making parts appear to explode. Fix: call savePlacementsForUndo() after each accepted drag step so that the flip check compares against the last accepted state rather than the original pre-drag origin. --- src/Mod/Assembly/App/AssemblyObject.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index 6902acd44b..f9a3d30821 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -509,6 +509,14 @@ void AssemblyObject::doDragStep() if (validateNewPlacements()) { setNewPlacements(); + // Update the baseline positions after each accepted drag step so that + // the orientation-flip check in validateNewPlacements() compares against + // the last accepted state rather than the pre-drag origin. Without this, + // cumulative rotation during a long drag easily exceeds the 91-degree + // threshold and causes the solver result to be rejected ("flipped + // orientation"), making parts appear to explode. + savePlacementsForUndo(); + auto joints = getJoints(false); for (auto* joint : joints) { if (joint->Visibility.getValue()) {