X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_EdgeBuilder.cpp;h=3badacb17afb6aa9eab7ed363672246731558225;hb=d5d78920316491975a67f76578982b401cdfe71d;hp=163d4643a33d14bf63e8848bed9cc2f03666d94f;hpb=dfad060191418d8b5e6d122afd6821dd0e553f9c;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp index 163d4643a..3badacb17 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_EdgeBuilder.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,74 +12,76 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include + +#include +#include +#include +#include +#include + #include #include #include #include #include #include +#include #include #include #include +#include #include #include +#include #include #include +static GeomEdgePtr createLine(const gp_Pnt& theStart, const gp_Pnt& theEnd) +{ + GeomEdgePtr aRes; + if (!theStart.IsEqual(theEnd, Precision::Confusion()) && + Abs(theStart.SquareDistance(theEnd)) < 1.e+100) { + BRepBuilderAPI_MakeEdge anEdgeBuilder(theStart, theEnd); + TopoDS_Edge anEdge = anEdgeBuilder.Edge(); + aRes = GeomEdgePtr(new GeomAPI_Edge); + aRes->setImpl(new TopoDS_Shape(anEdge)); + } + return aRes; +} + 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 std::shared_ptr(); - if (Abs(aStart.SquareDistance(anEnd)) > 1.e+100) - 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; + return createLine(aStart, anEnd); } std::shared_ptr GeomAlgoAPI_EdgeBuilder::line( double theDX, double theDY, double theDZ) { - const gp_Pnt& aStart = gp_Pnt(0, 0, 0); const gp_Pnt& anEnd = gp_Pnt(theDX, theDY, theDZ); - - if (aStart.IsEqual(anEnd, Precision::Confusion())) - return std::shared_ptr(); - if (Abs(aStart.SquareDistance(anEnd)) > 1.e+100) - 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; + return createLine(aStart, anEnd); } std::shared_ptr GeomAlgoAPI_EdgeBuilder::line( const std::shared_ptr theLin) { - if(!theLin.get()) { - return std::shared_ptr(); + GeomEdgePtr aRes; + if (theLin.get()) { + const gp_Lin& aLin = theLin->impl(); + BRepBuilderAPI_MakeEdge anEdgeBuilder(aLin); + TopoDS_Edge anEdge = anEdgeBuilder.Edge(); + aRes = GeomEdgePtr(new GeomAPI_Edge); + aRes->setImpl(new TopoDS_Shape(anEdge)); } - - const gp_Lin& aLin = theLin->impl(); - BRepBuilderAPI_MakeEdge anEdgeBuilder(aLin); - std::shared_ptr aRes(new GeomAPI_Edge()); - TopoDS_Edge anEdge = anEdgeBuilder.Edge(); - aRes->setImpl(new TopoDS_Shape(anEdge)); return aRes; } @@ -139,7 +141,9 @@ std::shared_ptr GeomAlgoAPI_EdgeBuilder::cylinderAxis( aParamMax += aDelta * 0.1; gp_Pnt aStart(aParamMin * anAxis.Direction().XYZ() + anAxis.Location().XYZ()); + aStart.Transform(aLoc.Transformation()); gp_Pnt anEnd(aParamMax * anAxis.Direction().XYZ() + anAxis.Location().XYZ()); + anEnd.Transform(aLoc.Transformation()); /* gp_Pnt aStart(anAxis.Location().Transformed(aLoc.Transformation())); // edge length is 100, "-" because cylinder of extrusion has negative direction with the cylinder @@ -175,15 +179,14 @@ std::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircle( std::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircle( std::shared_ptr theCircle) { - if(!theCircle.get()) { - return std::shared_ptr(); + GeomEdgePtr aRes; + if (theCircle.get()) { + const gp_Circ& aCirc = theCircle->impl(); + BRepBuilderAPI_MakeEdge anEdgeBuilder(aCirc); + TopoDS_Edge anEdge = anEdgeBuilder.Edge(); + aRes = GeomEdgePtr(new GeomAPI_Edge); + aRes->setImpl(new TopoDS_Shape(anEdge)); } - - const gp_Circ& aCirc = theCircle->impl(); - BRepBuilderAPI_MakeEdge anEdgeBuilder(aCirc); - std::shared_ptr aRes(new GeomAPI_Edge()); - TopoDS_Edge anEdge = anEdgeBuilder.Edge(); - aRes->setImpl(new TopoDS_Shape(anEdge)); return aRes; } @@ -222,3 +225,77 @@ std::shared_ptr GeomAlgoAPI_EdgeBuilder::lineCircleArc( } return aRes; } + +std::shared_ptr GeomAlgoAPI_EdgeBuilder::ellipse( + const std::shared_ptr& theCenter, + const std::shared_ptr& theNormal, + const std::shared_ptr& theMajorAxis, + const double theMajorRadius, + const double theMinorRadius) +{ + const gp_Pnt& aCenter = theCenter->impl(); + const gp_Dir& aNormal = theNormal->impl(); + const gp_Dir& aMajorAxis = theMajorAxis->impl(); + + gp_Elips anEllipse(gp_Ax2(aCenter, aNormal, aMajorAxis), theMajorRadius, theMinorRadius); + + BRepBuilderAPI_MakeEdge anEdgeBuilder(anEllipse); + 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::ellipticArc( + const std::shared_ptr& theCenter, + const std::shared_ptr& theNormal, + const std::shared_ptr& theMajorAxis, + const double theMajorRadius, + const double theMinorRadius, + const std::shared_ptr& theStart, + const std::shared_ptr& theEnd) +{ + std::shared_ptr anAx2(new GeomAPI_Ax2(theCenter, theNormal, theMajorAxis)); + GeomAPI_Ellipse anEllipse(anAx2, theMajorRadius, theMinorRadius); + + GeomPointPtr aStartPnt = anEllipse.project(theStart); + GeomPointPtr aEndPnt = anEllipse.project(theEnd); + + double aStartParam, aEndParam; + anEllipse.parameter(aStartPnt, Precision::Confusion(), aStartParam); + anEllipse.parameter(aEndPnt, Precision::Confusion(), aEndParam); + + BRepBuilderAPI_MakeEdge anEdgeBuilder(anEllipse.impl(), aStartParam, aEndParam); + GeomEdgePtr aRes(new GeomAPI_Edge); + TopoDS_Edge anEdge = anEdgeBuilder.Edge(); + aRes->setImpl(new TopoDS_Shape(anEdge)); + return aRes; +} + +GeomEdgePtr GeomAlgoAPI_EdgeBuilder::bsplineOnPlane( + const std::shared_ptr& thePlane, + const std::list& thePoles, + const std::list& theWeights, + const std::list& theKnots, + const std::list& theMults, + const int theDegree, + const bool thePeriodic) +{ + std::shared_ptr aBSplineCurve( + new GeomAPI_BSpline2d(theDegree, thePoles, theWeights, theKnots, theMults, thePeriodic)); + return bsplineOnPlane(thePlane, aBSplineCurve); +} + +GeomEdgePtr GeomAlgoAPI_EdgeBuilder::bsplineOnPlane( + const std::shared_ptr& thePlane, + const std::shared_ptr& theCurve) +{ + Handle(Geom_Curve) aCurve3D = GeomLib::To3d(thePlane->impl().Ax2(), + theCurve->impl()); + + BRepBuilderAPI_MakeEdge anEdgeBuilder(aCurve3D); + GeomEdgePtr aRes(new GeomAPI_Edge); + TopoDS_Edge anEdge = anEdgeBuilder.Edge(); + aRes->setImpl(new TopoDS_Shape(anEdge)); + return aRes; +}