X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeSketch.cpp;h=1759b26b88cc6e136e9556f04bf6f69fce0d2ed4;hb=658fccce59f75b0cfa7c3f3d45f1ffb295ed24be;hp=17f3158ddc9d88b631d7ebc654b4e016987f45ea;hpb=9769c7fe0f8bfd206645e7a45cf79714924710c0;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index 17f3158dd..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 //================================================================================================= @@ -104,49 +108,6 @@ void FeaturesPlugin_CompositeSketch::removeFeature(std::shared_ptrsetValue(ObjectPtr()); } -//================================================================================================= -void FeaturesPlugin_CompositeSketch::erase() -{ - if(data().get() && data()->isValid()) { // on abort of sketch of this composite it may be invalid - FeaturePtr aSketch = std::dynamic_pointer_cast(reference(SKETCH_ID())->value()); - if(aSketch.get() && aSketch->data()->isValid()) { - document()->removeFeature(aSketch); - } - } - - ModelAPI_CompositeFeature::erase(); -} - -//================================================================================================= -void FeaturesPlugin_CompositeSketch::setSketchObjectToList() -{ - AttributeSelectionListPtr aBaseObjectsSelectionList = selectionList(BASE_OBJECTS_ID()); - if(!aBaseObjectsSelectionList.get() || aBaseObjectsSelectionList->isInitialized()) { - return; - } - - AttributeReferencePtr aSketchLauncherRef = reference(SKETCH_ID()); - if(!aSketchLauncherRef.get() || !aSketchLauncherRef->isInitialized()) { - return; - } - - FeaturePtr aSketchFeature = std::dynamic_pointer_cast(aSketchLauncherRef->value()); - - if(!aSketchFeature.get() || aSketchFeature->results().empty()) { - return; - } - - ResultPtr aSketchRes = aSketchFeature->results().front(); - ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aSketchRes); - if(!aConstruction.get()) { - return; - } - - if(aBaseObjectsSelectionList->size() == 0) { - aBaseObjectsSelectionList->append(aSketchRes, GeomShapePtr()); - } -} - //================================================================================================= void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesList, const bool theIsMakeShells) @@ -154,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."); @@ -166,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(); @@ -177,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(); @@ -205,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); @@ -214,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; @@ -293,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: {