X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_EdgeBuilder.cpp;h=0de55a60f36502506bd813eb21528fe3398daf64;hb=0cea3be102af7247b2fe2c8035a1bb38b7bf82ae;hp=5f3aba03e7ea68dd98e4a1db09a3ab2065826e20;hpb=8dc74f82810d5f597b78633b457efb0ef4f89f9f;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp index 5f3aba03e..0de55a60f 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: GeomAlgoAPI_EdgeBuilder.cpp // Created: 23 Apr 2014 // Author: Mikhail PONIKAROV @@ -6,32 +8,64 @@ #include #include #include +#include #include #include #include +#include #include #include -boost::shared_ptr GeomAlgoAPI_EdgeBuilder::line( - boost::shared_ptr theStart, boost::shared_ptr theEnd) +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); + 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::cylinderAxis( + std::shared_ptr theCylindricalFace) +{ + std::shared_ptr aResult; + const TopoDS_Shape& aShape = theCylindricalFace->impl(); + if (aShape.IsNull()) + return aResult; + TopoDS_Face aFace = TopoDS::Face(aShape); + if (aFace.IsNull()) + return aResult; + TopLoc_Location aLoc; + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace, aLoc); + if (aSurf.IsNull()) + return aResult; + Handle(Geom_CylindricalSurface) aCyl = Handle(Geom_CylindricalSurface)::DownCast(aSurf); + if (aCyl.IsNull()) + return aResult; + gp_Ax1 anAxis = aCyl->Axis(); + gp_Pnt aStart(anAxis.Location().Transformed(aLoc.Transformation())); + // edge length is 100, "-" because cylinder of extrusion has negative direction with the cylinder + gp_Pnt anEnd(anAxis.Location().XYZ() - anAxis.Direction().XYZ() * 100.); + anEnd.Transform(aLoc.Transformation()); + BRepBuilderAPI_MakeEdge anEdgeBuilder(aStart, anEnd); - boost::shared_ptr aRes(new GeomAPI_Edge); + std::shared_ptr aRes(new GeomAPI_Edge); TopoDS_Edge anEdge = anEdgeBuilder.Edge(); aRes->setImpl(new TopoDS_Shape(anEdge)); return aRes; } -boost::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircle( - boost::shared_ptr theCenter, boost::shared_ptr theNormal, +std::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircle( + std::shared_ptr theCenter, std::shared_ptr theNormal, double theRadius) { const gp_Pnt& aCenter = theCenter->impl(); @@ -40,15 +74,15 @@ boost::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircle( gp_Circ aCircle(gp_Ax2(aCenter, aDir), theRadius); BRepBuilderAPI_MakeEdge anEdgeBuilder(aCircle); - boost::shared_ptr aRes(new GeomAPI_Edge); + std::shared_ptr aRes(new GeomAPI_Edge); TopoDS_Edge anEdge = anEdgeBuilder.Edge(); aRes->setImpl(new TopoDS_Shape(anEdge)); return aRes; } -boost::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircleArc( - boost::shared_ptr theCenter, boost::shared_ptr theStartPoint, - boost::shared_ptr theEndPoint, boost::shared_ptr theNormal) +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(); @@ -66,12 +100,12 @@ boost::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircleArc( else anEdgeBuilder = BRepBuilderAPI_MakeEdge(aCircle, aStart, anEnd); - boost::shared_ptr aRes(new GeomAPI_Edge); + std::shared_ptr aRes(new GeomAPI_Edge); anEdgeBuilder.Build(); if (anEdgeBuilder.IsDone()) aRes->setImpl(new TopoDS_Shape(anEdgeBuilder.Edge())); else - aRes = boost::shared_ptr(); + aRes = std::shared_ptr(); return aRes; }