X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_ShapeTools.cpp;h=a47c77c7f28d1fa298a72a1613b71a5eabdd06ff;hb=5fb6a80c4e86e21b1181b4e6ee940d946b5c52e4;hp=a8df94d7dbd49d0fcbae3da17db9a159078a9fb2;hpb=dc75c390f0aa6108d6983a8618dc4b9a4cd5949e;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp index a8df94d7d..a47c77c7f 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_ShapeTools.cpp @@ -51,9 +51,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -80,6 +82,35 @@ #include #include +//================================================================================================== +static GProp_GProps props(const TopoDS_Shape& theShape) +{ + GProp_GProps aGProps; + + if (theShape.ShapeType() == TopAbs_EDGE || theShape.ShapeType() == TopAbs_WIRE) + { + BRepGProp::LinearProperties(theShape, aGProps); + } + else if (theShape.ShapeType() == TopAbs_FACE || theShape.ShapeType() == TopAbs_SHELL) + { + const Standard_Real anEps = 1.e-6; + BRepGProp::SurfaceProperties(theShape, aGProps, anEps); + } + else if (theShape.ShapeType() == TopAbs_SOLID || theShape.ShapeType() == TopAbs_COMPSOLID) + { + BRepGProp::VolumeProperties(theShape, aGProps); + } + else if (theShape.ShapeType() == TopAbs_COMPOUND) + { + for (TopoDS_Iterator anIt(theShape); anIt.More(); anIt.Next()) + { + aGProps.Add(props(anIt.Value())); + } + } + + return aGProps; +} + //================================================================================================== double GeomAlgoAPI_ShapeTools::volume(const std::shared_ptr theShape) { @@ -131,17 +162,40 @@ std::shared_ptr gp_Pnt aCentre; if(aShape.ShapeType() == TopAbs_VERTEX) { aCentre = BRep_Tool::Pnt(TopoDS::Vertex(aShape)); - } else if(aShape.ShapeType() == TopAbs_EDGE || aShape.ShapeType() == TopAbs_WIRE) { - BRepGProp::LinearProperties(aShape, aGProps); - aCentre = aGProps.CentreOfMass(); } else { - const Standard_Real anEps = 1.e-6; - BRepGProp::SurfaceProperties(aShape, aGProps, anEps); + aGProps = props(aShape); aCentre = aGProps.CentreOfMass(); } + return std::shared_ptr(new GeomAPI_Pnt(aCentre.X(), aCentre.Y(), aCentre.Z())); } +//================================================================================================== +double GeomAlgoAPI_ShapeTools::radius(const std::shared_ptr& theCylinder) +{ + double aRadius = -1.0; + if (theCylinder->isCylindrical()) { + const TopoDS_Shape& aShape = theCylinder->impl(); + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aShape)); + Handle(Geom_CylindricalSurface) aCyl = Handle(Geom_CylindricalSurface)::DownCast(aSurf); + if (!aCyl.IsNull()) + aRadius = aCyl->Radius(); + } + return aRadius; +} + +//================================================================================================== +double GeomAlgoAPI_ShapeTools::minimalDistance(const GeomShapePtr& theShape1, + const GeomShapePtr& theShape2) +{ + const TopoDS_Shape& aShape1 = theShape1->impl(); + const TopoDS_Shape& aShape2 = theShape2->impl(); + + BRepExtrema_DistShapeShape aDist(aShape1, aShape2); + aDist.Perform(); + return aDist.IsDone() ? aDist.Value() : Precision::Infinite(); +} + //================================================================================================== std::shared_ptr GeomAlgoAPI_ShapeTools::combineShapes( const std::shared_ptr theCompound, @@ -373,7 +427,7 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::groupSharedTopology( } // Iterate over the map and group shapes. - NCollection_Vector aGroups; // groups of shapes connected by vertices + NCollection_Vector aGroups; // groups of shapes connected by vertices while (!allVertices.IsEmpty()) { // Get first group of shapes in map, and then unbind it. const TopoDS_Shape& aKey = allVertices.First(); @@ -414,12 +468,12 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::groupSharedTopology( } } // Sort shapes from the most complicated to the simplest ones - TopTools_ListOfShape aSortedGroup; + TopTools_MapOfShape aSortedGroup; for (int aST = TopAbs_COMPOUND; aST <= TopAbs_SHAPE; ++aST) { TopTools_ListOfShape::Iterator anIt(aConnectedShapes); while (anIt.More()) { if (anIt.Value().ShapeType() == aST) { - aSortedGroup.Append(anIt.Value()); + aSortedGroup.Add(anIt.Value()); aConnectedShapes.Remove(anIt); } else { @@ -434,14 +488,21 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::groupSharedTopology( BRep_Builder aBuilder; aBuilder.MakeCompound(aCompound); ListOfShape aCompSolids, aFreeSolids; - for(NCollection_Vector>::Iterator - anIt(aGroups); anIt.More(); anIt.Next()) { - NCollection_List aGroup = anIt.Value(); + for (NCollection_Vector::Iterator anIt(aGroups); anIt.More(); anIt.Next()) { + const TopTools_MapOfShape& aGroup = anIt.ChangeValue(); GeomShapePtr aGeomShape(new GeomAPI_Shape()); if(aGroup.Size() == 1) { - aGeomShape->setImpl(new TopoDS_Shape(aGroup.First())); + TopTools_MapOfShape::Iterator aOneShapeIter(aGroup); + aGeomShape->setImpl(new TopoDS_Shape(aOneShapeIter.Value())); } else { - aGeomShape->setImpl(new TopoDS_Shape(makeCompound(aGroup))); + // make sub-shapes in the group have order same as in original shape + TopTools_ListOfShape anOrderedGoup; + NCollection_List::Iterator anUngrouped(anUngroupedShapes); + for (; anUngrouped.More(); anUngrouped.Next()) { + if (aGroup.Contains(anUngrouped.Value())) + anOrderedGoup.Append(anUngrouped.Value()); + } + aGeomShape->setImpl(new TopoDS_Shape(makeCompound(anOrderedGoup))); aGeomShape = GeomAlgoAPI_ShapeTools::combineShapes(aGeomShape, GeomAPI_Shape::COMPSOLID, aCompSolids, @@ -1004,3 +1065,25 @@ std::shared_ptr GeomAlgoAPI_ShapeTools::wireToEdge( } return anEdge; } + +ListOfShape GeomAlgoAPI_ShapeTools::getLowLevelSubShapes(const GeomShapePtr& theShape) +{ + ListOfShape aSubShapes; + + if (!theShape->isCompound() && !theShape->isCompSolid() && + !theShape->isShell() && !theShape->isWire()) { + return aSubShapes; + } + + for (GeomAPI_ShapeIterator anIt(theShape); anIt.more(); anIt.next()) { + GeomShapePtr aSubShape = anIt.current(); + if (aSubShape->isVertex() || aSubShape->isEdge() || + aSubShape->isFace() || aSubShape->isSolid()) { + aSubShapes.push_back(aSubShape); + } else { + aSubShapes.splice(aSubShapes.end(), getLowLevelSubShapes(aSubShape)); + } + } + + return aSubShapes; +} \ No newline at end of file