Salome HOME
Implement MakeVolume algorithm
authorazv <azv@opencascade.com>
Tue, 21 Nov 2017 07:19:19 +0000 (10:19 +0300)
committerazv <azv@opencascade.com>
Wed, 22 Nov 2017 06:38:55 +0000 (09:38 +0300)
src/GeomAlgoAPI/CMakeLists.txt
src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.cpp [new file with mode: 0644]
src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.h [new file with mode: 0644]

index 43727cf248cef9df30622283f38825a619ce950c..78ca7b9d6f3d226184b19d46e5327797c9de3204 100644 (file)
@@ -40,6 +40,7 @@ SET(PROJECT_HEADERS
     GeomAlgoAPI_MakeShapeCustom.h
     GeomAlgoAPI_MakeShapeList.h
     GeomAlgoAPI_MakeSweep.h
+    GeomAlgoAPI_MakeVolume.h
     GeomAlgoAPI_DFLoader.h
     GeomAlgoAPI_Placement.h
     GeomAlgoAPI_BREPImport.h
@@ -90,6 +91,7 @@ SET(PROJECT_SOURCES
     GeomAlgoAPI_MakeShapeCustom.cpp
     GeomAlgoAPI_MakeShapeList.cpp
     GeomAlgoAPI_MakeSweep.cpp
+    GeomAlgoAPI_MakeVolume.cpp
     GeomAlgoAPI_DFLoader.cpp
     GeomAlgoAPI_Placement.cpp
     GeomAlgoAPI_BREPImport.cpp
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.cpp
new file mode 100644 (file)
index 0000000..50a6971
--- /dev/null
@@ -0,0 +1,97 @@
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
+
+#include "GeomAlgoAPI_MakeVolume.h"
+
+#include <GeomAlgoAPI_ShapeTools.h>
+
+#include <BOPAlgo_MakerVolume.hxx>
+
+//=================================================================================================
+std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeVolume::make(const ListOfShape& theFaces)
+{
+  GeomAlgoAPI_MakeVolume aMkVolAlgo(theFaces);
+  GeomShapePtr aResult;
+  if(aMkVolAlgo.isDone() && !aMkVolAlgo.shape()->isNull() && aMkVolAlgo.isValid())
+    aResult = aMkVolAlgo.shape();
+  return aResult;
+}
+
+//=================================================================================================
+GeomAlgoAPI_MakeVolume::GeomAlgoAPI_MakeVolume(const ListOfShape& theFaces)
+{
+  build(theFaces);
+}
+
+static void convertToTopoDS(const ListOfShape& theShapes, TopTools_ListOfShape& theTopoDSShapes)
+{
+  for (ListOfShape::const_iterator anIt = theShapes.begin(); anIt != theShapes.end(); ++anIt)
+    theTopoDSShapes.Append((*anIt)->impl<TopoDS_Shape>());
+}
+
+//=================================================================================================
+void GeomAlgoAPI_MakeVolume::build(const ListOfShape& theFaces)
+{
+  if (theFaces.empty()) {
+    return;
+  }
+
+  // create make volume opration
+  BOPAlgo_MakerVolume* aVolumeMaker = new BOPAlgo_MakerVolume;
+  this->setImpl(aVolumeMaker);
+  this->setBuilderType(OCCT_BOPAlgo_Builder);
+
+  // list of arguments
+  TopTools_ListOfShape anArgs;
+  convertToTopoDS(theFaces, anArgs);
+
+  // parameters of the volume maker
+  aVolumeMaker->SetArguments(anArgs);
+  aVolumeMaker->SetIntersect(true); // split edges and faces
+  aVolumeMaker->SetAvoidInternalShapes(true);
+  aVolumeMaker->SetGlue(BOPAlgo_GlueShift);
+
+  // building and getting result
+  aVolumeMaker->Perform();
+#ifdef USE_OCCT_720
+  if (aVolumeMaker->HasErrors())
+    return;
+#else
+  if(aVolumeMaker->ErrorStatus() != 0) {
+    return;
+  }
+#endif
+  TopoDS_Shape aResult = aVolumeMaker->Shape();
+
+  if(aResult.ShapeType() == TopAbs_COMPOUND) {
+    std::shared_ptr<GeomAPI_Shape> aGeomShape(new GeomAPI_Shape);
+    aGeomShape->setImpl(new TopoDS_Shape(aResult));
+    aResult = GeomAlgoAPI_ShapeTools::groupSharedTopology(aGeomShape)->impl<TopoDS_Shape>();
+  }
+
+  // Setting result.
+  if(aResult.IsNull()) {
+    return;
+  }
+  std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
+  aShape->setImpl(new TopoDS_Shape(aResult));
+  this->setShape(aShape);
+  this->setDone(true);
+}
diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.h b/src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.h
new file mode 100644 (file)
index 0000000..b273fb4
--- /dev/null
@@ -0,0 +1,48 @@
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
+
+#ifndef GeomAlgoAPI_MakeVolume_H_
+#define GeomAlgoAPI_MakeVolume_H_
+
+#include <GeomAlgoAPI.h>
+#include <GeomAlgoAPI_MakeShape.h>
+
+#include <GeomAPI_Shape.h>
+
+/// \class GeomAlgoAPI_MakeVolume
+/// \ingroup DataAlgo
+/// \brief Perform building solid (compsolid) from a list of faces.
+class GeomAlgoAPI_MakeVolume : public GeomAlgoAPI_MakeShape
+{
+public:
+  /// \brief Perform making volume.
+  /// \param[in] theObjects list of faces.
+  /// \return a solid or a compsolid as result of operation.
+  GEOMALGOAPI_EXPORT static std::shared_ptr<GeomAPI_Shape> make(const ListOfShape& theFaces);
+
+  /// Constructor.
+  GEOMALGOAPI_EXPORT GeomAlgoAPI_MakeVolume(const ListOfShape& theFaces);
+
+private:
+  /// Builds resulting shape.
+  void build(const ListOfShape& theFaces);
+};
+
+#endif