X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_EdgeBuilder.cpp;h=5d314dd8e1583a12c727a8a343a2bd8c25f7fb3b;hb=441e349df8f090948bdbcc8dc2a492011207ca4b;hp=2cc821e39fc26a8d52a3103a0fa3adf923b379ed;hpb=004fa7f94b343a782405d3fe21973521150729b4;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp index 2cc821e39..5d314dd8e 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp @@ -10,19 +10,68 @@ #include #include -boost::shared_ptr GeomAlgoAPI_EdgeBuilder::line( - boost::shared_ptr theStart, boost::shared_ptr theEnd) +#include +#include + +std::shared_ptr GeomAlgoAPI_EdgeBuilder::line( + std::shared_ptr theStart, std::shared_ptr theEnd) { const gp_Pnt& aStart = theStart->impl(); const gp_Pnt& anEnd = theEnd->impl(); if (aStart.IsEqual(anEnd, Precision::Confusion())) - return boost::shared_ptr(); + return std::shared_ptr(); if (Abs(aStart.SquareDistance(anEnd)) > 1.e+100) - return boost::shared_ptr(); + return std::shared_ptr(); BRepBuilderAPI_MakeEdge anEdgeBuilder(aStart, anEnd); - boost::shared_ptr aRes(new GeomAPI_Shape); + std::shared_ptr aRes(new GeomAPI_Edge); + TopoDS_Edge anEdge = anEdgeBuilder.Edge(); + aRes->setImpl(new TopoDS_Shape(anEdge)); + return aRes; +} + +std::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircle( + std::shared_ptr theCenter, std::shared_ptr theNormal, + double theRadius) +{ + const gp_Pnt& aCenter = theCenter->impl(); + const gp_Dir& aDir = theNormal->impl(); + + gp_Circ aCircle(gp_Ax2(aCenter, aDir), theRadius); + + BRepBuilderAPI_MakeEdge anEdgeBuilder(aCircle); + std::shared_ptr aRes(new GeomAPI_Edge); TopoDS_Edge anEdge = anEdgeBuilder.Edge(); aRes->setImpl(new TopoDS_Shape(anEdge)); return aRes; } + +std::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircleArc( + std::shared_ptr theCenter, std::shared_ptr theStartPoint, + std::shared_ptr theEndPoint, std::shared_ptr theNormal) +{ + const gp_Pnt& aCenter = theCenter->impl(); + const gp_Dir& aDir = theNormal->impl(); + + double aRadius = theCenter->distance(theStartPoint); + gp_Circ aCircle(gp_Ax2(aCenter, aDir), aRadius); + + const gp_Pnt& aStart = theStartPoint->impl(); + const gp_Pnt& anEnd = theEndPoint->impl(); + + BRepBuilderAPI_MakeEdge anEdgeBuilder; + if (aStart.IsEqual(anEnd, Precision::Confusion()) + || gp_Pnt(0, 0, 0).IsEqual(anEnd, Precision::Confusion())) + anEdgeBuilder = BRepBuilderAPI_MakeEdge(aCircle); + else + anEdgeBuilder = BRepBuilderAPI_MakeEdge(aCircle, aStart, anEnd); + + std::shared_ptr aRes(new GeomAPI_Edge); + anEdgeBuilder.Build(); + + if (anEdgeBuilder.IsDone()) + aRes->setImpl(new TopoDS_Shape(anEdgeBuilder.Edge())); + else + aRes = std::shared_ptr(); + return aRes; +}