From fc128d357d2a0bbfd720b1316764f14c3b71c8f8 Mon Sep 17 00:00:00 2001 From: Abdullah Tahiri Date: Mon, 5 Oct 2015 17:24:03 +0200 Subject: [PATCH] Sketcher: Solver information: Bug fix ===================================== When the solver converged (but did not succeed) or when the solver succeded but the solution is not OCC-valid, no error message was shown in the solver messages dialog. --- src/Mod/Sketcher/App/Sketch.cpp | 1 + src/Mod/Sketcher/App/SketchObject.cpp | 11 ++++++++++- src/Mod/Sketcher/App/planegcs/GCS.h | 7 ++++--- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 4 ++-- 4 files changed, 17 insertions(+), 6 deletions(-) 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()))); } } }