X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeSketch.cpp;h=1759b26b88cc6e136e9556f04bf6f69fce0d2ed4;hb=658fccce59f75b0cfa7c3f3d45f1ffb295ed24be;hp=5e7c13d43b14d6b22555231d2e65e0b87f055c40;hpb=bc13ffbc8c0dbdce3805bf9362ee8a3c05adf9b4;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index 5e7c13d43..1759b26b8 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp @@ -17,8 +17,12 @@ #include #include #include +#include + +#include #include +#include #include //================================================================================================= @@ -111,6 +115,7 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis theBaseShapesList.clear(); ListOfShape aBaseFacesList; + std::map aSketchWiresMap; AttributeSelectionListPtr aBaseObjectsSelectionList = selectionList(BASE_OBJECTS_ID()); if(!aBaseObjectsSelectionList.get()) { setError("Error: Could not get base objects selection list."); @@ -123,7 +128,7 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis for(int anIndex = 0; anIndex < aBaseObjectsSelectionList->size(); anIndex++) { AttributeSelectionPtr aBaseObjectSelection = aBaseObjectsSelectionList->value(anIndex); if(!aBaseObjectSelection.get()) { - setError("Error: One of the selected base objects is empty."); + setError("Error: Selected base object is empty."); return; } GeomShapePtr aBaseShape = aBaseObjectSelection->value(); @@ -134,14 +139,22 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis setError("Error: Selected shapes has unsupported type."); return; } + ResultConstructionPtr aConstruction = + std::dynamic_pointer_cast(aBaseObjectSelection->context()); + if(aConstruction.get() && !aBaseShape->isEqual(aConstruction->shape()) && aST == GeomAPI_Shape::WIRE) { + // It is a wire on the sketch, store it to make face later. + aSketchWiresMap[aConstruction].push_back(aBaseShape); + continue; + } else { aST == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : theBaseShapesList.push_back(aBaseShape); + } } else { // This may be the whole sketch result selected, check and get faces. ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aBaseObjectSelection->context()); if(!aConstruction.get()) { - setError("Error: One of selected sketches does not have results."); + setError("Error: Selected sketches does not have results."); return; } int aFacesNum = aConstruction->facesNum(); @@ -162,7 +175,7 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) { GeomShapePtr aBaseFace = aConstruction->face(aFaceIndex); if(!aBaseFace.get() || aBaseFace->isNull()) { - setError("Error: One of the faces on selected sketch is Null."); + setError("Error: One of the faces on selected sketch is null."); return; } aBaseFacesList.push_back(aBaseFace); @@ -171,6 +184,20 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis } } + // Make faces from sketch wires. + for(std::map::const_iterator anIt = aSketchWiresMap.cbegin(); + anIt != aSketchWiresMap.cend(); ++anIt) { + const std::shared_ptr aSketchPlanarEdges = + std::dynamic_pointer_cast((*anIt).first->shape()); + const ListOfShape& aWiresList = (*anIt).second; + ListOfShape aFaces; + GeomAlgoAPI_ShapeTools::makeFacesWithHoles(aSketchPlanarEdges->origin(), + aSketchPlanarEdges->norm(), + aWiresList, + aFaces); + aBaseFacesList.insert(aBaseFacesList.end(), aFaces.begin(), aFaces.end()); + } + // Searching faces with common edges. if(theIsMakeShells) { ListOfShape aShells; @@ -250,8 +277,12 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes ListOfShape aV1History, aV2History; theMakeShape->generated(aV1, aV1History); theMakeShape->generated(aV2, aV2History); - theResultBody->generated(aV1, aV1History.front(), aGenName + "Edge_1", theTag++); - theResultBody->generated(aV2, aV2History.front(), aGenName + "Edge_2", theTag++); + if(!aV1History.empty()) { + theResultBody->generated(aV1, aV1History.front(), aGenName + "Edge_1", theTag++); + } + if(!aV2History.empty()) { + theResultBody->generated(aV2, aV2History.front(), aGenName + "Edge_2", theTag++); + } } case GeomAPI_Shape::FACE: case GeomAPI_Shape::SHELL: {