Salome HOME
Make the movement, placement and rotation 3D features may be applied to the Part...
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Rotation.cpp
index 25faa8dd6897d6a33ebae6969692d296b72a5f40..bbaf84a0ec0d617f457df64fefce286f961f92c7 100755 (executable)
@@ -10,6 +10,7 @@
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_ResultBody.h>
 #include <ModelAPI_Session.h>
+#include <ModelAPI_ResultPart.h>
 
 #include <GeomAPI_Edge.h>
 #include <GeomAPI_Lin.h>
@@ -37,6 +38,7 @@ void FeaturesPlugin_Rotation::execute()
 {
   // Getting objects.
   ListOfShape anObjects;
+  std::list<ResultPtr> aContextes;
   AttributeSelectionListPtr anObjectsSelList = selectionList(FeaturesPlugin_Rotation::OBJECTS_LIST_ID());
   if (anObjectsSelList->size() == 0) {
     return;
@@ -48,6 +50,7 @@ void FeaturesPlugin_Rotation::execute()
       return;
     }
     anObjects.push_back(anObject);
+    aContextes.push_back(anObjectAttr->context());
   }
 
   //Getting axis.
@@ -66,9 +69,12 @@ void FeaturesPlugin_Rotation::execute()
 
   // Rotating each object.
   int aResultIndex = 0;
-  for(ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); anObjectsIt++) {
+  std::list<ResultPtr>::iterator aContext = aContextes.begin();
+  for(ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); 
+        anObjectsIt++, aContext++) {
     std::shared_ptr<GeomAPI_Shape> aBaseShape = *anObjectsIt;
-    GeomAlgoAPI_Rotation aRotationAlgo(aBaseShape, anAxis, anAngle);
+    bool isPart = (*aContext)->groupName() == ModelAPI_ResultPart::group();
+    GeomAlgoAPI_Rotation aRotationAlgo(aBaseShape, anAxis, anAngle, isPart);
 
     // Checking that the algorithm worked properly.
     if(!aRotationAlgo.isDone()) {
@@ -88,9 +94,26 @@ void FeaturesPlugin_Rotation::execute()
     }
 
     // Setting result.
-    ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
-    LoadNamingDS(aRotationAlgo, aResultBody, aBaseShape);
-    setResult(aResultBody, aResultIndex);
+    if (isPart) {
+      ResultPartPtr anOrigin = std::dynamic_pointer_cast<ModelAPI_ResultPart>(*aContext);
+
+      ResultPartPtr aCurrentResult;
+      const std::list<std::shared_ptr<ModelAPI_Result> >& aResults = results();
+      std::list<std::shared_ptr<ModelAPI_Result> >::const_iterator aResIter = aResults.begin();
+      for(int a = 0; aResIter != aResults.end(); aResIter++, a++)  {
+        if (a == aResultIndex) {
+          aCurrentResult = std::dynamic_pointer_cast<ModelAPI_ResultPart>(*aResIter);
+          break;
+        }
+      }
+      ResultPartPtr aResultPart = document()->copyPart(aCurrentResult, anOrigin, aResultIndex);
+      aResultPart->setShape(*aContext, aRotationAlgo.shape());
+      setResult(aResultPart);
+    } else {
+      ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
+      LoadNamingDS(aRotationAlgo, aResultBody, aBaseShape);
+      setResult(aResultBody, aResultIndex);
+    }
     aResultIndex++;
   }