Salome HOME
Issue #1412:Selection mode preferences modified
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Partition.cpp
index 2a584910c218521ee7350e879b2a02d8122ec9ca..66a64ba435017e15ef2fa1c3853a286f408c3b40 100755 (executable)
@@ -17,6 +17,7 @@
 #include <ModelAPI_Session.h>
 #include <ModelAPI_Validator.h>
 
+#include <GeomAlgoAPI_CompoundBuilder.h>
 #include <GeomAlgoAPI_Partition.h>
 #include <GeomAlgoAPI_MakeShapeCustom.h>
 #include <GeomAlgoAPI_MakeShapeList.h>
@@ -47,20 +48,6 @@ void FeaturesPlugin_Partition::initAttributes()
   data()->addAttribute(COMBINE_ID(), ModelAPI_AttributeBoolean::typeId());
 }
 
-//=================================================================================================
-std::shared_ptr<GeomAPI_Shape> FeaturesPlugin_Partition::getShape(const std::string& theAttrName)
-{
-  std::shared_ptr<ModelAPI_AttributeReference> aObjRef =
-      std::dynamic_pointer_cast<ModelAPI_AttributeReference>(data()->attribute(theAttrName));
-  if (aObjRef) {
-    std::shared_ptr<ModelAPI_ResultBody> aConstr =
-        std::dynamic_pointer_cast<ModelAPI_ResultBody>(aObjRef->value());
-    if (aConstr)
-      return aConstr->shape();
-  }
-  return std::shared_ptr<GeomAPI_Shape>();
-}
-
 //=================================================================================================
 void FeaturesPlugin_Partition::execute()
 {
@@ -92,7 +79,7 @@ void FeaturesPlugin_Partition::execute()
         aTool = GeomAlgoAPI_ShapeTools::fitPlaneToBox(aContext->shape(), aBoundingPoints);
         std::shared_ptr<GeomAlgoAPI_MakeShapeCustom> aMkShCustom(new GeomAlgoAPI_MakeShapeCustom);
         aMkShCustom->addModified(aContext->shape(), aTool);
-        aMakeShapeList.append(aMkShCustom);
+        aMakeShapeList.appendAlgo(aMkShCustom);
         aTools.push_back(aTool);
         aToolsForNaming.push_back(aContext->shape());
       }
@@ -106,7 +93,7 @@ void FeaturesPlugin_Partition::execute()
   bool isCombine = boolean(COMBINE_ID())->value();
 
   if(anObjects.empty()/* || aTools.empty()*/) {
-    std::string aFeatureError = "Not enough objects for partition operation";
+    std::string aFeatureError = "Error: Not enough objects for partition operation.";
     setError(aFeatureError);
     return;
   }
