X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_FaceBuilder.cpp;h=c197873082d41d554107f2006be01495ce820bd6;hb=48a4bd38c2b9d1b6b51ebca992a5eab30e85d99b;hp=4b2ebc4d26b6adfd3ca7c27a2e31b08961348584;hpb=37bf139347283d16d59b08079d52be5f6f29a38c;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp index 4b2ebc4d2..c19787308 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp @@ -1,3 +1,5 @@ +// Copyright (C) 2014-20xx CEA/DEN, EDF R&D + // File: GeomAlgoAPI_FaceBuilder.cpp // Created: 23 Apr 2014 // Author: Mikhail PONIKAROV @@ -6,18 +8,92 @@ #include #include #include +#include +#include +#include +#include + + +std::shared_ptr GeomAlgoAPI_FaceBuilder::square( + std::shared_ptr theCenter, std::shared_ptr theNormal, + const double theSize) +{ + const gp_Pnt& aCenter = theCenter->impl(); + const gp_Dir& aDir = theNormal->impl(); + gp_Pln aPlane(aCenter, aDir); + // half of the size in each direction from the center + BRepBuilderAPI_MakeFace aFaceBuilder(aPlane, -theSize / 2., theSize / 2., -theSize / 2., + theSize / 2.); + std::shared_ptr aRes(new GeomAPI_Shape); + aRes->setImpl(new TopoDS_Shape(aFaceBuilder.Face())); + return aRes; +} + +std::shared_ptr GeomAlgoAPI_FaceBuilder::square( + std::shared_ptr thePlane, + const double theSize) +{ + // half of the size in each direction from the center + BRepBuilderAPI_MakeFace aFaceBuilder(thePlane->impl(), + -theSize / 2., theSize / 2., + -theSize / 2., theSize / 2.); + std::shared_ptr aRes(new GeomAPI_Shape); + aRes->setImpl(new TopoDS_Shape(aFaceBuilder.Face())); + return aRes; +} + +std::shared_ptr GeomAlgoAPI_FaceBuilder::plane( + std::shared_ptr theFace) +{ + std::shared_ptr aResult; + if (!theFace) + return aResult; // bad shape + TopoDS_Shape aShape = theFace->impl(); + if (aShape.IsNull()) + return aResult; // null shape + if (aShape.ShapeType() != TopAbs_FACE) + return aResult; // not face + TopoDS_Face aFace = TopoDS::Face(aShape); + if (aFace.IsNull()) + return aResult; // not face + Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace); + if (aSurf.IsNull()) + return aResult; // no surface + GeomLib_IsPlanarSurface isPlanar(aSurf); + if(!isPlanar.IsPlanar()) { + return aResult; + } + gp_Pln aPln = isPlanar.Plan(); + double aA, aB, aC, aD; + aPln.Coefficients(aA, aB, aC, aD); + aResult = std::shared_ptr(new GeomAPI_Pln(aA, aB, aC, aD)); + return aResult; +} -boost::shared_ptr GeomAlgoAPI_FaceBuilder::square( - boost::shared_ptr theCenter, boost::shared_ptr theNormal, - const double theSize) +std::shared_ptr GeomAlgoAPI_FaceBuilder::planarFace(std::shared_ptr theCenter, + std::shared_ptr theNormal) { const gp_Pnt& aCenter = theCenter->impl(); const gp_Dir& aDir = theNormal->impl(); gp_Pln aPlane(aCenter, aDir); + BRepBuilderAPI_MakeFace aFaceBuilder(aPlane); + std::shared_ptr aRes(new GeomAPI_Shape); + aRes->setImpl(new TopoDS_Shape(aFaceBuilder.Face())); + return aRes; +} + +std::shared_ptr GeomAlgoAPI_FaceBuilder::planarFace(std::shared_ptr thePlane, + double theX, double theY, + double theWidth, double theHeight) +{ + double aA, aB, aC, aD; + thePlane->coefficients(aA, aB, aC, aD); + gp_Pln aPlane(aA, aB, aC, aD); + // half of the size in each direction from the center - BRepBuilderAPI_MakeFace aFaceBuilder(aPlane, - -theSize / 2., theSize / 2., -theSize / 2., theSize / 2.); - boost::shared_ptr aRes(new GeomAPI_Shape); + BRepBuilderAPI_MakeFace aFaceBuilder(aPlane, theX, theX + theWidth, + theY, theY + theHeight); + std::shared_ptr aRes(new GeomAPI_Shape); aRes->setImpl(new TopoDS_Shape(aFaceBuilder.Face())); return aRes; }