X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_FaceBuilder.cpp;h=8e108ebfa01d4f3423bba3c23f8a617500c69d60;hb=84557d24d6c6b48998f319ffe3e16171bd89e0ab;hp=9816c160eca4f85ec422f50814da9d5c28d9bb75;hpb=f1cd93fd02a54259f72e3191d037323a496b2bef;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp index 9816c160e..8e108ebfa 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_FaceBuilder.cpp @@ -11,6 +11,8 @@ #include #include #include +#include + std::shared_ptr GeomAlgoAPI_FaceBuilder::square( std::shared_ptr theCenter, std::shared_ptr theNormal, @@ -27,6 +29,20 @@ std::shared_ptr GeomAlgoAPI_FaceBuilder::square( 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); + TopoDS_Shape aFace = aFaceBuilder.Face(); + aRes->setImpl(new TopoDS_Shape(aFace/*aFaceBuilder.Face()*/)); + return aRes; +} + std::shared_ptr GeomAlgoAPI_FaceBuilder::plane( std::shared_ptr theFace) { @@ -44,11 +60,47 @@ std::shared_ptr GeomAlgoAPI_FaceBuilder::plane( Handle(Geom_Surface) aSurf = BRep_Tool::Surface(aFace); if (aSurf.IsNull()) return aResult; // no surface - Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurf); - if (aPlane.IsNull()) - return aResult; // not planar + GeomLib_IsPlanarSurface isPlanar(aSurf); + if(!isPlanar.IsPlanar()) { + return aResult; + } + gp_Pln aPln = isPlanar.Plan(); double aA, aB, aC, aD; - aPlane->Coefficients(aA, aB, aC, aD); + aPln.Coefficients(aA, aB, aC, aD); + if (aFace.Orientation() == TopAbs_REVERSED) { + aA = -aA; + aB = -aB; + aC = -aC; + aD = -aD; + } aResult = std::shared_ptr(new GeomAPI_Pln(aA, aB, aC, aD)); return aResult; } + +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, theX, theX + theWidth, + theY, theY + theHeight); + std::shared_ptr aRes(new GeomAPI_Shape); + aRes->setImpl(new TopoDS_Shape(aFaceBuilder.Face())); + return aRes; +}