From: azv Date: Tue, 21 Nov 2017 07:19:19 +0000 (+0300) Subject: Implement MakeVolume algorithm X-Git-Tag: V_2.10.0RC~151 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=2c8455ba268cb7142fe59ee13421911385a1f423;p=modules%2Fshaper.git Implement MakeVolume algorithm --- diff --git a/src/GeomAlgoAPI/CMakeLists.txt b/src/GeomAlgoAPI/CMakeLists.txt index 43727cf24..78ca7b9d6 100644 --- a/src/GeomAlgoAPI/CMakeLists.txt +++ b/src/GeomAlgoAPI/CMakeLists.txt @@ -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 index 000000000..50a69711b --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.cpp @@ -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 +// + +#include "GeomAlgoAPI_MakeVolume.h" + +#include + +#include + +//================================================================================================= +std::shared_ptr 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()); +} + +//================================================================================================= +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 aGeomShape(new GeomAPI_Shape); + aGeomShape->setImpl(new TopoDS_Shape(aResult)); + aResult = GeomAlgoAPI_ShapeTools::groupSharedTopology(aGeomShape)->impl(); + } + + // Setting result. + if(aResult.IsNull()) { + return; + } + std::shared_ptr 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 index 000000000..b273fb4cd --- /dev/null +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeVolume.h @@ -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 +// + +#ifndef GeomAlgoAPI_MakeVolume_H_ +#define GeomAlgoAPI_MakeVolume_H_ + +#include +#include + +#include + +/// \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 make(const ListOfShape& theFaces); + + /// Constructor. + GEOMALGOAPI_EXPORT GeomAlgoAPI_MakeVolume(const ListOfShape& theFaces); + +private: + /// Builds resulting shape. + void build(const ListOfShape& theFaces); +}; + +#endif