Salome HOME
Issue #1677: Arc orientation lost after save/open
authorazv <azv@opencascade.com>
Fri, 26 Aug 2016 07:55:48 +0000 (10:55 +0300)
committerazv <azv@opencascade.com>
Fri, 26 Aug 2016 08:34:11 +0000 (11:34 +0300)
Explicit creation of new group in the solver for the standalone arc for correct movement of the arc dragging by extremities.

src/SketchPlugin/SketchPlugin_Arc.cpp
src/SketchSolver/SketchSolver_Manager.cpp

index aa1d29096bd266db346a0ef9a0a738ff46c0f954..b4666ebca7f75e60b967030702ee6b60b2976fa5 100644 (file)
@@ -41,7 +41,7 @@
 
 const double tolerance = 1e-7;
 const double paramTolerance = 1.e-4;
-const double PI =3.141592653589793238463;
+const double PI = 3.141592653589793238463;
 
 namespace {
   static const std::string& POINT_ID(int theIndex)
@@ -68,7 +68,7 @@ SketchPlugin_Arc::SketchPlugin_Arc()
   myXEndBefore = 0;
   myYEndBefore = 0;
 
-  myParamBefore = 0;
+  myParamBefore = PI * 2.0;
 }
 
 void SketchPlugin_Arc::initDerivedClassAttributes()
index 61c0547b08e6c46f2cef8a57854c8dae675cea41..85d5c28ad9e7b895d9b39e2136fb194098f28c30 100644 (file)
@@ -377,9 +377,31 @@ bool SketchSolver_Manager::moveEntity(std::shared_ptr<SketchPlugin_Feature> theF
   if (!isMoved && theFeature->getKind() == SketchPlugin_Arc::ID()) {
     // Workaround to move arc.
     // If the arc has not been constrained, we will push it into empty group and apply movement.
+    bool hasEmptyGroup = false;
     for (aGroupIt = myGroups.begin(); aGroupIt != myGroups.end(); aGroupIt++)
-      if ((*aGroupIt)->isEmpty())
+      if ((*aGroupIt)->isEmpty()) {
         isMoved = (*aGroupIt)->moveFeature(theFeature) || isMoved;
+        hasEmptyGroup = true;
+      }
+    // There is no empty group, create it explicitly
+    if (!hasEmptyGroup) {
+      // find sketch containing the arc
+      CompositeFeaturePtr aWP;
+      const std::set<AttributePtr>& aRefs = theFeature->data()->refsToMe();
+      std::set<AttributePtr>::const_iterator aRefIt = aRefs.begin();
+      for (; aRefIt != aRefs.end(); ++aRefIt) {
+        FeaturePtr anOwner = ModelAPI_Feature::feature((*aRefIt)->owner());
+        if (anOwner && anOwner->getKind() == SketchPlugin_Sketch::ID()) {
+          aWP = std::dynamic_pointer_cast<ModelAPI_CompositeFeature>(anOwner);
+          break;
+        }
+      }
+      if (aWP) {
+        SketchSolver_Group* aGroup = new SketchSolver_Group(aWP);
+        isMoved = aGroup->moveFeature(theFeature) || isMoved;
+        myGroups.push_back(aGroup);
+      }
+    }
   }
   return isMoved;
 }