Salome HOME
PlaneGCS: update all arc parameters when moving start/end point
authorazv <azv@opencascade.com>
Mon, 19 Dec 2016 16:18:37 +0000 (19:18 +0300)
committerazv <azv@opencascade.com>
Mon, 19 Dec 2016 16:31:21 +0000 (19:31 +0300)
src/SketchPlugin/Test/TestArcBehavior.py
src/SketchSolver/PlaneGCSSolver/PlaneGCSSolver_Storage.cpp

index 7498a37d59474a813ac4669e265d72520f176f58..24014cae24ef3b1139ebfa4ccd7c2275319594b8 100644 (file)
@@ -131,3 +131,42 @@ for aCenterCoords in range(-20, 20):
   anArcCentr.setValue(aCenterCoords, aCenterCoords/2) # move center
   aSession.finishOperation()
   assert aSketchArc.boolean("InversedArc").value() == anInversed
+#=========================================================================
+# Test that movement of start point of arc does not change central point
+#=========================================================================
+TOL = 1.e-5
+x = anArcCentr.x()
+y = anArcCentr.y()
+sx = anArcStartPoint.x()
+sy = anArcStartPoint.y()
+for aDelta in range(0, 20):
+  aSession.startOperation()
+  anArcStartPoint.setValue(sx, sy+aDelta) # move start point
+  aSession.finishOperation()
+  assert math.fabs(anArcCentr.x() - x) < TOL
+  assert math.fabs(anArcCentr.y() - y) < TOL
+for aDelta in range(20, -1, -1):
+  aSession.startOperation()
+  anArcStartPoint.setValue(sx, sy+aDelta) # move start point
+  aSession.finishOperation()
+  assert math.fabs(anArcCentr.x() - x) < TOL
+  assert math.fabs(anArcCentr.y() - y) < TOL
+#=========================================================================
+# Test that movement of end point of arc does not change central point
+#=========================================================================
+x = anArcCentr.x()
+y = anArcCentr.y()
+sx = anArcEndPoint.x()
+sy = anArcEndPoint.y()
+for aDelta in range(0, 20):
+  aSession.startOperation()
+  anArcEndPoint.setValue(sx+aDelta, sy) # move end point
+  aSession.finishOperation()
+  assert math.fabs(anArcCentr.x() - x) < TOL
+  assert math.fabs(anArcCentr.y() - y) < TOL
+for aDelta in range(20, -1, -1):
+  aSession.startOperation()
+  anArcEndPoint.setValue(sx+aDelta, sy) # move end point
+  aSession.finishOperation()
+  assert math.fabs(anArcCentr.x() - x) < TOL
+  assert math.fabs(anArcCentr.y() - y) < TOL
index 6c8527ada14493693e3a070a458139ef0c77da37..37086e22f611bf895b92ac3723742635ed96c59f 100644 (file)
@@ -389,8 +389,11 @@ void PlaneGCSSolver_Storage::processArc(const EntityWrapperPtr& theArc)
   // Calculate additional parameters necessary for PlaneGCS
   const std::list<EntityWrapperPtr>& aSubs = theArc->subEntities();
   std::list<EntityWrapperPtr>::const_iterator aSubIt = aSubs.begin();
-  while ((*aSubIt)->type() == ENTITY_POINT) // search scalar entities
+  bool isFixed[3] = {false, false, false};
+  for (int i = 0; (*aSubIt)->type() == ENTITY_POINT; ++i) { // search scalar entities
+    isFixed[i] = (*aSubIt)->group() == GID_OUTOFGROUP;
     ++aSubIt;
+  }
   double* aStartAngle =
     std::dynamic_pointer_cast<PlaneGCSSolver_ScalarWrapper>(*aSubIt++)->scalar();
   double* aEndAngle =
@@ -411,7 +414,10 @@ void PlaneGCSSolver_Storage::processArc(const EntityWrapperPtr& theArc)
   std::shared_ptr<GeomAPI_Pnt2d> aStartPnt  = aStartAttr->pnt();
   std::shared_ptr<GeomAPI_Pnt2d> aEndPnt    = aEndAttr->pnt();
 
-  *aRadius = aCenterPnt->distance(aStartPnt);
+  if (isFixed[2] && !isFixed[1])
+    *aRadius = aCenterPnt->distance(aEndPnt);
+  else
+    *aRadius = aCenterPnt->distance(aStartPnt);
   if (!anArcFeature->lastResult())
     return;
   static std::shared_ptr<GeomAPI_Dir2d> OX(new GeomAPI_Dir2d(1.0, 0.0));
@@ -428,8 +434,8 @@ void PlaneGCSSolver_Storage::processArc(const EntityWrapperPtr& theArc)
   // No need to add constraints if they are already exist
   std::map<EntityWrapperPtr, std::vector<GCSConstraintPtr> >::const_iterator
       aFound = myArcConstraintMap.find(theArc);
-  if (aFound != myArcConstraintMap.end())
-    return;
+//  if (aFound != myArcConstraintMap.end())
+//    return;
 
   // Prepare additional constraints to produce the arc
   std::vector<GCSConstraintPtr> anArcConstraints;