Salome HOME
dc1b1a7e16efd8149b6eefb799c1afccbbb98635
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_Tools.cpp
1 // Copyright (C) 2014-2019  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "FeaturesPlugin_Tools.h"
21
22 #include <ModelAPI_ResultBody.h>
23
24 #include <GeomAPI_ShapeIterator.h>
25
26 //==================================================================================================
27 void FeaturesPlugin_Tools::loadModifiedShapes(ResultBodyPtr theResultBody,
28                                               const ListOfShape& theBaseShapes,
29                                               const ListOfShape& theTools,
30                                               const GeomMakeShapePtr& theMakeShape,
31                                               const GeomShapePtr theResultShape,
32                                               const std::string& theNamePrefix)
33 {
34   theResultBody->storeModified(theBaseShapes, theResultShape, theMakeShape);
35
36   ListOfShape aShapes = theBaseShapes;
37   ListOfShape::const_iterator aToolIter = theTools.cbegin();
38   for(; aToolIter != theTools.cend(); aToolIter++)
39     aShapes.push_back(*aToolIter);
40
41   for (ListOfShape::const_iterator anIter = aShapes.begin(); anIter != aShapes.end(); ++anIter)
42   {
43     theResultBody->loadModifiedShapes(theMakeShape, *anIter, GeomAPI_Shape::VERTEX, theNamePrefix);
44     theResultBody->loadModifiedShapes(theMakeShape, *anIter, GeomAPI_Shape::EDGE, theNamePrefix);
45     theResultBody->loadModifiedShapes(theMakeShape, *anIter, GeomAPI_Shape::FACE, theNamePrefix);
46   }
47 }
48
49 //==================================================================================================
50 void FeaturesPlugin_Tools::loadModifiedShapes(ResultBodyPtr theResultBody,
51                                               const GeomShapePtr& theBaseShape,
52                                               const GeomMakeShapePtr& theMakeShape,
53                                               const std::string theName)
54 {
55   switch(theBaseShape->shapeType()) {
56     case GeomAPI_Shape::COMPOUND: {
57       for(GeomAPI_ShapeIterator anIt(theBaseShape); anIt.more(); anIt.next())
58       {
59         loadModifiedShapes(theResultBody,
60                            anIt.current(),
61                            theMakeShape,
62                            theName);
63       }
64       break;
65     }
66     case GeomAPI_Shape::COMPSOLID:
67     case GeomAPI_Shape::SOLID:
68     case GeomAPI_Shape::SHELL: {
69       theResultBody->loadModifiedShapes(theMakeShape,
70                                         theBaseShape,
71                                         GeomAPI_Shape::FACE,
72                                         theName);
73     }
74     case GeomAPI_Shape::FACE:
75     case GeomAPI_Shape::WIRE: {
76       theResultBody->loadModifiedShapes(theMakeShape,
77                                         theBaseShape,
78                                         GeomAPI_Shape::EDGE,
79                                         theName);
80     }
81     case GeomAPI_Shape::EDGE: {
82       theResultBody->loadModifiedShapes(theMakeShape,
83                                         theBaseShape,
84                                         GeomAPI_Shape::VERTEX,
85                                         theName);
86     }
87   }
88 }
89
90 //==================================================================================================
91 void FeaturesPlugin_Tools::loadDeletedShapes(ResultBodyPtr theResultBody,
92   const GeomShapePtr theBaseShape,
93   const ListOfShape& theTools,
94   const GeomMakeShapePtr& theMakeShape,
95   const GeomShapePtr theResultShapesCompound)
96 {
97   ListOfShape aShapes = theTools;
98   if (theBaseShape.get())
99     aShapes.push_front(theBaseShape);
100
101   for (ListOfShape::const_iterator anIter = aShapes.begin(); anIter != aShapes.end(); anIter++)
102   {
103     theResultBody->loadDeletedShapes(theMakeShape,
104                                      *anIter,
105                                      GeomAPI_Shape::VERTEX,
106                                      theResultShapesCompound);
107     theResultBody->loadDeletedShapes(theMakeShape,
108                                      *anIter,
109                                      GeomAPI_Shape::EDGE,
110                                      theResultShapesCompound);
111     theResultBody->loadDeletedShapes(theMakeShape,
112                                      *anIter,
113                                      GeomAPI_Shape::FACE,
114                                      theResultShapesCompound);
115   }
116 }
117
118 //==================================================================================================
119 void FeaturesPlugin_Tools::loadDeletedShapes(
120   std::vector<ResultBaseAlgo>& theResultBaseAlgoList,
121   const ListOfShape& theTools,
122   const GeomShapePtr theResultShapesCompound)
123 {
124   for (std::vector<ResultBaseAlgo>::iterator anIt = theResultBaseAlgoList.begin();
125        anIt != theResultBaseAlgoList.end();
126        ++anIt)
127   {
128     ResultBaseAlgo& aRCA = *anIt;
129     loadDeletedShapes(aRCA.resultBody,
130                       aRCA.baseShape,
131                       theTools,
132                       aRCA.makeShape,
133                       theResultShapesCompound);
134   }
135 }