X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_ShapeBuilder.cpp;h=d710493b9cb46abc2374678f7aa5eb55bf7a0b93;hb=d8101383b10bf780a1acf5a356007ad6dbf17711;hp=eea9ae9120de9d4ccb474dde168e8483fcc31f6e;hpb=9a9079c59a6aaefb49725080f178559415482a19;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp index eea9ae912..d710493b9 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeBuilder.cpp @@ -60,38 +60,53 @@ 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 +116,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; @@ -113,6 +128,8 @@ void GeomAlgoAPI_ShapeBuilder::add(const std::shared_ptr theShape std::shared_ptr aMakeShapeCustom(new GeomAlgoAPI_MakeShapeCustom()); 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,17 +141,18 @@ 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) {