Salome HOME
Constriction type for all sketch entities
[modules/shaper.git] / src / SketchSolver / SketchSolver_ConstraintGroup.cpp
index 050c262b53cf04746afce0a2d9eae8c5ddde9cb8..3cb51724764bb3d49f163e25583e4cb04aa9a209 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
 // File:    SketchSolver_ConstraintGroup.cpp
 // Created: 27 May 2014
 // Author:  Artem ZHIDKOV
 /// Tolerance for value of parameters
 const double tolerance = 1.e-10;
 
-/*
+/**
  * Collects all sketch solver error' codes
  * as inline static functions
- * TODO: Move this class into a separate file
  */
+ // TODO: Move this class into a separate file
 class SketchSolver_Error
 {
  public:
@@ -287,7 +289,7 @@ bool SketchSolver_ConstraintGroup::changeConstraint(
     // For the length constraint the start and end points of the line should be added to the entities list instead of line
     if (aConstrType == SLVS_C_PT_PT_DISTANCE
         && theConstraint->getKind().compare(SketchPlugin_ConstraintLength::ID()) == 0) {
-      Slvs_hEntity aLineEnt = changeEntity(aFeature);
+      Slvs_hEntity aLineEnt = changeEntityFeature(aFeature);
       int aEntPos = Search(aLineEnt, myEntities);
       aConstrEnt[indAttr++] = myEntities[aEntPos].point[0];
       aConstrEnt[indAttr++] = myEntities[aEntPos].point[1];
@@ -295,7 +297,7 @@ bool SketchSolver_ConstraintGroup::changeConstraint(
         aConstrEnt[indAttr++] = 0;
       break;  // there should be no other entities
     } else if (aConstrAttr->isObject())
-      aConstrEnt[indAttr] = changeEntity(aFeature);
+      aConstrEnt[indAttr] = changeEntityFeature(aFeature);
     else
       aConstrEnt[indAttr] = changeEntity(aConstrAttr->attr());
   }
@@ -432,7 +434,7 @@ bool SketchSolver_ConstraintGroup::changeRigidConstraint(
     aFeature = aDoc->feature(aRC);
   }
 
-  aConstrEnt = aConstrAttr->isObject() ? changeEntity(aFeature) : changeEntity(aConstrAttr->attr());
+  aConstrEnt = aConstrAttr->isObject() ? changeEntityFeature(aFeature) : changeEntity(aConstrAttr->attr());
 
   if (aConstrMapIter == myConstraintMap.end()) { // Add new constraint
     // Check the fixed entity is not a point.
@@ -646,7 +648,7 @@ Slvs_hEntity SketchSolver_ConstraintGroup::changeEntity(
 //  Class:    SketchSolver_ConstraintGroup
 //  Purpose:  create/update the element defined by the feature affected by any constraint
 // ============================================================================
-Slvs_hEntity SketchSolver_ConstraintGroup::changeEntity(FeaturePtr theEntity)
+Slvs_hEntity SketchSolver_ConstraintGroup::changeEntityFeature(FeaturePtr theEntity)
 {
   if (!theEntity->data()->isValid())
     return SLVS_E_UNKNOWN;
@@ -895,9 +897,17 @@ bool SketchSolver_ConstraintGroup::resolveConstraints()
     // We should go through the attributes map, because only attributes have valued parameters
     std::map<std::shared_ptr<ModelAPI_Attribute>, Slvs_hEntity>::iterator anEntIter =
         myEntityAttrMap.begin();
-    for (; anEntIter != myEntityAttrMap.end(); anEntIter++)
+    for (; anEntIter != myEntityAttrMap.end(); anEntIter++) {
+      if (anEntIter->first->owner().get() && anEntIter->first->owner()->data().get())
+        anEntIter->first->owner()->data()->blockSendAttributeUpdated(true);
       if (updateAttribute(anEntIter->first, anEntIter->second))
         updateRelatedConstraints(anEntIter->first);
+    }
+    // unblock all features then
+    for (anEntIter = myEntityAttrMap.begin(); anEntIter != myEntityAttrMap.end(); anEntIter++) {
+      if (anEntIter->first->owner().get() && anEntIter->first->owner()->data().get())
+        anEntIter->first->owner()->data()->blockSendAttributeUpdated(false);
+    }
   } else if (!myConstraints.empty())
     Events_Error::send(SketchSolver_Error::CONSTRAINTS(), this);
 
@@ -1527,7 +1537,7 @@ void SketchSolver_ConstraintGroup::updateRelatedConstraints(
   }
 }
 
-void SketchSolver_ConstraintGroup::updateRelatedConstraints(
+void SketchSolver_ConstraintGroup::updateRelatedConstraintsFeature(
     std::shared_ptr<ModelAPI_Feature> theFeature) const
 {
   ConstraintMap::const_iterator aConstrIter = myConstraintMap.begin();