]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Avoid crash opening a study (issue #1032)
authorazv <azv@opencascade.com>
Wed, 30 Sep 2015 07:48:34 +0000 (10:48 +0300)
committerazv <azv@opencascade.com>
Wed, 30 Sep 2015 07:48:34 +0000 (10:48 +0300)
Rebuild the entity if it was removed by storage.

src/SketchSolver/SketchSolver_Constraint.cpp
src/SketchSolver/SketchSolver_Group.cpp

index 187a7cae59dc96e422ac19407bd4a2732080047d..11cdff04bb22f3a64ba17e97d661ef9ce38d2a12 100644 (file)
@@ -647,15 +647,16 @@ Slvs_hEntity SketchSolver_Constraint::getId(FeaturePtr theFeature) const
   std::map<FeaturePtr, Slvs_hEntity>::const_iterator aFIter = myFeatureMap.find(theFeature);
   if (aFIter == myFeatureMap.end())
     return SLVS_E_UNKNOWN;
-  // check the Feature is really in the storage
-  Slvs_Entity anEntity = myStorage->getEntity(aFIter->second);
-  if (anEntity.h == SLVS_E_UNKNOWN) {
-    // rebuild feature
-    int aType;
-    anEntity.h = const_cast<SketchSolver_Constraint*>(this)->changeEntity(aFIter->first, aType);
-    const_cast<SketchSolver_Constraint*>(this)->myFeatureMap[theFeature] = anEntity.h;
-  }
-  return anEntity.h;
+  //// check the Feature is really in the storage
+  //Slvs_Entity anEntity = myStorage->getEntity(aFIter->second);
+  //if (anEntity.h == SLVS_E_UNKNOWN) {
+  //  // rebuild feature
+  //  int aType;
+  //  anEntity.h = const_cast<SketchSolver_Constraint*>(this)->changeEntity(aFIter->first, aType);
+  //  const_cast<SketchSolver_Constraint*>(this)->myFeatureMap[theFeature] = anEntity.h;
+  //}
+  //return anEntity.h;
+  return aFIter->second;
 }
 
 Slvs_hEntity SketchSolver_Constraint::getId(AttributePtr theAttribute) const
index b767b3bb8bcd00b8870d57afa21edc335c222500..5a9652fe6955ae404f23f248f5d8da9605bf81c3 100644 (file)
@@ -138,6 +138,15 @@ bool SketchSolver_Group::isInteract(
   return myFeatureStorage->isInteract(std::dynamic_pointer_cast<ModelAPI_Feature>(theFeature));
 }
 
+// check the entity is really exists
+static void checkEntity(StoragePtr theStorage, Slvs_hEntity& theEntity)
+{
+  if (theEntity == SLVS_E_UNKNOWN)
+    return;
+  Slvs_Entity anEnt = theStorage->getEntity(theEntity);
+  theEntity = anEnt.h;
+}
+
 // ============================================================================
 //  Function: getFeatureId
 //  Class:    SketchSolver_Group
@@ -152,13 +161,16 @@ Slvs_hEntity SketchSolver_Group::getFeatureId(FeaturePtr theFeature) const
   ConstraintConstraintMap::const_iterator aCIter = myConstraints.begin();
   for (; aCIter != myConstraints.end(); ++aCIter) {
     aResult = aCIter->second->getId(theFeature);
+    checkEntity(myStorage, aResult);
     if (aResult != SLVS_E_UNKNOWN)
       return aResult;
   }
   // The feature is not found, check it in the temporary constraints
   std::set<SolverConstraintPtr>::iterator aTmpCIter = myTempConstraints.begin();
-  for (; aTmpCIter != myTempConstraints.end() && aResult == SLVS_E_UNKNOWN; ++aTmpCIter)
+  for (; aTmpCIter != myTempConstraints.end() && aResult == SLVS_E_UNKNOWN; ++aTmpCIter) {
     aResult = (*aTmpCIter)->getId(theFeature);
+    checkEntity(myStorage, aResult);
+  }
   return aResult;
 }
 
@@ -176,18 +188,23 @@ Slvs_hEntity SketchSolver_Group::getAttributeId(AttributePtr theAttribute) const
   ConstraintConstraintMap::const_iterator aCIter = myConstraints.begin();
   for (; aCIter != myConstraints.end(); ++aCIter) {
     aResult = aCIter->second->getId(theAttribute);
+    checkEntity(myStorage, aResult);
     if (aResult != SLVS_E_UNKNOWN)
       return aResult;
   }
   // The attribute is not found, check it in the temporary constraints
   std::set<SolverConstraintPtr>::const_iterator aTmpCIter = myTempConstraints.begin();
-  for (; aTmpCIter != myTempConstraints.end() && aResult == SLVS_E_UNKNOWN; ++aTmpCIter)
+  for (; aTmpCIter != myTempConstraints.end() && aResult == SLVS_E_UNKNOWN; ++aTmpCIter) {
     aResult = (*aTmpCIter)->getId(theAttribute);
+    checkEntity(myStorage, aResult);
+  }
   // Last chance to find attribute in parametric constraints
   std::map<AttributePtr, SolverConstraintPtr>::const_iterator aParIter =
       myParametricConstraints.find(theAttribute);
-  if (aParIter != myParametricConstraints.end())
+  if (aParIter != myParametricConstraints.end()) {
     aResult = aParIter->second->getId(theAttribute);
+    checkEntity(myStorage, aResult);
+  }
   return aResult;
 }