X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Tools.cpp;h=55a1738426044d18276c31f08beaa65c2c16d58c;hb=00e7032c437ca3e2e47996307b679505794842c1;hp=dc1b1a7e16efd8149b6eefb799c1afccbbb98635;hpb=6e421e939851e0de46554ae45a3ca0e1f67cd91d;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp b/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp index dc1b1a7e1..55a173842 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp @@ -19,8 +19,14 @@ #include "FeaturesPlugin_Tools.h" +#include #include +#include +#include +#include + +#include #include //================================================================================================== @@ -133,3 +139,105 @@ void FeaturesPlugin_Tools::loadDeletedShapes( theResultShapesCompound); } } + +//================================================================================================== +bool FeaturesPlugin_Tools::getShape(const AttributeSelectionListPtr theSelectionList, + const bool theShareTopology, + ListOfShape& theShapesList, + std::string& theError) +{ + theShapesList.clear(); + + ListOfShape aBaseFacesList; + std::map aSketchWiresMap; + if(!theSelectionList.get()) { + theError = "Error: Could not get base objects selection list."; + return false; + } + if(theSelectionList->size() == 0) { + theError = "Error: Base objects list is empty."; + return false; + } + for(int anIndex = 0; anIndex < theSelectionList->size(); anIndex++) { + AttributeSelectionPtr aBaseObjectSelection = theSelectionList->value(anIndex); + if(!aBaseObjectSelection.get()) { + theError = "Error: Selected base object is empty."; + return false; + } + GeomShapePtr aBaseShape = aBaseObjectSelection->value(); + if(aBaseShape.get() && !aBaseShape->isNull()) { + GeomAPI_Shape::ShapeType aST = aBaseShape->shapeType(); + if(aST == GeomAPI_Shape::SOLID || aST == GeomAPI_Shape::COMPSOLID) { + theError = "Error: Selected shapes has unsupported type."; + return false; + } + 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) : + theShapesList.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()) { + theError = "Error: Selected sketches does not have results."; + return false; + } + int aFacesNum = aConstruction->facesNum(); + if(aFacesNum == 0) { + // Probably it can be construction. + aBaseShape = aConstruction->shape(); + if(aBaseShape.get() && !aBaseShape->isNull()) { + GeomAPI_Shape::ShapeType aST = aBaseShape->shapeType(); + if(aST != GeomAPI_Shape::VERTEX && aST != GeomAPI_Shape::EDGE && + aST != GeomAPI_Shape::WIRE && + aST != GeomAPI_Shape::FACE && aST != GeomAPI_Shape::SHELL) { + theError = "Error: Selected shapes has unsupported type."; + return false; + } + aST == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : + theShapesList.push_back(aBaseShape); + } + } else { + for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) { + GeomShapePtr aBaseFace = aConstruction->face(aFaceIndex); + if(!aBaseFace.get() || aBaseFace->isNull()) { + theError = "Error: One of the faces on selected sketch is null."; + return false; + } + aBaseFacesList.push_back(aBaseFace); + } + } + } + } + + // 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(theShareTopology && aBaseFacesList.size() > 1) { + GeomShapePtr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList); + GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, theShapesList); + } else { + theShapesList.insert(theShapesList.end(), aBaseFacesList.begin(), aBaseFacesList.end()); + } + return true; +}