]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Update the procedure of removing entities not used by constraints (issue #883)
authorazv <azv@opencascade.com>
Wed, 2 Sep 2015 11:27:22 +0000 (14:27 +0300)
committerazv <azv@opencascade.com>
Wed, 2 Sep 2015 11:28:28 +0000 (14:28 +0300)
src/SketchSolver/SketchSolver_Storage.cpp

index 30d3f57905551faa703ae689f382d382172cec61..6dce96f4c83120ad36f172bb12c388d0be34176f 100644 (file)
@@ -225,7 +225,33 @@ void SketchSolver_Storage::removeUnusedEntities()
   }
 
   std::set<Slvs_hEntity>::const_iterator anEntIt = anUnusedEntities.begin();
-  for (; anEntIt != anUnusedEntities.end(); ++anEntIt) {
+  while (anEntIt != anUnusedEntities.end()) {
+    int aPos = Search(*anEntIt, myEntities);
+    if (aPos < 0 && aPos >= (int)myEntities.size())
+      continue;
+    Slvs_Entity anEntity = myEntities[aPos];
+    // Remove entity if and only if all its parameters unused
+    bool isUsed = false;
+    if (anEntity.distance != SLVS_E_UNKNOWN && 
+      anUnusedEntities.find(anEntity.distance) == anUnusedEntities.end())
+      isUsed = true;
+    for (int i = 0; i < 4 && !isUsed; i++)
+      if (anEntity.point[i] != SLVS_E_UNKNOWN &&
+          anUnusedEntities.find(anEntity.point[i]) == anUnusedEntities.end())
+        isUsed = true;
+    if (isUsed) {
+      anUnusedEntities.erase(anEntity.distance);
+      for (int i = 0; i < 4; i++)
+        if (anEntity.point[i] != SLVS_E_UNKNOWN)
+          anUnusedEntities.erase(anEntity.point[i]);
+      std::set<Slvs_hEntity>::iterator aRemoveIt = anEntIt++;
+      anUnusedEntities.erase(aRemoveIt);
+      continue;
+    }
+    ++anEntIt;
+  }
+
+  for (anEntIt = anUnusedEntities.begin(); anEntIt != anUnusedEntities.end(); ++anEntIt) {
     int aPos = Search(*anEntIt, myEntities);
     if (aPos >= 0 && aPos < (int)myEntities.size()) {
       // Remove entity and its parameters