Salome HOME
Fix for the issue #593: do not remove naming attribute, but use TNaming_Builder for...
[modules/shaper.git] / src / SketchSolver / SketchSolver_Constraint.cpp
index d5c3bbb5a0f6b421cf827f9bd354df085717469a..27f7b76d1a58f726fb9290fbafe377a17b768268 100644 (file)
@@ -277,6 +277,11 @@ void SketchSolver_Constraint::cleanRemovedEntities()
     std::map<AttributePtr, Slvs_hParam>::iterator aTmpIter = aValIt++;
     myValueMap.erase(aTmpIter);
   }
+  for (size_t i = 0; i < mySlvsConstraints.size(); i++)
+    if (aRemovedConstraints.find(mySlvsConstraints[i]) != aRemovedConstraints.end()) {
+      mySlvsConstraints.erase(mySlvsConstraints.begin() + i);
+      i--;
+    }
 }
 
 void SketchSolver_Constraint::getAttributes(
@@ -564,11 +569,16 @@ void SketchSolver_Constraint::refresh()
 {
   cleanErrorMsg();
   std::map<AttributePtr, Slvs_hEntity>::iterator anAttrIter = myAttributeMap.begin();
-  for (; anAttrIter != myAttributeMap.end(); anAttrIter++) {
+  while (anAttrIter != myAttributeMap.end()) {
     std::shared_ptr<GeomDataAPI_Point> aPoint =
         std::dynamic_pointer_cast<GeomDataAPI_Point>(anAttrIter->first);
+    Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second);
+    if (anEntity.h == SLVS_E_UNKNOWN) {
+      std::map<AttributePtr, Slvs_hEntity>::iterator aTmpIter = anAttrIter++;
+      myAttributeMap.erase(aTmpIter);
+      continue;
+    }
     if (aPoint) {
-      Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second);
       double aXYZ[3];
       for (int i = 0; i < 3; i++) {
         Slvs_Param aPar = myStorage->getParameter(anEntity.param[i]);
@@ -583,7 +593,6 @@ void SketchSolver_Constraint::refresh()
       std::shared_ptr<GeomDataAPI_Point2D> aPoint2D =
           std::dynamic_pointer_cast<GeomDataAPI_Point2D>(anAttrIter->first);
       if (aPoint2D) {
-        Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second);
         double aXY[2];
         for (int i = 0; i < 2; i++) {
           Slvs_Param aPar = myStorage->getParameter(anEntity.param[i]);
@@ -597,13 +606,13 @@ void SketchSolver_Constraint::refresh()
         AttributeDoublePtr aScalar =
             std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(anAttrIter->first);
         if (aScalar) {
-          Slvs_Entity anEntity = myStorage->getEntity(anAttrIter->second);
           Slvs_Param aPar = myStorage->getParameter(anEntity.param[0]);
           if (fabs(aScalar->value() - aPar.val) > tolerance)
             aScalar->setValue(aPar.val);
         }
       }
     }
+    anAttrIter++;
   }
 
   std::map<AttributePtr, Slvs_hParam>::iterator aValIter = myValueMap.begin();