]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Changes to avoid "conflicting constraints" during rotation and translation
authorazv <azv@opencascade.com>
Fri, 14 Aug 2015 15:22:47 +0000 (18:22 +0300)
committerazv <azv@opencascade.com>
Fri, 14 Aug 2015 15:23:46 +0000 (18:23 +0300)
src/SketchSolver/SketchSolver_ConstraintMultiRotation.cpp
src/SketchSolver/SketchSolver_ConstraintMultiRotation.h
src/SketchSolver/SketchSolver_ConstraintMultiTranslation.cpp
src/SketchSolver/SketchSolver_ConstraintMultiTranslation.h

index 53f7af56895599ea0e2afa61eff5444232ee358d..d93983f721985c2cb98e7f9d57a0bedb1d8f1f4a 100644 (file)
@@ -138,13 +138,24 @@ void SketchSolver_ConstraintMultiRotation::process()
     mySlvsConstraints.push_back(aConstraint.h);
   }
 
-  // Set all objects unchanged (only initial object may be changed by user)
+  // Keep all objects unchanged (only initial object may be changed by user)
   myCircsAndCopies.clear();
   std::vector<std::vector<Slvs_hEntity> >::const_iterator anEntIt = anEntitiesAndCopies.begin();
   std::vector<Slvs_hEntity>::const_iterator aCpIt;
   for (; anEntIt != anEntitiesAndCopies.end(); ++anEntIt) {
     std::vector<Slvs_hEntity> aCircs;
-    for (aCpIt = anEntIt->begin(); aCpIt != anEntIt->end(); ++aCpIt) {
+    aCpIt = anEntIt->begin();
+    // Obtain initial points
+    Slvs_Entity anInitial = myStorage->getEntity(*aCpIt);
+    if (anInitial.type == SLVS_E_POINT_IN_2D || anInitial.type == SLVS_E_POINT_IN_3D)
+      myInitialPoints.insert(anInitial.h);
+    else {
+      for (int i = 0; i < 4 && anInitial.point[i] != SLVS_E_UNKNOWN; i++)
+        myInitialPoints.insert(anInitial.point[i]);
+    }
+
+    // Fix the copies
+    for (++aCpIt; aCpIt != anEntIt->end(); ++aCpIt) {
       const Slvs_Entity& anEntity = myStorage->getEntity(*aCpIt);
       std::vector<Slvs_hConstraint> aNewConstr;
       if (anEntity.type == SLVS_E_CIRCLE) {
@@ -222,6 +233,7 @@ bool SketchSolver_ConstraintMultiRotation::remove(ConstraintPtr theConstraint)
 
   // Clear list of rotated points
   myPointsAndCopies.clear();
+  myInitialPoints.clear();
 
   return true;
 }
@@ -293,8 +305,8 @@ void SketchSolver_ConstraintMultiRotation::adjustConstraint()
     // we will update its position correspondingly
     Slvs_hConstraint aFixed;
     for (aCoIt = aCoincident.begin(); aCoIt != aCoincident.end(); ++aCoIt) {
-      if ((aCoIt->ptA == anInitial.h && myStorage->isPointFixed(aCoIt->ptB, aFixed, true)) ||
-          (aCoIt->ptB == anInitial.h && myStorage->isPointFixed(aCoIt->ptA, aFixed, true))) {
+      if ((aCoIt->ptA == anInitial.h && myInitialPoints.find(aCoIt->ptB) != myInitialPoints.end()) ||
+          (aCoIt->ptB == anInitial.h && myInitialPoints.find(aCoIt->ptA) != myInitialPoints.end())) {
         Slvs_hEntity anOtherId = aCoIt->ptA == anInitial.h ? aCoIt->ptB : aCoIt->ptA;
         if (!myStorage->isTemporary(aFixed) &&
             myPointsJustUpdated.find(anOtherId) == myPointsJustUpdated.end())
index f3a0f64fc122b97c5de11ade4eea39376d83fd5b..3294112dd10378148f03831c0f23af911982be95 100644 (file)
@@ -69,6 +69,7 @@ private:
   std::vector< std::vector<Slvs_hEntity> > myCircsAndCopies;  ///< list of circles and their copies (to change their radii together)
 
   std::set<Slvs_hEntity> myPointsJustUpdated; ///< list of points touched by user
+  std::set<Slvs_hEntity> myInitialPoints;     ///< list of points containig initial objects
 };
 
 #endif
index 5b7b275380ec403d54f4e37ae111de9b661db973..28da9cf9ab54c0faed755f08ff9524897c3f817e 100644 (file)
@@ -138,13 +138,24 @@ void SketchSolver_ConstraintMultiTranslation::process()
     }
   }
 
-  // Set all objects unchanged (only initial object may be changed by user)
+  // Keep all objects unchanged (only initial object may be changed by user)
   myCircsAndCopies.clear();
   std::vector<std::vector<Slvs_hEntity> >::const_iterator anEntIt = anEntitiesAndCopies.begin();
   std::vector<Slvs_hEntity>::const_iterator aCpIt;
   for (; anEntIt != anEntitiesAndCopies.end(); ++anEntIt) {
     std::vector<Slvs_hEntity> aCircs;
-    for (aCpIt = anEntIt->begin(); aCpIt != anEntIt->end(); ++aCpIt) {
+    aCpIt = anEntIt->begin();
+    // Obtain initial points
+    Slvs_Entity anInitial = myStorage->getEntity(*aCpIt);
+    if (anInitial.type == SLVS_E_POINT_IN_2D || anInitial.type == SLVS_E_POINT_IN_3D)
+      myInitialPoints.insert(anInitial.h);
+    else {
+      for (int i = 0; i < 4 && anInitial.point[i] != SLVS_E_UNKNOWN; i++)
+        myInitialPoints.insert(anInitial.point[i]);
+    }
+
+    // Fix the copies
+    for (++aCpIt; aCpIt != anEntIt->end(); ++aCpIt) {
       const Slvs_Entity& anEntity = myStorage->getEntity(*aCpIt);
       std::vector<Slvs_hConstraint> aNewConstr;
       if (anEntity.type == SLVS_E_CIRCLE) {
@@ -279,8 +290,8 @@ void SketchSolver_ConstraintMultiTranslation::adjustConstraint()
     // we will update its position correspondingly
     Slvs_hConstraint aFixed;
     for (aCoIt = aCoincident.begin(); aCoIt != aCoincident.end(); ++aCoIt) {
-      if ((aCoIt->ptA == anInitial.h && myStorage->isPointFixed(aCoIt->ptB, aFixed, true)) ||
-          (aCoIt->ptB == anInitial.h && myStorage->isPointFixed(aCoIt->ptA, aFixed, true))) {
+      if ((aCoIt->ptA == anInitial.h && myInitialPoints.find(aCoIt->ptB) != myInitialPoints.end()) ||
+          (aCoIt->ptB == anInitial.h && myInitialPoints.find(aCoIt->ptA) != myInitialPoints.end())) {
         Slvs_hEntity anOtherId = aCoIt->ptA == anInitial.h ? aCoIt->ptB : aCoIt->ptA;
         if (!myStorage->isTemporary(aFixed) &&
             myPointsJustUpdated.find(anOtherId) == myPointsJustUpdated.end())
index bed7df22922e9f70fb5545bd6b869927336b24ee..10d44dbf1051eae40db2908622f0ee6b5acef943 100644 (file)
@@ -67,6 +67,7 @@ private:
   std::vector< std::vector<Slvs_hEntity> > myCircsAndCopies;  ///< list of circles and their copies (to change their radii together)
 
   std::set<Slvs_hEntity> myPointsJustUpdated; ///< list of points touched by user
+  std::set<Slvs_hEntity> myInitialPoints;     ///< list of points containig initial objects
 };
 
 #endif