diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index 6902acd44b..a8c498cffa 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -275,8 +275,14 @@ void AssemblyObject::updateSolveStatus() //+1 because there's a grounded joint to origin lastDoF = (1 + numberOfComponents()) * 6; - if (!solver_ || lastResult_.placements.empty()) { + // Guard against re-entrancy: solve() calls updateSolveStatus(), so if + // placements are legitimately empty (e.g. zero constraints / all parts + // grounded) the recursive solve() would never terminate. + static bool updating = false; + if (!updating && (!solver_ || lastResult_.placements.empty())) { + updating = true; solve(); + updating = false; } if (!solver_) {