]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Avoid hang-up on coincidence points and rotated arcs (issue #883)
authorazv <azv@opencascade.com>
Wed, 2 Sep 2015 07:40:40 +0000 (10:40 +0300)
committerazv <azv@opencascade.com>
Wed, 2 Sep 2015 11:28:28 +0000 (14:28 +0300)
src/SketchSolver/SketchSolver_ConstraintMultiRotation.cpp
src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp

index d93983f721985c2cb98e7f9d57a0bedb1d8f1f4a..ea4372fa648560509db0dfd30dde79a149fc4d96 100644 (file)
@@ -164,11 +164,18 @@ void SketchSolver_ConstraintMultiRotation::process()
         aNewConstr = myStorage->fixEntity(anEntity.point[0]);
       } else
         aNewConstr = myStorage->fixEntity(*aCpIt);
+      if (anEntity.type == SLVS_E_ARC_OF_CIRCLE)
+        aCircs.push_back(anEntity.h);
       mySlvsConstraints.insert(mySlvsConstraints.end(), aNewConstr.begin(), aNewConstr.end());
     }
 
-    if (!aCircs.empty())
+    if (!aCircs.empty()) {
+      if (anInitial.type == SLVS_E_CIRCLE)
+        aCircs.insert(aCircs.begin(), anInitial.distance);
+      else
+        aCircs.insert(aCircs.begin(), anInitial.h);
       myCircsAndCopies.push_back(aCircs);
+    }
   }
 
   adjustConstraint();
@@ -340,15 +347,43 @@ void SketchSolver_ConstraintMultiRotation::adjustConstraint()
     }
   }
 
+  std::list<Slvs_Constraint> aDiamConstr;
   for (aPointsIter = myCircsAndCopies.begin(); aPointsIter != myCircsAndCopies.end(); ++aPointsIter) {
     aCopyIter = aPointsIter->begin();
     const Slvs_Entity& anInitial = myStorage->getEntity(*aCopyIter);
-    const Slvs_Param& anInitRad = myStorage->getParameter(anInitial.param[0]);
-    for (++aCopyIter; aCopyIter != aPointsIter->end(); ++aCopyIter) {
-      const Slvs_Entity& aCopy = myStorage->getEntity(*aCopyIter);
-      Slvs_Param aCopyRad = myStorage->getParameter(aCopy.param[0]);
-      aCopyRad.val = anInitRad.val;
-      myStorage->updateParameter(aCopyRad);
+    if (anInitial.type == SLVS_E_DISTANCE) {
+      const Slvs_Param& anInitRad = myStorage->getParameter(anInitial.param[0]);
+      for (++aCopyIter; aCopyIter != aPointsIter->end(); ++aCopyIter) {
+        const Slvs_Entity& aCopy = myStorage->getEntity(*aCopyIter);
+        Slvs_Param aCopyRad = myStorage->getParameter(aCopy.param[0]);
+        aCopyRad.val = anInitRad.val;
+        myStorage->updateParameter(aCopyRad);
+      }
+    } else if (anInitial.type == SLVS_E_ARC_OF_CIRCLE) {
+      const Slvs_Entity& aCenterEnt = myStorage->getEntity(anInitial.point[0]);
+      const Slvs_Entity& aStartEnt = myStorage->getEntity(anInitial.point[1]);
+
+      if (aDiamConstr.empty())
+        aDiamConstr = myStorage->getConstraintsByType(SLVS_C_DIAMETER);
+      // Calculate diameter of initial arc
+      double aDiam = 0.0;
+      for (int i = 0; i < 2; i++) {
+        double d = myStorage->getParameter(aStartEnt.param[i]).val -
+                   myStorage->getParameter(aCenterEnt.param[i]).val;
+        aDiam += d * d;
+      }
+      aDiam = sqrt(aDiam) * 2.0;
+      // Update the Diameter constraints of copied arcs
+      for (++aCopyIter; aCopyIter != aPointsIter->end(); ++aCopyIter) {
+        std::list<Slvs_Constraint>::iterator aDCIt = aDiamConstr.begin();
+        for (; aDCIt != aDiamConstr.end(); ++aDCIt)
+          if (aDCIt->entityA == *aCopyIter) {
+            aDCIt->valA = aDiam;
+            myStorage->updateConstraint(*aDCIt);
+            aDiamConstr.erase(aDCIt);
+            break;
+          }
+      }
     }
   }
 
index 28da9cf9ab54c0faed755f08ff9524897c3f817e..eb6b61e43c3f1c2478e2f8285bba120bcd837431 100644 (file)
@@ -164,11 +164,18 @@ void SketchSolver_ConstraintMultiTranslation::process()
         aNewConstr = myStorage->fixEntity(anEntity.point[0]);
       } else
         aNewConstr = myStorage->fixEntity(*aCpIt);
