]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
GeomAlgoAPI_Partition now derived from GeomAlgoAPI_MakeShape
authordbv <dbv@opencascade.com>
Wed, 23 Dec 2015 16:00:34 +0000 (19:00 +0300)
committerdbv <dbv@opencascade.com>
Thu, 24 Dec 2015 07:57:26 +0000 (10:57 +0300)
src/FeaturesPlugin/FeaturesPlugin_Partition.cpp
src/FeaturesPlugin/FeaturesPlugin_Partition.h
src/GeomAlgoAPI/GeomAlgoAPI_Partition.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Partition.h

index 94b7f4bcebaedc02a626d62dc782a610b804e61e..e7e74c68e91a6d69aab4e473bb11793e084df74c 100755 (executable)
@@ -48,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()
 {
@@ -122,30 +108,30 @@ void FeaturesPlugin_Partition::execute()
       anObjects.clear();
       anObjects.push_back(aCompoud);
     }
-    GeomAlgoAPI_Partition aPartitionAlgo(anObjects, aTools);
+    std::shared_ptr<GeomAlgoAPI_Partition> aPartitionAlgo(new GeomAlgoAPI_Partition(anObjects, aTools));
 
     // Checking that the algorithm worked properly.
-    if (!aPartitionAlgo.isDone()) {
+    if (!aPartitionAlgo->isDone()) {
       static const std::string aFeatureError = "Partition algorithm failed";
       setError(aFeatureError);
       return;
     }
-    if (aPartitionAlgo.shape()->isNull()) {
+    if (aPartitionAlgo->shape()->isNull()) {
       static const std::string aShapeError = "Resulting shape is Null";
       setError(aShapeError);
       return;
     }
-    if (!aPartitionAlgo.isValid()) {
+    if (!aPartitionAlgo->isValid()) {
       std::string aFeatureError = "Warning: 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.appendAlgo(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();
+      loadNamingDS(aResultBody, anObjects.front(), aToolsForNaming, aPartitionAlgo->shape(), aMakeShapeList, aMapOfShapes);
       setResult(aResultBody, aResultIndex);
       aResultIndex++;
     }
@@ -154,30 +140,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()) {
+      if (!aPartitionAlgo->isDone()) {
         static const std::string aFeatureError = "Partition algorithm failed";
         setError(aFeatureError);
         return;
       }
-      if (aPartitionAlgo.shape()->isNull()) {
+      if (aPartitionAlgo->shape()->isNull()) {
         static const std::string aShapeError = "Resulting shape is Null";
         setError(aShapeError);
         return;
       }
-      if (!aPartitionAlgo.isValid()) {
+      if (!aPartitionAlgo->isValid()) {
         std::string aFeatureError = "Warning: 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.appendAlgo(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++;
       }
index eaa17dd232f7cecf63aec6bd0bd72f106c69deed..bd7d7a7c5fe1f71a9a9c88ba917ea18bf67af1e4 100755 (executable)
 
 #include <GeomAlgoAPI_Partition.h>
 
-/**\class FeaturesPlugin_Partition
- * \ingroup Plugins
- * \brief Feature for applying of Partition operations on Solids. Partition makes conjunctional
- * faces of solids as shared. The result of partitions is a compsolid.
- * Main objects are solids, tool objects are solids or faces
- */
+/// \class FeaturesPlugin_Partition
+/// \ingroup Plugins
+/// \brief Feature for applying of Partition operations on Solids. Partition makes conjunctional
+/// faces of solids as shared. The result of partitions is a compsolid.
+/// Main objects are solids, tool objects are solids or faces
 class FeaturesPlugin_Partition : public ModelAPI_Feature
 {
 public:
@@ -64,8 +63,6 @@ public:
   FeaturesPlugin_Partition();
 
 private:
-  std::shared_ptr<GeomAPI_Shape> getShape(const std::string& theAttrName);
-
   /// Load Naming data structure of the feature to the document
   void loadNamingDS(std::shared_ptr<ModelAPI_ResultBody> theResultBody,
                     const std::shared_ptr<GeomAPI_Shape> theBaseShape,
index 425c71e13cdc3a883cd56a40a49a205660e94357..63a1ddc9e4b87a9cf3aaa7a27e72e73f30518ebe 100644 (file)
 
 #include <GEOMAlgo_Splitter.hxx>
 
-#include <Bnd_Box.hxx>
-#include <BRep_Tool.hxx>
-#include <BRepBndLib.hxx>
-#include <BRepCheck_Analyzer.hxx>
-#include <BRepLib_MakeFace.hxx>
-#include <BRepTools.hxx>
-#include <Geom_Plane.hxx>
-#include <GeomLib_IsPlanarSurface.hxx>
-#include <GeomLib_Tool.hxx>
-#include <IntAna_IntConicQuad.hxx>
-#include <IntAna_Quadric.hxx>
-#include <Precision.hxx>
 #include <TopExp_Explorer.hxx>
-#include <TopoDS.hxx>
 #include <TopoDS_Builder.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopTools_ListOfShape.hxx>
 
 //=================================================================================================
 std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Partition::make(const ListOfShape& theObjects,
                                                            const ListOfShape& theTools)
 {
-  GeomAlgoAPI_Partition aBoolAlgo(theObjects, theTools);
-  if(aBoolAlgo.isDone() && !aBoolAlgo.shape()->isNull() && aBoolAlgo.isValid()) {
-    return aBoolAlgo.shape();
+  GeomAlgoAPI_Partition aPartitionAlgo(theObjects, theTools);
+  if(aPartitionAlgo.isDone() && !aPartitionAlgo.shape()->isNull() && aPartitionAlgo.isValid()) {
+    return aPartitionAlgo.shape();
   }
   return std::shared_ptr<GeomAPI_Shape>();
 }
@@ -43,7 +28,6 @@ std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Partition::make(const ListOfShape& th
 //=================================================================================================
 GeomAlgoAPI_Partition::GeomAlgoAPI_Partition(const ListOfShape& theObjects,
                                              const ListOfShape& theTools)
-: myDone(false)
 {
   build(theObjects, theTools);
 }
@@ -59,7 +43,8 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects,
 
   // Creating partition operation.
   GEOMAlgo_Splitter* anOperation = new GEOMAlgo_Splitter;
-  myMkShape.reset(new GeomAlgoAPI_MakeShape(anOperation, GeomAlgoAPI_MakeShape::OCCT_BOPAlgo_Builder));
+  this->setImpl(anOperation);
+  this->setBuilderType(OCCT_BOPAlgo_Builder);
 
   // Getting objects.
   for (ListOfShape::const_iterator anObjectsIt = theObjects.begin(); anObjectsIt != theObjects.end(); anObjectsIt++) {
@@ -75,11 +60,10 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects,
 
   // Building and getting result.
   anOperation->Perform();
-  TopoDS_Shape aResult = anOperation->Shape();
-  myDone = !aResult.IsNull();
-  if (!myDone) {
+  if(anOperation->ErrorStatus() != 0) {
     return;
   }
+  TopoDS_Shape aResult = anOperation->Shape();
 
   if(aResult.ShapeType() == TopAbs_COMPOUND) {
     aResult = GeomAlgoAPI_DFLoader::refineResult(aResult);
@@ -105,44 +89,8 @@ void GeomAlgoAPI_Partition::build(const ListOfShape& theObjects,
     }
   }
 
-  // fill data map to keep correct orientation of sub-shapes
-  myMap.reset(new GeomAPI_DataMapOfShapeShape());
-  for (TopExp_Explorer Exp(aResult,TopAbs_FACE); Exp.More(); Exp.Next()) {
-    std::shared_ptr<GeomAPI_Shape> aCurrentShape(new GeomAPI_Shape());
-    aCurrentShape->setImpl(new TopoDS_Shape(Exp.Current()));
-    myMap->bind(aCurrentShape, aCurrentShape);
-  }
-  myShape.reset(new GeomAPI_Shape());
-  myShape->setImpl(new TopoDS_Shape(aResult));
-}
-
-//=================================================================================================
-const bool GeomAlgoAPI_Partition::isDone() const
-{
-  return myDone;
-}
-
-//=================================================================================================
-const bool GeomAlgoAPI_Partition::isValid() const
-{
-  BRepCheck_Analyzer aChecker(myShape->impl<TopoDS_Shape>());
-  return (aChecker.IsValid() == Standard_True);
-}
-
-//=================================================================================================
-const std::shared_ptr<GeomAPI_Shape>& GeomAlgoAPI_Partition::shape() const
-{
-  return myShape;
-}
-
-//=================================================================================================
-std::shared_ptr<GeomAPI_DataMapOfShapeShape> GeomAlgoAPI_Partition::mapOfShapes() const
-{
-  return myMap;
-}
-
-//=================================================================================================
-std::shared_ptr<GeomAlgoAPI_MakeShape> GeomAlgoAPI_Partition::makeShape() const
-{
-  return myMkShape;
+  std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
+  aShape->setImpl(new TopoDS_Shape(aResult));
+  this->setShape(aShape);
+  this->setDone(true);
 }
index 39f69b5fe69d7d6f6667b9ea6b69d330ea40575e..ea214adde141df6678ade9dba4f7463e8c7f2935 100644 (file)
 #include <GeomAlgoAPI_MakeShape.h>
 
 #include <GeomAPI_Shape.h>
-#include <GeomAPI_Interface.h>
-#include <GeomAPI_DataMapOfShapeShape.h>
 
-#include <memory>
-
-/** \class GeomAlgoAPI_Partition
- *  \ingroup DataAlgo
- *  \brief Allows to perform of partition operations
- */
-class GeomAlgoAPI_Partition : public GeomAPI_Interface
+/// \class GeomAlgoAPI_Partition
+/// \ingroup DataAlgo
+/// \brief Allows to perform of partition operations
+class GeomAlgoAPI_Partition : public GeomAlgoAPI_MakeShape
 {
 public:
-  /** \brief Creates common partition operation.
-   *  \param[in] theObjects the main shape.
-   *  \param[in] theTools  second shape.
-   *  \return a solid as result of operation.
-   */
+  /// \brief Creates common partition operation.
+  /// \param[in] theObjects the main shape.
+  /// \param[in] theTools  second shape.
+  /// \return a solid as result of operation.
   GEOMALGOAPI_EXPORT static std::shared_ptr<GeomAPI_Shape> make(const ListOfShape& theObjects,
                                                                 const ListOfShape& theTools);
 
@@ -35,32 +29,10 @@ public:
   GEOMALGOAPI_EXPORT GeomAlgoAPI_Partition(const ListOfShape& theObjects,
                                            const ListOfShape& theTools);
 
-  /// \return true if algorithm succeed.
-  GEOMALGOAPI_EXPORT const bool isDone() const;
-
-  /// \return true if resulting shape is valid.
-  GEOMALGOAPI_EXPORT const bool isValid() const;
-
-  /// \return result of the boolean algorithm.
-  GEOMALGOAPI_EXPORT const std::shared_ptr<GeomAPI_Shape>& shape() const;
-
-  /// \return map of sub-shapes of the result. To be used for History keeping.
-  GEOMALGOAPI_EXPORT std::shared_ptr<GeomAPI_DataMapOfShapeShape> mapOfShapes() const;
-
-  /// \return interface for for History processing.
-  GEOMALGOAPI_EXPORT std::shared_ptr<GeomAlgoAPI_MakeShape> makeShape() const;
-
 private:
   /// Builds resulting shape.
   void build(const ListOfShape& theObjects,
              const ListOfShape& theTools);
-
-private:
-  /// Fields.
-  bool myDone;
-  std::shared_ptr<GeomAPI_Shape> myShape;
-  std::shared_ptr<GeomAPI_DataMapOfShapeShape> myMap;
-  std::shared_ptr<GeomAlgoAPI_MakeShape> myMkShape;
 };
 
 #endif