]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/FeaturesPlugin/FeaturesPlugin_Movement.cpp
Salome HOME
Make the movement, placement and rotation 3D features may be applied to the Part...
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Movement.cpp
index 12bced3492af158b35df305ad529a48fd9a9513c..3b6779bc7a38fb2e42c661f6b4a46d4297932921 100644 (file)
@@ -9,6 +9,7 @@
 #include <ModelAPI_AttributeDouble.h>
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_ResultBody.h>
+#include <ModelAPI_ResultPart.h>
 #include <ModelAPI_Session.h>
 
 #include <GeomAPI_Edge.h>
@@ -37,6 +38,7 @@ void FeaturesPlugin_Movement::execute()
 {
   // Getting objects.
   ListOfShape anObjects;
+  std::list<ResultPtr> aContextes;
   AttributeSelectionListPtr anObjectsSelList = selectionList(FeaturesPlugin_Movement::OBJECTS_LIST_ID());
   if (anObjectsSelList->size() == 0) {
     return;
@@ -48,6 +50,7 @@ void FeaturesPlugin_Movement::execute()
       return;
     }
     anObjects.push_back(anObject);
+    aContextes.push_back(anObjectAttr->context());
   }
 
   //Getting axis.
@@ -66,9 +69,12 @@ void FeaturesPlugin_Movement::execute()
 
   // Moving 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_Movement aMovementAlgo(aBaseShape, anAxis, aDistance);
+    bool isPart = (*aContext)->groupName() == ModelAPI_ResultPart::group();
+    GeomAlgoAPI_Movement aMovementAlgo(aBaseShape, anAxis, aDistance, isPart);
 
     // Checking that the algorithm worked properly.
     if(!aMovementAlgo.isDone()) {
@@ -88,9 +94,26 @@ void FeaturesPlugin_Movement::execute()
     }
 
     // Setting result.
-    ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
-    LoadNamingDS(aMovementAlgo, 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, aMovementAlgo.shape());
+      setResult(aResultPart);
+    } else {
+      ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
+      LoadNamingDS(aMovementAlgo, aResultBody, aBaseShape);
+      setResult(aResultBody, aResultIndex);
+    }
     aResultIndex++;
   }