X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_ShapeTools.cpp;h=39b06f92723b9cfe1ed4c8082a617234fd75ce5d;hb=580f1752efd9d3e8c2890c4016b04dafd639bab7;hp=6955720e2f46bd3cfcc165f2a03fb673414020af;hpb=8fbee802bd4c0e7c7e2a1d23e4b800174373f932;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp index 6955720e2..39b06f927 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp @@ -8,15 +8,23 @@ #include +#include + #include +#include #include #include +#include +#include #include #include #include #include +#include #include #include +#include + //================================================================================================= double GeomAlgoAPI_ShapeTools::volume(std::shared_ptr theShape) @@ -88,16 +96,22 @@ void GeomAlgoAPI_ShapeTools::combineShapes(const std::shared_ptr continue; } else if(aListOfShape.Size() == 1) { - aFreeShapes.Add(aListOfShape.First()); + const TopoDS_Shape& aF = aListOfShape.First(); + aFreeShapes.Add(aF); aListOfShape.Clear(); } else { + NCollection_List aTempList; NCollection_Map aTempMap; - aTempMap.Add(aListOfShape.First()); - aTempMap.Add(aListOfShape.Last()); - aFreeShapes.Remove(aListOfShape.First()); - aFreeShapes.Remove(aListOfShape.Last()); + const TopoDS_Shape& aF = aListOfShape.First(); + const TopoDS_Shape& aL = aListOfShape.Last(); + aTempList.Append(aF); + aTempList.Append(aL); + aTempMap.Add(aF); + aTempMap.Add(aL); + aFreeShapes.Remove(aF); + aFreeShapes.Remove(aL); aListOfShape.Clear(); - for(NCollection_Map::Iterator aTempIter(aTempMap); aTempIter.More(); aTempIter.Next()) { + for(NCollection_List::Iterator aTempIter(aTempList); aTempIter.More(); aTempIter.Next()) { const TopoDS_Shape& aTempShape = aTempIter.Value(); for(BOPCol_IndexedDataMapOfShapeListOfShape::Iterator anIter(aMapEF); anIter.More(); anIter.Next()) { BOPCol_ListOfShape& aTempListOfShape = anIter.ChangeValue(); @@ -107,12 +121,18 @@ void GeomAlgoAPI_ShapeTools::combineShapes(const std::shared_ptr aTempListOfShape.Clear(); } else if(aTempListOfShape.Size() > 1) { if(aTempListOfShape.First() == aTempShape) { - aTempMap.Add(aTempListOfShape.Last()); - aFreeShapes.Remove(aTempListOfShape.Last()); + const TopoDS_Shape& aTL = aTempListOfShape.Last(); + if(aTempMap.Add(aTL)) { + aTempList.Append(aTL); + aFreeShapes.Remove(aTL); + } aTempListOfShape.Clear(); } else if(aTempListOfShape.Last() == aTempShape) { - aTempMap.Add(aTempListOfShape.First()); - aFreeShapes.Remove(aTempListOfShape.First()); + const TopoDS_Shape& aTF = aTempListOfShape.First(); + if(aTempMap.Add(aTF)) { + aTempList.Append(aTF); + aFreeShapes.Remove(aTF); + } aTempListOfShape.Clear(); } } @@ -147,3 +167,25 @@ void GeomAlgoAPI_ShapeTools::combineShapes(const std::shared_ptr theFreeShapes.push_back(aGeomShape); } } + +//================================================================================================= +std::shared_ptr GeomAlgoAPI_ShapeTools::faceToInfinitePlane(const std::shared_ptr& theFace) +{ + if (!theFace.get()) + return std::shared_ptr(); + + TopoDS_Face aPlaneFace = TopoDS::Face(theFace->impl()); + if (aPlaneFace.IsNull()) + return std::shared_ptr(); + + Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(aPlaneFace)); + if (aPlane.IsNull()) + return std::shared_ptr(); + + // make an infinity face on the plane + TopoDS_Shape anInfiniteFace = BRepBuilderAPI_MakeFace(aPlane->Pln()).Shape(); + + std::shared_ptr aResult(new GeomAPI_Shape); + aResult->setImpl(new TopoDS_Shape(anInfiniteFace)); + return aResult; +}