Salome HOME
Pipe validator fix
[modules/shaper.git] / src / SketchSolver / SketchSolver_Manager.cpp
index 39662623da538a0f816f2691a3e83a96b3db62bf..453fbf5fc15b4eb6e5d29bed13a888fcf3666a35 100644 (file)
@@ -5,6 +5,7 @@
 // Author:  Artem ZHIDKOV
 
 #include "SketchSolver_Manager.h"
+#include "SketchSolver_Error.h"
 
 #include <Events_Loop.h>
 #include <ModelAPI_AttributeDouble.h>
@@ -58,6 +59,9 @@ SketchSolver_Manager::SketchSolver_Manager()
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED));
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED));
   Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_MOVED));
+
+  Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_SOLVER_FAILED));
+  Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_SOLVER_REPAIRED));
 }
 
 SketchSolver_Manager::~SketchSolver_Manager()
@@ -82,6 +86,7 @@ BuilderPtr SketchSolver_Manager::builder()
 void SketchSolver_Manager::processEvent(
   const std::shared_ptr<Events_Message>& theMessage)
 {
+  checkConflictingConstraints(theMessage);
   if (myIsComputed)
     return;
   myIsComputed = true;
@@ -163,8 +168,8 @@ void SketchSolver_Manager::processEvent(
         }
         if (!(*aGroupIter)->isConsistent()) {  // some constraints were removed, try to split the group
           (*aGroupIter)->splitGroup(aSeparatedGroups);
-          if (!(*aGroupIter)->getWorkplane()->string(
-              SketchPlugin_Sketch::SOLVER_ERROR())->value().empty())
+          //if (!(*aGroupIter)->getWorkplane()->string(
+          //    SketchPlugin_Sketch::SOLVER_ERROR())->value().empty())
             aGroupsToResolve.push_back(*aGroupIter);
         }
         aGroupIter++;
@@ -182,6 +187,41 @@ void SketchSolver_Manager::processEvent(
   myIsComputed = false;
 }
 
+void SketchSolver_Manager::checkConflictingConstraints(const std::shared_ptr<Events_Message>& theMessage)
+{
+  if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_SOLVER_REPAIRED)) {
+    std::shared_ptr<ModelAPI_SolverFailedMessage> aMessage =
+        std::dynamic_pointer_cast<ModelAPI_SolverFailedMessage>(theMessage);
+    std::set<ObjectPtr> aSentObjs = aMessage->objects();
+    if (!aSentObjs.empty()) {
+      // Obtain sketch where the constraints are placed.
+      // It is enough to check only one constraint.
+      CompositeFeaturePtr aSketch;
+      FeaturePtr aConstraint = ModelAPI_Feature::feature(*aSentObjs.begin());
+      std::list<SketchSolver_Group*>::const_iterator aGrIt = myGroups.begin();
+      for (; aGrIt != myGroups.end(); ++aGrIt)
+        if ((*aGrIt)->isInteract(aConstraint)) {
+          aSketch = (*aGrIt)->getWorkplane();
+          break;
+        }
+
+      // Search failed groups built on the same sketch
+      if (aSketch) {
+        for (aGrIt = myGroups.begin(); aGrIt != myGroups.end(); ++aGrIt) {
+          SketchSolver_Group* aGroup = *aGrIt;
+          if (aGroup->isBaseWorkplane(aSketch) && aGroup->isFailed() &&
+              !aGroup->isInteract(aConstraint)) {
+            // reset error message on the sketch
+            aGroup->getWorkplane()->string(SketchPlugin_Sketch::SOLVER_ERROR())->setValue(
+                SketchSolver_Error::CONSTRAINTS());
+            break;
+          }
+        }
+      }
+    }
+  }
+}
+
 // ============================================================================
 //  Function: changeWorkplane
 //  Purpose:  update workplane by given parameters of the sketch