Salome HOME
Resolve batch runtime errors on debian squeeze
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Boolean.cpp
index 220b4144c6e05edfdfe87eb12124309be7ea5e4f..2932d5e5cce410fa963f068e5579554a3dcfc13c 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D -->
+
 // File:        FeaturesPlugin_Boolean.cpp
 // Created:     02 Sept 2014
 // Author:      Vitaly SMETANNIKOV
 #include <ModelAPI_Data.h>
 #include <ModelAPI_Document.h>
 #include <ModelAPI_AttributeReference.h>
+#include <ModelAPI_AttributeInteger.h>
 #include <ModelAPI_ResultBody.h>
 #include <GeomAlgoAPI_Boolean.h>
-
 using namespace std;
 
+#define FACE 4
+#define _MODIFY_TAG 1
+#define _DELETED_TAG 2
 FeaturesPlugin_Boolean::FeaturesPlugin_Boolean()
 {
 }
 
 void FeaturesPlugin_Boolean::initAttributes()
 {
-  data()->addAttribute(FeaturesPlugin_Boolean::TYPE_ID(), ModelAPI_AttributeReference::type());
-  data()->addAttribute(FeaturesPlugin_Boolean::OBJECT_ID(), ModelAPI_AttributeReference::type());
-  data()->addAttribute(FeaturesPlugin_Boolean::TOOL_ID(), ModelAPI_AttributeReference::type());
+  data()->addAttribute(FeaturesPlugin_Boolean::TYPE_ID(), ModelAPI_AttributeInteger::typeId());
+  data()->addAttribute(FeaturesPlugin_Boolean::OBJECT_ID(), ModelAPI_AttributeReference::typeId());
+  data()->addAttribute(FeaturesPlugin_Boolean::TOOL_ID(), ModelAPI_AttributeReference::typeId());
 }
 
-boost::shared_ptr<GeomAPI_Shape> FeaturesPlugin_Boolean::getShape(const std::string& theAttrName)
+std::shared_ptr<GeomAPI_Shape> FeaturesPlugin_Boolean::getShape(const std::string& theAttrName)
 {
-  boost::shared_ptr<ModelAPI_AttributeReference> aObjRef = boost::dynamic_pointer_cast<
+  std::shared_ptr<ModelAPI_AttributeReference> aObjRef = std::dynamic_pointer_cast<
       ModelAPI_AttributeReference>(data()->attribute(theAttrName));
   if (aObjRef) {
-    boost::shared_ptr<ModelAPI_ResultBody> aConstr = boost::dynamic_pointer_cast<
+    std::shared_ptr<ModelAPI_ResultBody> aConstr = std::dynamic_pointer_cast<
         ModelAPI_ResultBody>(aObjRef->value());
     if (aConstr)
       return aConstr->shape();
   }
-  return boost::shared_ptr<GeomAPI_Shape>();
+  return std::shared_ptr<GeomAPI_Shape>();
 }
 
 
 void FeaturesPlugin_Boolean::execute()
 {
-  boost::shared_ptr<GeomAPI_Shape> aObject = this->getShape(FeaturesPlugin_Boolean::OBJECT_ID());
-  if (!aObject)
+  std::shared_ptr<ModelAPI_AttributeInteger> aTypeAttr = std::dynamic_pointer_cast<
+      ModelAPI_AttributeInteger>(data()->attribute(FeaturesPlugin_Boolean::TYPE_ID()));
+  if (!aTypeAttr)
     return;
+  int aType = aTypeAttr->value();
 
-  boost::shared_ptr<GeomAPI_Shape> aTool = this->getShape(FeaturesPlugin_Boolean::TOOL_ID());
+  std::shared_ptr<GeomAPI_Shape> anObject = this->getShape(FeaturesPlugin_Boolean::OBJECT_ID());
+  if (!anObject)
+    return;
+
+  std::shared_ptr<GeomAPI_Shape> aTool = this->getShape(FeaturesPlugin_Boolean::TOOL_ID());
   if (!aTool)
     return;
 
-  boost::shared_ptr<ModelAPI_ResultBody> aResult = document()->createBody(data());
-  aResult->store(GeomAlgoAPI_Boolean::makeCut(aObject, aTool));
-  setResult(aResult);
-}
\ No newline at end of file
+  std::shared_ptr<ModelAPI_ResultBody> aResultBody = document()->createBody(data());
+
+  GeomAlgoAPI_Boolean* aFeature = new GeomAlgoAPI_Boolean(anObject, aTool, aType);
+  if(aFeature && !aFeature->isDone()) {
+    static const std::string aFeatureError = "Boolean feature: algorithm failed";  
+    setError(aFeatureError);
+    return;
+  }
+   // Check if shape is valid
+  if (aFeature->shape()->isNull()) {
+    static const std::string aShapeError = "Boolean feature: resulting shape is Null";     
+    setError(aShapeError);
+    return;
+  }
+  if(!aFeature->isValid()) {
+    static const std::string aFeatureError = "Boolean feature: resulting shape is not valid";  
+    setError(aFeatureError);
+    return;
+  }  
+  // if result of Boolean operation is same as was before it means that Boolean operation has no sence
+  // and naming provides no result, so, generate an error in this case
+  if (anObject->isEqual(aFeature->shape())) {
+    static const std::string aFeatureError = "Boolean feature: operation was not performed";  
+    setError(aFeatureError);
+    return;
+  }
+  //LoadNamingDS
+  LoadNamingDS(aFeature, aResultBody, anObject, aTool, aType);
+
+  setResult(aResultBody);
+}
+
+//============================================================================
+void FeaturesPlugin_Boolean::LoadNamingDS(GeomAlgoAPI_Boolean* theFeature, 
+                                               std::shared_ptr<ModelAPI_ResultBody> theResultBody, 
+                                               std::shared_ptr<GeomAPI_Shape> theObject,
+                                               std::shared_ptr<GeomAPI_Shape> theTool,
+                                               int theType)
+{  
+
+  //load result
+  theResultBody->storeModified(theObject, theFeature->shape()); 
+
+  GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape();
+  theFeature->mapOfShapes(*aSubShapes);
+
+  // Put in DF modified faces
+  std::string aModName = "Modified";
+  theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theObject, FACE, _MODIFY_TAG, aModName, *aSubShapes);
+  theResultBody->loadAndOrientModifiedShapes(theFeature->makeShape(), theTool,   FACE, _MODIFY_TAG, aModName, *aSubShapes);
+
+  //Put in DF deleted faces
+  theResultBody->loadDeletedShapes(theFeature->makeShape(), theObject, FACE, _DELETED_TAG);
+  theResultBody->loadDeletedShapes(theFeature->makeShape(), theTool,   FACE, _DELETED_TAG);  
+}