X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_ShapeBuilder.cpp;h=cb25126c54996aa879b9e14ea525a87e027c61de;hb=09365c927ebe8d881de2eda7f96bc33a2d9511c8;hp=eea9ae9120de9d4ccb474dde168e8483fcc31f6e;hpb=9a9079c59a6aaefb49725080f178559415482a19;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp index eea9ae912..cb25126c5 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: GeomAlgoAPI_ShapeBuilder.cpp -// Created: 27 April 2016 -// Author: Dmitry Bobylev +// Copyright (C) 2014-2019 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_ShapeBuilder.h" @@ -60,38 +73,55 @@ GeomAlgoAPI_ShapeBuilder::GeomAlgoAPI_ShapeBuilder() //================================================================================================== void GeomAlgoAPI_ShapeBuilder::removeInternal(const std::shared_ptr theShape) { - GeomShapePtr aResultShape = theShape->emptyCopied(); + GeomShapePtr aResultShape; + GeomAPI_Shape::ShapeType aBaseShapeType = theShape->shapeType(); - std::shared_ptr aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); - for(GeomAPI_ShapeIterator anIter(theShape); anIter.more(); anIter.next()) { - GeomShapePtr aSubShape = anIter.current(); - if(aBaseShapeType == GeomAPI_Shape::WIRE) { + if(aBaseShapeType == GeomAPI_Shape::WIRE) { + aResultShape = theShape->emptyCopied(); + std::shared_ptr + aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); + for(GeomAPI_ShapeIterator anIter(theShape); anIter.more(); anIter.next()) { + GeomShapePtr aSubShape = anIter.current(); GeomShapePtr aSubShapeCopy = aSubShape->emptyCopied(); - aMakeShapeCustom->addModified(aSubShape, aSubShapeCopy); for(GeomAPI_ShapeIterator aSubIter(aSubShape); aSubIter.more(); aSubIter.next()) { GeomShapePtr aSubOfSubShape = aSubIter.current(); if(aSubOfSubShape->orientation() != GeomAPI_Shape::INTERNAL) { GeomAlgoAPI_ShapeBuilder::add(aSubShapeCopy, aSubOfSubShape); } } + aMakeShapeCustom->addModified(aSubShape, aSubShapeCopy); GeomAlgoAPI_ShapeBuilder::add(aResultShape, aSubShapeCopy); - } else if(aBaseShapeType == GeomAPI_Shape::FACE) { - if(aSubShape->shapeType() == GeomAPI_Shape::WIRE - && aSubShape->orientation() != GeomAPI_Shape::INTERNAL) { - GeomAlgoAPI_ShapeBuilder::add(aResultShape, aSubShape); + } + this->appendAlgo(aMakeShapeCustom); + } else if(aBaseShapeType == GeomAPI_Shape::FACE) { + const TopoDS_Shape& aBaseShape = theShape->impl(); + BRepBuilderAPI_Copy* aCopyBuilder = new BRepBuilderAPI_Copy(aBaseShape); + this->appendAlgo(std::shared_ptr( + new GeomAlgoAPI_MakeShape(aCopyBuilder))); + if(!aCopyBuilder->IsDone()) { + return; + } + TopoDS_Shape aShape = aCopyBuilder->Shape(); + TopoDS_Shape aShapeCopy = aShape.EmptyCopied(); + BRep_Builder aBuilder; + for(TopoDS_Iterator anIt(aShape); anIt.More(); anIt.Next()) { + const TopoDS_Shape& aSubShape = anIt.Value(); + if(aSubShape.ShapeType() == TopAbs_WIRE + && aSubShape.Orientation() != TopAbs_INTERNAL) { + aBuilder.Add(aShapeCopy, aSubShape); } } + aResultShape.reset(new GeomAPI_Shape()); + aResultShape->setImpl(new TopoDS_Shape(aShapeCopy)); } - this->appendAlgo(aMakeShapeCustom); - setShape(aResultShape); setDone(true); } //================================================================================================== -void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape, - const ListOfShape& theShapesToAdd) +void GeomAlgoAPI_ShapeBuilder::addInternal(const std::shared_ptr theShape, + const ListOfShape& theShapesToAdd) { // Get base shape. if(!theShape.get()) { @@ -101,7 +131,7 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape TopAbs_ShapeEnum aBaseShapeType = aBaseShape.ShapeType(); // Copy base shape. - BRepBuilderAPI_Copy* aCopyBuilder = new BRepBuilderAPI_Copy(aBaseShape, Standard_False); + BRepBuilderAPI_Copy* aCopyBuilder = new BRepBuilderAPI_Copy(aBaseShape); this->appendAlgo(std::shared_ptr(new GeomAlgoAPI_MakeShape(aCopyBuilder))); if(!aCopyBuilder->IsDone()) { return; @@ -111,8 +141,11 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape // Copy sub-shapes from list to new shape. BRep_Builder aBuilder; std::shared_ptr aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); - for(ListOfShape::const_iterator anIt = theShapesToAdd.cbegin(); anIt != theShapesToAdd.cend(); ++anIt) { + for(ListOfShape::const_iterator + anIt = theShapesToAdd.cbegin(); anIt != theShapesToAdd.cend(); ++anIt) { TopoDS_Shape aShapeToAdd = (*anIt)->impl(); + TopoDS_Shape aModShapeToAdd = aShapeToAdd; + aModShapeToAdd.Orientation(TopAbs_INTERNAL); for(TopExp_Explorer aResExp(aResultShape, TopAbs_VERTEX); aResExp.More(); aResExp.Next()) { const TopoDS_Vertex& aVertexInRes = TopoDS::Vertex(aResExp.Current()); const gp_Pnt aPntInRes = BRep_Tool::Pnt(aVertexInRes); @@ -124,22 +157,24 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape TopoDS_Shape aVertexInResMod = aVertexInRes; aVertexInResMod.Orientation(aVertexInAdd.Orientation()); aReShape.Replace(aVertexInAdd, aVertexInResMod); - TopoDS_Shape aModShape = aReShape.Apply(aShapeToAdd); - - GeomShapePtr aGeomBaseShape(new GeomAPI_Shape()); - GeomShapePtr aGeomModShape(new GeomAPI_Shape()); - aGeomBaseShape->setImpl(new TopoDS_Shape(aShapeToAdd)); - aGeomModShape->setImpl(new TopoDS_Shape(aModShape)); - aMakeShapeCustom->addModified(aGeomBaseShape, aGeomModShape); - aShapeToAdd = aModShape; + aModShapeToAdd = aReShape.Apply(aModShapeToAdd); } } } + + GeomShapePtr aGeomBaseShape(new GeomAPI_Shape()); + GeomShapePtr aGeomModShape(new GeomAPI_Shape()); + aGeomBaseShape->setImpl(new TopoDS_Shape(aShapeToAdd)); + aGeomModShape->setImpl(new TopoDS_Shape(aModShapeToAdd)); + aMakeShapeCustom->addModified(aGeomBaseShape, aGeomModShape); + aShapeToAdd = aModShapeToAdd; + TopAbs_ShapeEnum aShapeToAddType = aShapeToAdd.ShapeType(); if(aBaseShapeType == TopAbs_WIRE) { if(aShapeToAddType == TopAbs_VERTEX) { // Find on which edge vertex is lie and add to this edge. - for(TopExp_Explorer aResultExp(aResultShape, TopAbs_EDGE); aResultExp.More(); aResultExp.Next()) { + for(TopExp_Explorer + aResultExp(aResultShape, TopAbs_EDGE); aResultExp.More(); aResultExp.Next()) { TopoDS_Shape anEdge = aResultExp.Current(); BRepExtrema_DistShapeShape aDist(anEdge, aShapeToAdd); aDist.Perform(); @@ -153,8 +188,8 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape } } } - } else if(aBaseShapeType == GeomAPI_Shape::FACE) { - if(aShapeToAddType == GeomAPI_Shape::EDGE) { + } else if(aBaseShapeType == TopAbs_FACE) { + if(aShapeToAddType == TopAbs_EDGE) { aShapeToAdd.Orientation(TopAbs_INTERNAL); TopoDS_Wire aWire; aBuilder.MakeWire(aWire);