diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index a8c498cffa..a06fa04c14 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -515,6 +515,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()) {