+      if (anEntity.type == SLVS_E_ARC_OF_CIRCLE)
+        aCircs.push_back(anEntity.h);
       mySlvsConstraints.insert(mySlvsConstraints.end(), aNewConstr.begin(), aNewConstr.end());
     }
 
-    if (!aCircs.empty())
+    if (!aCircs.empty()) {
+      if (anInitial.type == SLVS_E_CIRCLE)
+        aCircs.insert(aCircs.begin(), anInitial.distance);
+      else
+        aCircs.insert(aCircs.begin(), anInitial.h);
       myCircsAndCopies.push_back(aCircs);
+    }
   }
 
   adjustConstraint();
@@ -324,15 +331,43 @@ void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
     }
   }
 
+  std::list<Slvs_Constraint> aDiamConstr;
   for (aPointsIter = myCircsAndCopies.begin(); aPointsIter != myCircsAndCopies.end(); ++aPointsIter) {
     aCopyIter = aPointsIter->begin();
     const Slvs_Entity& anInitial = myStorage->getEntity(*aCopyIter);
-    const Slvs_Param& anInitRad = myStorage->getParameter(anInitial.param[0]);
-    for (++aCopyIter; aCopyIter != aPointsIter->end(); ++aCopyIter) {
-      const Slvs_Entity& aCopy = myStorage->getEntity(*aCopyIter);
-      Slvs_Param aCopyRad = myStorage->getParameter(aCopy.param[0]);
-      aCopyRad.val = anInitRad.val;
-      myStorage->updateParameter(aCopyRad);
+    if (anInitial.type == SLVS_E_DISTANCE) {
+      const Slvs_Param& anInitRad = myStorage->getParameter(anInitial.param[0]);
+      for (++aCopyIter; aCopyIter != aPointsIter->end(); ++aCopyIter) {
+        const Slvs_Entity& aCopy = myStorage->getEntity(*aCopyIter);
+        Slvs_Param aCopyRad = myStorage->getParameter(aCopy.param[0]);
+        aCopyRad.val = anInitRad.val;
+        myStorage->updateParameter(aCopyRad);
+      }
+    } else if (anInitial.type == SLVS_E_ARC_OF_CIRCLE) {
+      const Slvs_Entity& aCenterEnt = myStorage->getEntity(anInitial.point[0]);
+      const Slvs_Entity& aStartEnt = myStorage->getEntity(anInitial.point[1]);
+
+      if (aDiamConstr.empty())
+        aDiamConstr = myStorage->getConstraintsByType(SLVS_C_DIAMETER);
+      // Calculate diameter of initial arc
+      double aDiam = 0.0;
+      for (int i = 0; i < 2; i++) {
+        double d = myStorage->getParameter(aStartEnt.param[i]).val -
+                   myStorage->getParameter(aCenterEnt.param[i]).val;
+        aDiam += d * d;
+      }
+      aDiam = sqrt(aDiam) * 2.0;
+      // Update the Diameter constraints of copied arcs
+      for (++aCopyIter; aCopyIter != aPointsIter->end(); ++aCopyIter) {
+        std::list<Slvs_Constraint>::iterator aDCIt = aDiamConstr.begin();
+        for (; aDCIt != aDiamConstr.end(); ++aDCIt)
+          if (aDCIt->entityA == *aCopyIter) {
+            aDCIt->valA = aDiam;
+            myStorage->updateConstraint(*aDCIt);
+            aDiamConstr.erase(aDCIt);
+            break;
+          }
+      }
     }
   }