X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_MakeShape.cpp;h=916feb8142afc338f158f68bd5578f0daecab1c2;hb=f2f34e30b41047d12277ad87e1adf6c0e410e4ff;hp=3b0d3ca8b2462b5b33812439740a31d5be284cf9;hpb=0d9a107853208317a6352bb7f8c77eb54d5efbe1;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp index 3b0d3ca8b..916feb814 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_MakeShape.cpp @@ -1,21 +1,39 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D +// 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 +// -// File: GeomAlgoAPI_MakeShape.cpp -// Created: 20 Oct 2014 -// Author: Sergey ZARITCHNY - -#include +#include "GeomAlgoAPI_MakeShape.h" #include #include -#include +#include +#include +#include +#include #include #include #include +#include //================================================================================================= GeomAlgoAPI_MakeShape::GeomAlgoAPI_MakeShape() -: myBuilderType(OCCT_BRepBuilderAPI_MakeShape), +: myBuilderType(Unknown), myDone(false) { } @@ -32,6 +50,33 @@ const std::shared_ptr GeomAlgoAPI_MakeShape::shape() const return myShape; } +//================================================================================================= +bool GeomAlgoAPI_MakeShape::isValid() const +{ + BRepCheck_Analyzer aChecker(myShape->impl()); + return (aChecker.IsValid() == Standard_True); +} + +//================================================================================================= +bool GeomAlgoAPI_MakeShape::hasVolume() const +{ + bool hasVolume = false; + if(isValid()) { + const TopoDS_Shape& aRShape = myShape->impl(); + GProp_GProps aGProp; + BRepGProp::VolumeProperties(aRShape, aGProp); + if(aGProp.Mass() > Precision::Confusion()) + hasVolume = true; + } + return hasVolume; +} + +//================================================================================================= +std::shared_ptr GeomAlgoAPI_MakeShape::mapOfSubShapes() const +{ + return myMap; +} + //================================================================================================= void GeomAlgoAPI_MakeShape::generated(const std::shared_ptr theShape, ListOfShape& theHistory) @@ -61,7 +106,10 @@ void GeomAlgoAPI_MakeShape::modified(const std::shared_ptr theSha TopTools_ListOfShape aList; if(myBuilderType == OCCT_BRepBuilderAPI_MakeShape) { BRepBuilderAPI_MakeShape* aMakeShape = implPtr(); - aList = aMakeShape->Modified(theShape->impl()); + try { + aList = aMakeShape->Modified(theShape->impl()); + } catch(Standard_NoSuchObject) { + } } else if(myBuilderType == OCCT_BOPAlgo_Builder) { BOPAlgo_Builder* aBOPBuilder = implPtr(); aList = aBOPBuilder->Modified(theShape->impl()); @@ -106,7 +154,41 @@ void GeomAlgoAPI_MakeShape::setDone(const bool theFlag) //================================================================================================= void GeomAlgoAPI_MakeShape::setShape(const std::shared_ptr theShape) { + if(myShape.get() && myShape->isEqual(theShape)) { + return; + } + myShape = theShape; + + // Filling data map to keep correct orientation of sub-shapes. + if(myShape.get()) { + if(myMap.get()) { + myMap->clear(); + } else { + myMap.reset(new GeomAPI_DataMapOfShapeShape); + } + + const TopoDS_Shape& aTopoDSShape = myShape->impl(); + for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_VERTEX); anExp.More(); anExp.Next()) { + std::shared_ptr aCurrentShape(new GeomAPI_Shape()); + aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current())); + myMap->bind(aCurrentShape, aCurrentShape); + } + for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_EDGE); anExp.More(); anExp.Next()) { + std::shared_ptr aCurrentShape(new GeomAPI_Shape()); + aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current())); + myMap->bind(aCurrentShape, aCurrentShape); + } + for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_FACE); anExp.More(); anExp.Next()) { + std::shared_ptr aCurrentShape(new GeomAPI_Shape()); + aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current())); + myMap->bind(aCurrentShape, aCurrentShape); + } + } else { + if(myMap.get()) { + myMap->clear(); + } + } } //================================================================================================= @@ -125,4 +207,56 @@ void GeomAlgoAPI_MakeShape::initialize() { break; } } + + if(myMap.get()) { + myMap->clear(); + } else { + myMap.reset(new GeomAPI_DataMapOfShapeShape); + } + + const TopoDS_Shape& aTopoDSShape = myShape->impl(); + for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_FACE); anExp.More(); anExp.Next()) { + std::shared_ptr aCurrentShape(new GeomAPI_Shape()); + aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current())); + myMap->bind(aCurrentShape, aCurrentShape); + } +} + + +//================================================================================================= +void GeomAlgoAPI_MakeShape::prepareNamingFaces() +{ + long long index = 1; + GeomAPI_ShapeExplorer anExp(shape(), GeomAPI_Shape::FACE); + for(GeomAPI_ShapeExplorer anExp(shape(), GeomAPI_Shape::FACE); anExp.more(); anExp.next()) { + std::shared_ptr aFace = anExp.current(); + myCreatedFaces["Face_" + std::to_string(index++)] = aFace; + } } + + +//================================================================================================= +bool GeomAlgoAPI_MakeShape::checkValid(std::string theMessage){ + + // isValid() is called from this method + if (!isValid()) { + myError = theMessage + " :: resulting shape is not valid."; + return false; + } + + // Check the number of volumes in myShape, make sure there's one and only one. + TopoDS_Shape aTopoDSShape = myShape->impl(); + int aNbVolumes = 0; + for(TopExp_Explorer anExp(aTopoDSShape,TopAbs_SOLID); anExp.More(); anExp.Next()) { + aNbVolumes ++; + } + + if (aNbVolumes != 1) { + myError = theMessage + + " :: connexity error, the resulting shape is made of several separate solids."; + return false; + } + + return true ; +} +