diff --git a/src/Mod/Sketcher/App/Sketch.cpp b/src/Mod/Sketcher/App/Sketch.cpp
index 02a555903..b8a9594ea 100644
--- a/src/Mod/Sketcher/App/Sketch.cpp
+++ b/src/Mod/Sketcher/App/Sketch.cpp
@@ -2186,6 +2186,7 @@ int Sketch::solve(void)
GCSsys.undoSolution();
updateGeometry();
Base::Console().Warning("Invalid solution from %s solver.\n", solvername.c_str());
+ ret = GCS::SuccessfulSolutionInvalid;
}else
{
updateNonDrivingConstraints();
diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp
index 802b9c1ee..472c1241a 100644
--- a/src/Mod/Sketcher/App/SketchObject.cpp
+++ b/src/Mod/Sketcher/App/SketchObject.cpp
@@ -141,6 +141,9 @@ App::DocumentObjectExecReturn *SketchObject::execute(void)
lastConflicting=solvedSketch.getConflicting();
lastRedundant=solvedSketch.getRedundant();
+ lastSolveTime=0.0;
+ lastSolverStatus=GCS::Failed; // Failure is default for notifying the user unless otherwise proven
+
solverNeedsUpdate=false;
if (lastDoF < 0) { // over-constrained sketch
@@ -211,8 +214,14 @@ int SketchObject::solve(bool updateGeoAfterSolving/*=true*/)
err = -3;
else {
lastSolverStatus=solvedSketch.solve();
- if (lastSolverStatus != 0) // solving
+ if (lastSolverStatus != 0){ // solving
err = -2;
+ // if solver failed, geometry was never updated, but invalid constraints were likely added before
+ // solving (see solve in addConstraint), so solver information is definitely invalid.
+ this->Constraints.touch();
+
+ }
+
}
lastHasRedundancies = solvedSketch.hasRedundancies();
diff --git a/src/Mod/Sketcher/App/planegcs/GCS.h b/src/Mod/Sketcher/App/planegcs/GCS.h
index 9f29afec3..0363361e3 100644
--- a/src/Mod/Sketcher/App/planegcs/GCS.h
+++ b/src/Mod/Sketcher/App/planegcs/GCS.h
@@ -39,9 +39,10 @@ namespace GCS
///////////////////////////////////////
enum SolveStatus {
- Success = 0, // Found a solution zeroing the error function
- Converged = 1, // Found a solution minimizing the error function
- Failed = 2 // Failed to find any solution
+ Success = 0, // Found a solution zeroing the error function
+ Converged = 1, // Found a solution minimizing the error function
+ Failed = 2, // Failed to find any solution
+ SuccessfulSolutionInvalid = 3, // This is a solution where the solver succeeded, but the resulting geometry is OCE-invalid
};
enum Algorithm {
diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp
index 1452a0b09..6135cb39b 100644
--- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp
+++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp
@@ -4374,10 +4374,10 @@ void ViewProviderSketch::UpdateSolverInformation()
signalSetUp(tr("Under-constrained sketch with %1 degrees of freedom").arg(dofs));
}
- signalSolved(tr("Solved in %1 sec").arg(getSketchObject()->getLastSolveTime()));
+ signalSolved(QString::fromLatin1("%1").arg(tr("Solved in %1 sec").arg(getSketchObject()->getLastSolveTime())));
}
else {
- signalSolved(tr("Unsolved (%1 sec)").arg(getSketchObject()->getLastSolveTime()));
+ signalSolved(QString::fromLatin1("%1").arg(tr("Unsolved (%1 sec)").arg(getSketchObject()->getLastSolveTime())));
}
}
}