]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
SketchSolver performance improvement (issue #934)
authorazv <azv@opencascade.com>
Wed, 9 Sep 2015 12:05:33 +0000 (15:05 +0300)
committerazv <azv@opencascade.com>
Wed, 9 Sep 2015 12:06:06 +0000 (15:06 +0300)
src/SketchSolver/SketchSolver_ConstraintMovement.cpp
src/SketchSolver/SketchSolver_Storage.cpp
src/SketchSolver/SketchSolver_Storage.h

index d5b96bf33b8d778c559920469218f531b9eb0db4..3cceeeaaa9b0ce4ef6e3fd33c78e7d17e0ca4c85 100644 (file)
@@ -93,5 +93,19 @@ void SketchSolver_ConstraintMovement::getAttributes(
          theIsFullyMoved = false;
      }
   }
+
+  // Leave only points which are used in constraints
+  if (myStorage->isUsedByConstraints(anEntityID))
+    return;
+  std::vector<Slvs_hEntity>::iterator anIt = theAttributes.begin();
+  while (anIt != theAttributes.end()) {
+    if (myStorage->isUsedByConstraints(*anIt))
+      ++anIt;
+    else {
+      int aShift = anIt - theAttributes.begin();
+      theAttributes.erase(anIt);
+      anIt = theAttributes.begin() + aShift;
+    }
+  }
 }
 
index 6dce96f4c83120ad36f172bb12c388d0be34176f..c599c3fbba771667a9f06f28fb18be0afc3ade55 100644 (file)
@@ -59,7 +59,8 @@ Slvs_hParam SketchSolver_Storage::updateParameter(const Slvs_Param& theParam)
     // parameter already used, rewrite it
     int aPos = Search(theParam.h, myParameters);
     if (aPos >= 0 && aPos < (int)myParameters.size()) {
-      myNeedToResolve = myNeedToResolve || IsNotEqual(myParameters[aPos], theParam);
+      if (IsNotEqual(myParameters[aPos], theParam))
+        myUpdatedParameters.insert(theParam.h);
       myParameters[aPos] = theParam;
       return theParam.h;
     }
@@ -276,6 +277,21 @@ void SketchSolver_Storage::removeUnusedEntities()
     myNeedToResolve = true;
 }
 
+bool SketchSolver_Storage::isUsedByConstraints(const Slvs_hEntity& theEntityID) const
+{
+  std::vector<Slvs_Constraint>::const_iterator aCIt = myConstraints.begin();
+  for (; aCIt != myConstraints.end(); ++aCIt) {
+    Slvs_hEntity aSubs[6] = {
+        aCIt->entityA, aCIt->entityB,
+        aCIt->entityC, aCIt->entityD,
+        aCIt->ptA,     aCIt->ptB};
+    for (int i = 0; i < 6; i++)
+      if (aSubs[i] != SLVS_E_UNKNOWN && aSubs[i] == theEntityID)
+        return true;
+  }
+  return false;
+}
+
 const Slvs_Entity& SketchSolver_Storage::getEntity(const Slvs_hEntity& theEntityID) const
 {
   int aPos = Search(theEntityID, myEntities);
@@ -1066,6 +1082,48 @@ bool SketchSolver_Storage::isUsedInEqual(
   return false;
 }
 
+bool SketchSolver_Storage::isNeedToResolve()
+{
+  if (myConstraints.empty())
+    return false;
+
+  if (!myNeedToResolve) {
+    // Verify the updated parameters are used in constraints
+    std::set<Slvs_hEntity> aPoints;
+    std::vector<Slvs_Entity>::const_iterator anEntIt = myEntities.begin();
+    for (; anEntIt != myEntities.end(); ++anEntIt) {
+      for (int i = 0; i < 4 && anEntIt->param[i] != SLVS_E_UNKNOWN; ++i)
+        if (myUpdatedParameters.find(anEntIt->param[i]) != myUpdatedParameters.end()) {
+          aPoints.insert(anEntIt->h);
+          break;
+        }
+    }
+    std::set<Slvs_hEntity> anEntities = aPoints;
+    for (anEntIt = myEntities.begin(); anEntIt != myEntities.end(); ++anEntIt) {
+      for (int i = 0; i < 4 && anEntIt->point[i] != SLVS_E_UNKNOWN; ++i)
+        if (aPoints.find(anEntIt->point[i]) != aPoints.end()) {
+          anEntities.insert(anEntIt->h);
+          break;
+        }
+    }
+
+    std::vector<Slvs_Constraint>::const_iterator aCIt = myConstraints.begin();
+    for (; aCIt != myConstraints.end() && !myNeedToResolve; ++aCIt) {
+      Slvs_hEntity anAttrs[6] =
+        {aCIt->ptA, aCIt->ptB, aCIt->entityA, aCIt->entityB, aCIt->entityC, aCIt->entityD};
+      for (int i = 0; i < 6; i++)
+        if (anAttrs[i] != SLVS_E_UNKNOWN && anEntities.find(anAttrs[i]) != anEntities.end()) {
+          myNeedToResolve = true;
+          break;
+        }
+    }
+  }
+
+  myUpdatedParameters.clear();
+  return myNeedToResolve;
+}
+
+
 
 
 
index 2d1e1cd12f3ee0c74bf0e8d0e4eb7d870c55392c..8e808e52b64594c0e4e4da512b16a9e807dfb8e7 100644 (file)
@@ -67,6 +67,8 @@ public:
   Slvs_hEntity copyEntity(const Slvs_hEntity& theCopied);
   /// \brief Copy one entity to another
   void copyEntity(const Slvs_hEntity& theFrom, const Slvs_hEntity& theTo);
+  /// \brief Check the entity is used in constraints
+  bool isUsedByConstraints(const Slvs_hEntity& theEntityID) const;
 
   /// \brief Verifies the current point or another coincident one is fixed
   /// \param[in]  thePointID  entity to be checked fixed
@@ -121,8 +123,7 @@ public:
   { return (int)myTemporaryConstraints.size(); }
 
   /// \brief Shows the sketch should be resolved
-  bool isNeedToResolve() const
-  { return myNeedToResolve && !myConstraints.empty(); }
+  bool isNeedToResolve();
 
   /// \brief Shows the storage has the same constraint twice
   bool hasDuplicatedConstraint() const
@@ -203,6 +204,7 @@ private:
   std::set<Slvs_hParam> myRemovedParameters; ///< list of just removed parameters (cleared when returning to applicant)
   std::set<Slvs_hEntity> myRemovedEntities; ///< list of just removed entities (cleared when returning to applicant)
   std::set<Slvs_hConstraint> myRemovedConstraints; ///< list of just removed constraints (cleared when returning to applicant)
+  std::set<Slvs_hParam> myUpdatedParameters; ///< list of just updated parameters (cleared when isNeedToResolve() called)
 };
 
 typedef std::shared_ptr<SketchSolver_Storage> StoragePtr;