]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #563: Fix the problem with translating on the given distance
authorazv <azv@opencascade.com>
Tue, 26 May 2015 15:07:15 +0000 (18:07 +0300)
committerazv <azv@opencascade.com>
Tue, 26 May 2015 15:07:51 +0000 (18:07 +0300)
src/SketchSolver/SketchSolver_Constraint.cpp
src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp
src/SketchSolver/SketchSolver_Group.cpp
src/SketchSolver/SketchSolver_Storage.h

index 1ab3b596b6571670ff6ef4edeefa23e598eb62c4..d5c3bbb5a0f6b421cf827f9bd354df085717469a 100644 (file)
@@ -155,8 +155,7 @@ bool SketchSolver_Constraint::checkAttributesChanged(ConstraintPtr theConstraint
       std::list<ObjectPtr>::iterator anIt = anItems.begin();
       for (; anIt != anItems.end(); anIt++) {
         FeaturePtr aFeature = ModelAPI_Feature::feature(*anIt);
-        std::map<FeaturePtr, Slvs_hEntity>::iterator aFIt = myFeatureMap.find(aFeature);
-        if (aFeature && (aFIt == myFeatureMap.end() || aCurAttrs.find(aFIt->second) == aCurAttrs.end()))
+        if (aFeature && myFeatureMap.find(aFeature) == myFeatureMap.end())
           return true;
       }
     }
index 2e5bafbfed11aba45a55ab93c06c10c186743fc5..a90354a84a5ef072c0cff929c0c918f1d92371cd 100644 (file)
@@ -164,17 +164,6 @@ void SketchSolver_ConstraintMultiTranslation::process()
     }
   }
 
-  // Set the translation line unchanged during constraint recalculation
-  for (int i = 0; i < 2; i++) {
-    if (myStorage->isPointFixed(aTranslationLine.point[i], aConstraint.h, true))
-      continue;
-    aConstraint = Slvs_MakeConstraint(
-        SLVS_E_UNKNOWN, myGroup->getId(), SLVS_C_WHERE_DRAGGED, myGroup->getWorkplaneId(), 0.0,
-        aTranslationLine.point[i], SLVS_E_UNKNOWN, SLVS_E_UNKNOWN, SLVS_E_UNKNOWN);
-    aConstraint.h = myStorage->addConstraint(aConstraint);
-    mySlvsConstraints.push_back(aConstraint.h);
-  }
-
   adjustConstraint();
 }
 
@@ -222,6 +211,18 @@ bool SketchSolver_ConstraintMultiTranslation::remove(ConstraintPtr theConstraint
 void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
 {
   Slvs_Entity aTranslationLine = myStorage->getEntity(myTranslationLine);
+  Slvs_hConstraint aFixed; // temporary variable
+  // Set the translation line unchanged during constraint recalculation
+  for (int i = 0; i < 2; i++) {
+    if (myStorage->isPointFixed(aTranslationLine.point[i], aFixed, true))
+      continue;
+    Slvs_Constraint aConstraint = Slvs_MakeConstraint(
+        SLVS_E_UNKNOWN, myGroup->getId(), SLVS_C_WHERE_DRAGGED, myGroup->getWorkplaneId(), 0.0,
+        aTranslationLine.point[i], SLVS_E_UNKNOWN, SLVS_E_UNKNOWN, SLVS_E_UNKNOWN);
+    aConstraint.h = myStorage->addConstraint(aConstraint);
+    myStorage->addTemporaryConstraint(aConstraint.h);
+  }
+
   // Check if the distance between point is 0, no need to resolve constraints (just wait another values)
   double aXY[4];
   for (int i = 0; i < 2; i++) {
@@ -239,7 +240,6 @@ void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
   std::list<Slvs_Constraint> aParallel = myStorage->getConstraintsByType(SLVS_C_PARALLEL);
   std::list<Slvs_Constraint>::iterator aParIt = aParallel.begin();
   std::vector<Slvs_hConstraint>::iterator aCIt;
-  Slvs_hConstraint aFixed; // temporary variable
   for (; aParIt != aParallel.end(); aParIt++) {
     for (aCIt = mySlvsConstraints.begin(); aCIt != mySlvsConstraints.end(); aCIt++)
       if (aParIt->h == *aCIt)
index 419cc3e87b51241c5d45d1db49fd0020d4c70aac..794eb1a3f355ec24bee87d9065ff3c69cf2cf186 100644 (file)
@@ -424,7 +424,7 @@ bool SketchSolver_Group::resolveConstraints()
       else {
         // To avoid overconstraint situation, we will remove temporary constraints one-by-one
         // and try to find the case without overconstraint
-        int aNbTemp = (int)myTempConstraints.size();
+        int aNbTemp = myStorage->numberTemporary();
         while (true) {
           aResult = myConstrSolver.solve();
           if (aResult == SLVS_RESULT_OKAY || aNbTemp <= 0)
@@ -575,7 +575,8 @@ bool SketchSolver_Group::isConsistent()
 void SketchSolver_Group::removeTemporaryConstraints()
 {
   myTempConstraints.clear();
-  myStorage->removeTemporaryConstraints();
+  while (myStorage->numberTemporary())
+    myStorage->deleteTemporaryConstraint();
   // Clean lists of removed entities in the storage
   std::set<Slvs_hParam> aRemPar;
   std::set<Slvs_hEntity> aRemEnt;
index 669f2c0eacc12fd31ef1491d0ef558ed982b3c33..3167dd1578cc5dd9cdd242cef2de901ba469bb8d 100644 (file)
@@ -113,6 +113,9 @@ public:
   int deleteTemporaryConstraint();
   /// \brief Checks the constraint is temporary
   bool isTemporary(const Slvs_hConstraint& theConstraintID) const;
+  /// \brief Number of temporary constraints
+  int numberTemporary() const
+  { return (int)myTemporaryConstraints.size(); }
 
   /// \brief Shows the sketch should be resolved
   bool isNeedToResolve() const