Salome HOME
Feature #534: 5.01. Body placement by 3D rotation in respect to axis
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_Rotation.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        GeomAlgoAPI_Rotation.cpp
4 // Created:     12 May 2015
5 // Author:      Dmitry Bobylev
6
7 #include <GeomAlgoAPI_Rotation.h>
8
9 #include <GeomAlgoAPI_ShapeProps.h>
10
11 #include <BRepBuilderAPI_Transform.hxx>
12 #include <BRepCheck_Analyzer.hxx>
13 #include <Precision.hxx>
14 #include <TopExp_Explorer.hxx>
15
16 //=================================================================================================
17 GeomAlgoAPI_Rotation::GeomAlgoAPI_Rotation(std::shared_ptr<GeomAPI_Shape> theSourceShape,
18                                            std::shared_ptr<GeomAPI_Ax1>   theAxis,
19                                            double                         theAngle)
20 : myDone(false),
21   myShape(new GeomAPI_Shape()),
22   myMap(new GeomAPI_DataMapOfShapeShape()),
23   myMkShape(new GeomAlgoAPI_MakeShape())
24 {
25   build(theSourceShape, theAxis, theAngle);
26 }
27
28 //=================================================================================================
29 void GeomAlgoAPI_Rotation::build(std::shared_ptr<GeomAPI_Shape> theSourceShape,
30                                  std::shared_ptr<GeomAPI_Ax1>   theAxis,
31                                  double                         theAngle)
32 {
33   if(!theSourceShape || !theAxis) {
34     return;
35   }
36
37   const TopoDS_Shape& aSourceShape = theSourceShape->impl<TopoDS_Shape>();
38   const gp_Ax1& anAxis = theAxis->impl<gp_Ax1>();
39
40   if(aSourceShape.IsNull()) {
41     return;
42   }
43
44   gp_Trsf aTrsf;
45   aTrsf.SetRotation(anAxis, theAngle / 180.0 * M_PI);
46
47   // Transform the shape with copying it.
48   BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, aTrsf, true);
49   if(!aBuilder) {
50     return;
51   }
52
53   myDone = aBuilder->IsDone() == Standard_True;
54
55   if(!myDone) {
56     return;
57   }
58
59   TopoDS_Shape aResult = aBuilder->Shape();
60   // Fill data map to keep correct orientation of sub-shapes.
61   for(TopExp_Explorer anExp(aResult, TopAbs_FACE); anExp.More(); anExp.Next()) {
62     std::shared_ptr<GeomAPI_Shape> aCurrentShape(new GeomAPI_Shape());
63     aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current()));
64     myMap->bind(aCurrentShape, aCurrentShape);
65   }
66
67   myShape->setImpl(new TopoDS_Shape(aResult));
68   myMkShape->setImpl(aBuilder);
69 }
70
71 //=================================================================================================
72 const bool GeomAlgoAPI_Rotation::isValid() const
73 {
74   BRepCheck_Analyzer aChecker(myShape->impl<TopoDS_Shape>());
75   return (aChecker.IsValid() == Standard_True);
76 }
77
78 //=================================================================================================
79 const bool GeomAlgoAPI_Rotation::hasVolume() const
80 {
81   bool hasVolume(false);
82   if(isValid() && (GeomAlgoAPI_ShapeProps::volume(myShape) > Precision::Confusion())) {
83     hasVolume = true;
84   }
85   return hasVolume;
86 }
87
88 //=================================================================================================
89 const std::shared_ptr<GeomAPI_Shape>& GeomAlgoAPI_Rotation::shape() const
90 {
91   return myShape;
92 }
93
94 //=================================================================================================
95 std::shared_ptr<GeomAPI_DataMapOfShapeShape> GeomAlgoAPI_Rotation::mapOfShapes() const
96 {
97   return myMap;
98 }
99
100 //=================================================================================================
101 std::shared_ptr<GeomAlgoAPI_MakeShape> GeomAlgoAPI_Rotation::makeShape() const
102 {
103   return myMkShape;
104 }