1 // File: GeomAlgoAPI_Extrusion.cpp
2 // Created: 06 Jun 2014
3 // Author: Artem ZHIDKOV
5 #include <GeomAlgoAPI_Extrusion.h>
9 #include <BRepPrimAPI_MakePrism.hxx>
10 #include <Geom_Plane.hxx>
11 #include <Geom_Surface.hxx>
12 #include <TopExp_Explorer.hxx>
14 #include <Precision.hxx>
15 const double tolerance = Precision::Angular();
17 boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Extrusion::makeExtrusion(
18 boost::shared_ptr<GeomAPI_Shape> theShape,
19 boost::shared_ptr<GeomAPI_Dir> theDir,
22 const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
23 gp_Vec aDir(theDir->impl<gp_Dir>().XYZ() * theSize);
25 TopoDS_Shape aPrism = BRepPrimAPI_MakePrism(aShape, aDir);
27 return boost::shared_ptr<GeomAPI_Shape>();
29 boost::shared_ptr<GeomAPI_Shape> aResult(new GeomAPI_Shape());
30 aResult->setImpl(new TopoDS_Shape(aPrism));
34 boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Extrusion::makeExtrusion(
35 boost::shared_ptr<GeomAPI_Shape> theShape,
38 bool isFirstNorm = true;
41 const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
42 TopExp_Explorer aFaceExp(aShape, TopAbs_FACE);
43 for ( ; aFaceExp.More(); aFaceExp.Next())
45 const TopoDS_Face& aFace = (const TopoDS_Face&)aFaceExp.Current();
46 Handle(BRep_TFace) aBFace = Handle(BRep_TFace)::DownCast(aFace.TShape());
48 return boost::shared_ptr<GeomAPI_Shape>();
50 Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aBFace->Surface());
51 if (aPlane.IsNull()) // non-planar shapes is not supported for extrusion yet
54 const gp_Dir& aNormal = aPlane->Pln().Axis().Direction();
57 aShapeNormal = aNormal;
60 else if (!aShapeNormal.IsEqual(aNormal, tolerance)) // non-planar shapes is not supported for extrusion yet
61 return boost::shared_ptr<GeomAPI_Shape>();
64 boost::shared_ptr<GeomAPI_Dir> aDir(
65 new GeomAPI_Dir(aShapeNormal.X(), aShapeNormal.Y(), aShapeNormal.Z()));
67 return GeomAlgoAPI_Extrusion::makeExtrusion(theShape, aDir, theSize);