Salome HOME
Geom attribute: Point
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_FaceBuilder.cpp
index 4b2ebc4d26b6adfd3ca7c27a2e31b08961348584..f543c06a669534e26a8d5aa71d42db28ac64e809 100644 (file)
@@ -6,6 +6,9 @@
 #include <gp_Pln.hxx>
 #include <BRepBuilderAPI_MakeFace.hxx>
 #include <TopoDS_Face.hxx>
+#include <TopoDS.hxx>
+#include <BRep_Tool.hxx>
+#include <Geom_Plane.hxx>
 
 boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_FaceBuilder::square(
   boost::shared_ptr<GeomAPI_Pnt> theCenter, boost::shared_ptr<GeomAPI_Dir> theNormal,
@@ -21,3 +24,22 @@ boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_FaceBuilder::square(
   aRes->setImpl(new TopoDS_Shape(aFaceBuilder.Face()));
   return aRes;
 }
+
+boost::shared_ptr<GeomAPI_Pln> GeomAlgoAPI_FaceBuilder::plane(
+  boost::shared_ptr<GeomAPI_Shape> theFace)
+{
+  boost::shared_ptr<GeomAPI_Pln> aResult;
+  if (!theFace) return aResult; // bad shape
+  TopoDS_Shape aShape = theFace->impl<TopoDS_Shape>();
+  if (aShape.IsNull()) return aResult; // null shape
+  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
+  Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurf);
+  if (aPlane.IsNull()) return aResult; // not planar
+  double aA, aB, aC, aD;
+  aPlane->Coefficients(aA, aB, aC, aD);
+  aResult = boost::shared_ptr<GeomAPI_Pln>(new GeomAPI_Pln(aA, aB, aC, aD));
+  return aResult;
+}