Salome HOME
Issue #604 Creation of an unexpected line in the Sketcher
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintManager.cpp
index d6094199f576d0f12f44be87a050c514606b2051..4034c0b7e0558355b0f2f976e6ea753d8b8aa13b 100644 (file)
@@ -82,6 +82,9 @@ void SketchSolver_ConstraintManager::processEvent(
         std::dynamic_pointer_cast<ModelAPI_ObjectUpdatedMessage>(theMessage);
     std::set<ObjectPtr> aFeatures = anUpdateMsg->objects();
 
+    // Shows the message has at least one feature applicable for solver
+    bool hasProperFeature = false;
+
     bool isMovedEvt = theMessage->eventID()
         == Events_Loop::loop()->eventByName(EVENT_OBJECT_MOVED);
     if (isMovedEvt) {
@@ -89,8 +92,10 @@ void SketchSolver_ConstraintManager::processEvent(
       for (aFeatIter = aFeatures.begin(); aFeatIter != aFeatures.end(); aFeatIter++) {
         std::shared_ptr<SketchPlugin_Feature> aSFeature = 
             std::dynamic_pointer_cast<SketchPlugin_Feature>(*aFeatIter);
-        if (aSFeature)
+        if (aSFeature) {
           moveEntity(aSFeature);
+          hasProperFeature = true;
+        }
       }
     } else {
       std::set<ObjectPtr>::iterator aFeatIter;
@@ -103,7 +108,7 @@ void SketchSolver_ConstraintManager::processEvent(
         if (aFeatureKind.compare(SketchPlugin_Sketch::ID()) == 0) {
           std::shared_ptr<ModelAPI_CompositeFeature> aSketch = std::dynamic_pointer_cast<
               ModelAPI_CompositeFeature>(aFeature);
-          changeWorkplane(aSketch);
+          hasProperFeature = changeWorkplane(aSketch) || hasProperFeature;
         }
       }
       // then get anything but not the sketch
@@ -114,13 +119,13 @@ void SketchSolver_ConstraintManager::processEvent(
           std::dynamic_pointer_cast<SketchPlugin_Feature>(*aFeatIter);
         if (!aFeature)
           continue;
-        if (aFeature->getKind() == SketchPlugin_ConstraintFillet::ID() ||
-            aFeature->getKind() == SketchPlugin_ConstraintMirror::ID() ||
-            aFeature->getKind() == SketchPlugin_ConstraintTangent::ID()) {
+        if (aFeature->getKind() == SketchPlugin_ConstraintFillet::ID())
+          continue; // skip Fillet features
+        if (SketchSolver_Group::isComplexConstraint(aFeature)) {
           aComplexConstraints.insert(aFeature);
           continue;
         }
-        changeConstraintOrEntity(aFeature);
+        hasProperFeature = changeConstraintOrEntity(aFeature) || hasProperFeature;
       }
       // processing remain constraints
       aFeatIter = aComplexConstraints.begin();
@@ -129,12 +134,13 @@ void SketchSolver_ConstraintManager::processEvent(
           std::dynamic_pointer_cast<SketchPlugin_Feature>(*aFeatIter);
         if (!aFeature)
           continue;
-        changeConstraintOrEntity(aFeature);
+        hasProperFeature = changeConstraintOrEntity(aFeature) || hasProperFeature;
       }
     }
 
     // Solve the set of constraints
-    resolveConstraints(isMovedEvt); // send update for movement in any case
+    if (hasProperFeature)
+      resolveConstraints(isMovedEvt); // send update for movement in any case
   } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) {
     std::shared_ptr<ModelAPI_ObjectDeletedMessage> aDeleteMsg =
         std::dynamic_pointer_cast<ModelAPI_ObjectDeletedMessage>(theMessage);
@@ -337,7 +343,7 @@ std::shared_ptr<ModelAPI_CompositeFeature> SketchSolver_ConstraintManager
       continue;
 
     DataPtr aData = aWP->data();
-    if (aData) {
+    if (aData->isValid()) {
       std::shared_ptr<ModelAPI_AttributeRefList> aWPFeatures = std::dynamic_pointer_cast<
           ModelAPI_AttributeRefList>(aData->attribute(SketchPlugin_Sketch::FEATURES_ID()));
       std::list<ObjectPtr> aFeaturesList = aWPFeatures->list();