@@ -115,30 +102,39 @@ void FeaturesPlugin_Partition::execute()
 
   if(isCombine) {
     // Create single result.
-    GeomAlgoAPI_Partition aPartitionAlgo(anObjects, aTools);
+    //if(!aTools.empty()) {
+    //  // This is a workaround for naming. Passing compound of objects as argument instead each object separately.
+    //  std::shared_ptr<GeomAPI_Shape> aCompoud = GeomAlgoAPI_CompoundBuilder::compound(anObjects);
+    //  anObjects.clear();
+    //  anObjects.push_back(aCompoud);
+    //}
+    std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo(new GeomAlgoAPI_Partition(anObjects, aTools));
 
     // Checking that the algorithm worked properly.
-    if (!aPartitionAlgo.isDone()) {
-      static const std::string aFeatureError = "Partition algorithm failed";
+    if (!aPartitionAlgo->isDone()) {
+      static const std::string aFeatureError = "Error: Partition algorithm failed.";
       setError(aFeatureError);
       return;
     }
-    if (aPartitionAlgo.shape()->isNull()) {
-      static const std::string aShapeError = "Resulting shape is Null";
+    if (aPartitionAlgo->shape()->isNull()) {
+      static const std::string aShapeError = "Error: Resulting shape is Null.";
       setError(aShapeError);
       return;
     }
-    if (!aPartitionAlgo.isValid()) {
-      std::string aFeatureError = "Warning: resulting shape is not valid";
+    if (!aPartitionAlgo->isValid()) {
+      std::string aFeatureError = "Error: Resulting shape is not valid.";
       setError(aFeatureError);
       return;
     }
 
-    if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo.shape()) > 1.e-7) {
+    if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo->shape()) > 1.e-7) {
       std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data(), aResultIndex);
-      aMakeShapeList.append(aPartitionAlgo.makeShape());
-      GeomAPI_DataMapOfShapeShape aMapOfShapes = *aPartitionAlgo.mapOfShapes().get();
-      loadNamingDS(aResultBody, anObjects.front(), aToolsForNaming, aPartitionAlgo.shape(), aMakeShapeList, aMapOfShapes);
+      aMakeShapeList.appendAlgo(aPartitionAlgo);
+      GeomAPI_DataMapOfShapeShape& aMapOfShapes = *aPartitionAlgo->mapOfSubShapes().get();
+      std::shared_ptr<GeomAPI_Shape> aBaseShape = anObjects.front();
+      anObjects.pop_front();
+      aToolsForNaming.insert(aToolsForNaming.end(), anObjects.begin(), anObjects.end());
+      loadNamingDS(aResultBody, aBaseShape, aToolsForNaming, aPartitionAlgo->shape(), aMakeShapeList, aMapOfShapes);
       setResult(aResultBody, aResultIndex);
       aResultIndex++;
     }
@@ -147,30 +143,31 @@ void FeaturesPlugin_Partition::execute()
     for (ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); anObjectsIt++) {
       std::shared_ptr<GeomAPI_Shape> anObject = *anObjectsIt;
       ListOfShape aListWithObject; aListWithObject.push_back(anObject);
-      GeomAlgoAPI_Partition aPartitionAlgo(aListWithObject, aTools);
+      std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo(new GeomAlgoAPI_Partition(aListWithObject, aTools));
 
       // Checking that the algorithm worked properly.
-      if (!aPartitionAlgo.isDone()) {
-        static const std::string aFeatureError = "Partition algorithm failed";
+      if (!aPartitionAlgo->isDone()) {
+        static const std::string aFeatureError = "Error: Partition algorithm failed.";
         setError(aFeatureError);
         return;
       }
-      if (aPartitionAlgo.shape()->isNull()) {
-        static const std::string aShapeError = "Resulting shape is Null";
+      if (aPartitionAlgo->shape()->isNull()) {
+        static const std::string aShapeError = "Error: Resulting shape is Null.";
         setError(aShapeError);
         return;
       }
-      if (!aPartitionAlgo.isValid()) {
-        std::string aFeatureError = "Warning: resulting shape is not valid";
+      if (!aPartitionAlgo->isValid()) {
+        std::string aFeatureError = "Error: Resulting shape is not valid.";
         setError(aFeatureError);
         return;
       }
 
-      if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo.shape()) > 1.e-7) {
+      if (GeomAlgoAPI_ShapeTools::volume(aPartitionAlgo->shape()) > 1.e-7) {
         std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data(), aResultIndex);
-        aMakeShapeList.append(aPartitionAlgo.makeShape());
-        GeomAPI_DataMapOfShapeShape aMapOfShapes = *aPartitionAlgo.mapOfShapes().get();
-        loadNamingDS(aResultBody, anObject, aToolsForNaming, aPartitionAlgo.shape(), aMakeShapeList, aMapOfShapes);
+        GeomAlgoAPI_MakeShapeList aMakeShapeListCopy = aMakeShapeList;
+        aMakeShapeListCopy.appendAlgo(aPartitionAlgo);
+        GeomAPI_DataMapOfShapeShape aMapOfShapes = *aPartitionAlgo->mapOfSubShapes().get();
+        loadNamingDS(aResultBody, anObject, aToolsForNaming, aPartitionAlgo->shape(), aMakeShapeListCopy, aMapOfShapes);
         setResult(aResultBody, aResultIndex);
         aResultIndex++;
       }