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>
13 #include <BRep_Builder.hxx>
15 #include <Precision.hxx>
16 const double tolerance = Precision::Angular();
18 boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_Extrusion::makeExtrusion(
19 boost::shared_ptr<GeomAPI_Shape> theShape, 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, double theSize)
37 bool isFirstNorm = true;
40 const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
41 TopExp_Explorer aFaceExp(aShape, TopAbs_FACE);
42 TopoDS_Compound aFaces; // use only faces from the shape: make compound for this
43 BRep_Builder aBuilder;
44 aBuilder.MakeCompound(aFaces);
45 for (; aFaceExp.More(); aFaceExp.Next()) {
46 const TopoDS_Face& aFace = (const TopoDS_Face&) aFaceExp.Current();
47 Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(BRep_Tool::Surface(aFace));
48 if (aPlane.IsNull()) // non-planar shapes is not supported for extrusion yet
51 const gp_Dir& aNormal = aPlane->Pln().Axis().Direction();
53 aShapeNormal = aNormal;
55 } else if (!aShapeNormal.IsEqual(aNormal, tolerance)) // non-planar shapes is not supported for extrusion yet
56 return boost::shared_ptr<GeomAPI_Shape>();
57 aBuilder.Add(aFaces, aFace);
60 return boost::shared_ptr<GeomAPI_Shape>();
62 boost::shared_ptr<GeomAPI_Dir> aDir(
63 new GeomAPI_Dir(aShapeNormal.X(), aShapeNormal.Y(), aShapeNormal.Z()));
65 boost::shared_ptr<GeomAPI_Shape> aFacesShape(new (GeomAPI_Shape));
66 aFacesShape->setImpl(new TopoDS_Shape(aFaces));
67 return GeomAlgoAPI_Extrusion::makeExtrusion(aFacesShape, aDir, theSize);