Salome HOME
Implementation of Partition movement using new result creation, with different data...
[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                                            bool theSimpleTransform)
21 : myDone(false),
22   myShape(new GeomAPI_Shape()),
23   myMap(new GeomAPI_DataMapOfShapeShape()),
24   myMkShape(new GeomAlgoAPI_MakeShape())
25 {
26   build(theSourceShape, theAxis, theAngle, theSimpleTransform);
27 }
28
29 //=================================================================================================
30 void GeomAlgoAPI_Rotation::build(std::shared_ptr<GeomAPI_Shape> theSourceShape,
31                                  std::shared_ptr<GeomAPI_Ax1>   theAxis,
32                                  double                         theAngle,
33                                  bool theSimpleTransform)
34 {
35   if(!theSourceShape || !theAxis) {
36     return;
37   }
38
39   const TopoDS_Shape& aSourceShape = theSourceShape->impl<TopoDS_Shape>();
40   const gp_Ax1& anAxis = theAxis->impl<gp_Ax1>();
41
42   if(aSourceShape.IsNull()) {
43     return;
44   }
45
46   gp_Trsf aTrsf;
47   aTrsf.SetRotation(anAxis, theAngle / 180.0 * M_PI);
48
49   TopoDS_Shape aResult;
50   // Transform the shape with copying it.
51   if (theSimpleTransform) {
52     TopLoc_Location aDelta(aTrsf);
53     aResult = aSourceShape.Moved(aDelta);
54     //myTrsf = std::shared_ptr<GeomAPI_Trsf>(new GeomAPI_Trsf(new gp_Trsf(aTrsf * aSourceShape.Location().Transformation())));
55     myTrsf = std::shared_ptr<GeomAPI_Trsf>(new GeomAPI_Trsf(new gp_Trsf(aTrsf)));
56     myDone = true; // is OK for sure
57   } else {
58     BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, aTrsf, true);
59     if(!aBuilder) {
60       return;
61     }
62
63     myDone = aBuilder->IsDone() == Standard_True;
64
65     if(!myDone) {
66       return;
67     }
68
69     aResult = aBuilder->Shape();
70     // Fill data map to keep correct orientation of sub-shapes.
71     for(TopExp_Explorer anExp(aResult, TopAbs_FACE); anExp.More(); anExp.Next()) {
72       std::shared_ptr<GeomAPI_Shape> aCurrentShape(new GeomAPI_Shape());
73       aCurrentShape->setImpl(new TopoDS_Shape(anExp.Current()));
74       myMap->bind(aCurrentShape, aCurrentShape);
75     }
76     myMkShape->setImpl(aBuilder);
77   }
78
79   myShape->setImpl(new TopoDS_Shape(aResult));
80 }
81
82 //=================================================================================================
83 const bool GeomAlgoAPI_Rotation::isValid() const
84 {
85   BRepCheck_Analyzer aChecker(myShape->impl<TopoDS_Shape>());
86   return (aChecker.IsValid() == Standard_True);
87 }
88
89 //=================================================================================================
90 const bool GeomAlgoAPI_Rotation::hasVolume() const
91 {
92   bool hasVolume(false);
93   if(isValid() && (GeomAlgoAPI_ShapeProps::volume(myShape) > Precision::Confusion())) {
94     hasVolume = true;
95   }
96   return hasVolume;
97 }
98
99 //=================================================================================================
100 const std::shared_ptr<GeomAPI_Shape>& GeomAlgoAPI_Rotation::shape() const
101 {
102   return myShape;
103 }
104
105 //=================================================================================================
106 std::shared_ptr<GeomAPI_DataMapOfShapeShape> GeomAlgoAPI_Rotation::mapOfShapes() const
107 {
108   return myMap;
109 }
110
111 //=================================================================================================
112 std::shared_ptr<GeomAlgoAPI_MakeShape> GeomAlgoAPI_Rotation::makeShape() const
113 {
114   return myMkShape;
115 }
116
117 //=================================================================================================
118 std::shared_ptr<GeomAPI_Trsf> GeomAlgoAPI_Rotation::transformation() const
119 {
120   return myTrsf;
121 }