]> SALOME platform Git repositories - modules/shaper.git/blob - src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp
Salome HOME
57a711e0ccc2d1598eed7cc25585c05883bf901f
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_CompositeSketch.cpp
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 // File:        FeaturesPlugin_CompositeSketch.cpp
4 // Created:     11 September 2015
5 // Author:      Dmitry Bobylev
6
7 #include <FeaturesPlugin_CompositeSketch.h>
8
9 #include <ModelAPI_AttributeSelectionList.h>
10 #include <ModelAPI_AttributeReference.h>
11 #include <ModelAPI_BodyBuilder.h>
12 #include <ModelAPI_ResultBody.h>
13 #include <ModelAPI_ResultConstruction.h>
14 #include <ModelAPI_Session.h>
15 #include <ModelAPI_Validator.h>
16
17 #include <GeomAlgoAPI_CompoundBuilder.h>
18 #include <GeomAlgoAPI_Prism.h>
19 #include <GeomAlgoAPI_Revolution.h>
20 #include <GeomAlgoAPI_ShapeTools.h>
21
22 #include <sstream>
23
24 //=================================================================================================
25 void FeaturesPlugin_CompositeSketch::initAttributes()
26 {
27   data()->addAttribute(SKETCH_OBJECT_ID(), ModelAPI_AttributeReference::typeId());
28   data()->addAttribute(SKETCH_SELECTION_ID(), ModelAPI_AttributeSelection::typeId());
29   ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), SKETCH_SELECTION_ID());
30
31   //initMakeSolidsAttributes();
32 }
33
34 //=================================================================================================
35 std::shared_ptr<ModelAPI_Feature> FeaturesPlugin_CompositeSketch::addFeature(std::string theID)
36 {
37   std::shared_ptr<ModelAPI_Feature> aNew = document()->addFeature(theID, false);
38   if (aNew) {
39     data()->reference(SKETCH_OBJECT_ID())->setValue(aNew);
40   }
41   // set as current also after it becomes sub to set correctly enabled for other sketch subs
42   document()->setCurrentFeature(aNew, false);
43   return aNew;
44 }
45
46 //=================================================================================================
47 int FeaturesPlugin_CompositeSketch::numberOfSubs(bool forTree) const
48 {
49   ObjectPtr aObj = data()->reference(SKETCH_OBJECT_ID())->value();
50   return aObj.get()? 1 : 0;
51 }
52
53 //=================================================================================================
54 std::shared_ptr<ModelAPI_Feature> FeaturesPlugin_CompositeSketch::subFeature(const int theIndex, bool forTree)
55 {
56   if (theIndex == 0)
57     return std::dynamic_pointer_cast<ModelAPI_Feature>(data()->reference(SKETCH_OBJECT_ID())->value());
58   return std::shared_ptr<ModelAPI_Feature>();
59 }
60
61 //=================================================================================================
62 int FeaturesPlugin_CompositeSketch::subFeatureId(const int theIndex) const
63 {
64   if (theIndex == 0) {
65     FeaturePtr aFeature = 
66       std::dynamic_pointer_cast<ModelAPI_Feature>(data()->reference(SKETCH_OBJECT_ID())->value());
67     if (aFeature.get())
68       return aFeature->data()->featureId();
69   }
70   return -1;
71 }
72
73 //=================================================================================================
74 bool FeaturesPlugin_CompositeSketch::isSub(ObjectPtr theObject) const
75 {
76   // check is this feature of result
77   FeaturePtr aFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(theObject);
78   if (!aFeature)
79     return false;
80  
81   ObjectPtr aSub = data()->reference(SKETCH_OBJECT_ID())->value();
82   return aSub == theObject;
83 }
84
85 //=================================================================================================
86 void FeaturesPlugin_CompositeSketch::removeFeature(std::shared_ptr<ModelAPI_Feature> theFeature)
87 {
88   AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID());
89   if (aFacesSelectionList.get() && aFacesSelectionList->size() > 0)
90     aFacesSelectionList->clear();
91
92   data()->reference(SKETCH_OBJECT_ID())->setValue(ObjectPtr());
93 }
94
95 //=================================================================================================
96 void FeaturesPlugin_CompositeSketch::erase()
97 {
98   if (data().get() && data()->isValid()) { // on abort of sketch of this composite it may be invalid
99     FeaturePtr aSketch =
100       std::dynamic_pointer_cast<ModelAPI_Feature>(data()->reference(SKETCH_OBJECT_ID())->value());
101     if (aSketch.get() && aSketch->data()->isValid()) {
102       document()->removeFeature(aSketch);
103     }
104   }
105   ModelAPI_CompositeFeature::erase();
106 }
107
108
109 //=================================================================================================
110 void FeaturesPlugin_CompositeSketch::execute()
111 {
112   // Getting faces to create solids.
113   std::shared_ptr<ModelAPI_Feature> aSketchFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(
114                                                      reference(SKETCH_OBJECT_ID())->value());
115   if(!aSketchFeature || aSketchFeature->results().empty()) {
116     return;
117   }
118   ResultPtr aSketchRes = aSketchFeature->results().front();
119   ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aSketchRes);
120   if(!aConstruction.get()) {
121     return;
122   }
123
124   /// feature extrusion does not have the next attribute
125   if (data()->attribute(SKETCH_SELECTION_ID()).get()) {
126     if (!selection(SKETCH_SELECTION_ID())->isInitialized() || selection(SKETCH_SELECTION_ID())->context() != aSketchRes) {
127       selection(SKETCH_SELECTION_ID())->setValue(aSketchRes, std::shared_ptr<GeomAPI_Shape>());
128     }
129   }
130   int aSketchFacesNum = aConstruction->facesNum();
131   if(aSketchFacesNum == 0) {
132     return;
133   }
134   ListOfShape aFacesList;
135   for(int aFaceIndex = 0; aFaceIndex < aSketchFacesNum; aFaceIndex++) {
136     std::shared_ptr<GeomAPI_Shape> aFace = std::dynamic_pointer_cast<GeomAPI_Shape>(aConstruction->face(aFaceIndex));
137     aFacesList.push_back(aFace);
138   }
139
140   // Searching faces with common edges.
141   ListOfShape aShells;
142   ListOfShape aFreeFaces;
143   std::shared_ptr<GeomAPI_Shape> aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aFacesList);
144   GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, aShells, aFreeFaces);
145   aShells.insert(aShells.end(), aFreeFaces.begin(), aFreeFaces.end());
146
147   // Generating result for each shell and face.
148   int aErrorsNum = 0;
149   int aResultIndex = 0;
150   for(ListOfShape::const_iterator anIter = aShells.cbegin(); anIter != aShells.cend(); anIter++) {
151     std::shared_ptr<GeomAlgoAPI_MakeShape> aMakeShape;
152
153     std::shared_ptr<GeomAPI_Shape> aBaseFace = *anIter;
154     makeSolid(aBaseFace, aMakeShape);
155     if(!aMakeShape.get()) {
156       aErrorsNum++;
157       continue;
158     }
159
160     ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex);
161     loadNamingDS(aResultBody, aBaseFace, aMakeShape);
162     setResult(aResultBody, aResultIndex);
163     aResultIndex++;
164   }
165
166   if(aErrorsNum > 0) {
167     std::ostringstream aStringStream;
168     aStringStream << "Error: Could not create solid(s) from " << aErrorsNum << " face(s).";
169     setError(aStringStream.str());
170   }
171
172   // Remove the rest results if there were produced in the previous pass.
173   removeResults(aResultIndex);
174 }
175
176 //=================================================================================================
177 void FeaturesPlugin_CompositeSketch::loadNamingDS(std::shared_ptr<ModelAPI_ResultBody> theResultBody,
178                                                   const std::shared_ptr<GeomAPI_Shape>& theBaseShape,
179                                                   const std::shared_ptr<GeomAlgoAPI_MakeShape>& theMakeShape)
180 {
181   //load result
182   theResultBody->storeGenerated(theBaseShape, theMakeShape->shape());
183
184   //Insert lateral face : Face from Edge
185   const std::string aLatName = "LateralFace";
186   const int aLatTag = 1;
187   std::shared_ptr<GeomAPI_DataMapOfShapeShape> aDataMap = theMakeShape->mapOfSubShapes();
188   theResultBody->loadAndOrientGeneratedShapes(theMakeShape.get(), theBaseShape, GeomAPI_Shape::EDGE, aLatTag, aLatName, *aDataMap.get());
189
190   std::shared_ptr<GeomAlgoAPI_MakeSweep> aSweepAlgo = std::dynamic_pointer_cast<GeomAlgoAPI_MakeSweep>(theMakeShape);
191   if(aSweepAlgo.get()) {
192     //Insert to faces
193     int aToFaceIndex = 1;
194     const std::string aToName = "ToFace";
195     int aToTag = 2;
196     const ListOfShape& aToFaces = aSweepAlgo->toShapes();
197     for(ListOfShape::const_iterator anIt = aToFaces.cbegin(); anIt != aToFaces.cend(); anIt++) {
198       std::shared_ptr<GeomAPI_Shape> aToFace = *anIt;
199       if(aDataMap->isBound(aToFace)) {
200         aToFace = aDataMap->find(aToFace);
201       }
202       std::ostringstream aStr;
203       aStr << aToName << "_" << aToFaceIndex++;
204       theResultBody->generated(aToFace, aStr.str(), aToTag++);
205     }
206
207     //Insert from faces
208     int aFromFaceIndex = 1;
209     const std::string aFromName = "FromFace";
210     int aFromTag = aToTag > 10000 ? aToTag : 10000;
211     const ListOfShape& aFromFaces = aSweepAlgo->fromShapes();
212     for(ListOfShape::const_iterator anIt = aFromFaces.cbegin(); anIt != aFromFaces.cend(); anIt++) {
213       std::shared_ptr<GeomAPI_Shape> aFromFace = *anIt;
214       if(aDataMap->isBound(aFromFace)) {
215         aFromFace = aDataMap->find(aFromFace);
216       }
217       std::ostringstream aStr;
218       aStr << aFromName << "_" << aFromFaceIndex++;
219       theResultBody->generated(aFromFace, aStr.str(), aFromTag++);
220     }
221   }
222 }
223 //=================================================================================================
224 void FeaturesPlugin_CompositeSketch::setSketchObjectToList()
225 {
226   std::shared_ptr<ModelAPI_Feature> aSketchFeature = std::dynamic_pointer_cast<ModelAPI_Feature>(
227                                                        reference(SKETCH_OBJECT_ID())->value());
228
229   if(aSketchFeature.get() && !aSketchFeature->results().empty()) {
230     ResultPtr aSketchRes = aSketchFeature->results().front();
231     ResultConstructionPtr aConstruction = std::dynamic_pointer_cast<ModelAPI_ResultConstruction>(aSketchRes);
232     if(aConstruction.get()) {
233       AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID());
234       if (aFacesSelectionList.get() && aFacesSelectionList->size() == 0)
235         aFacesSelectionList->append(aSketchRes, std::shared_ptr<GeomAPI_Shape>());
236     }
237   }
238 }
239