X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Tools.cpp;h=ffaabc0200b71ee902f42dc6439bc853cc6631af;hb=88ee9b2b81cf93a6324336b57e30cc8a3a487499;hp=07709d1ed7fa2a2056346f9e0f0c28ebed31b07e;hpb=1c530eba1d76c012cfc61df1c21694e62f203d94;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp b/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp index 07709d1ed..ffaabc020 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Tools.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,59 +12,172 @@ // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // #include "FeaturesPlugin_Tools.h" +#include #include +#include +#include +#include +#include +#include + +#include #include -void FeaturesPlugin_Tools::storeModifiedShapes(GeomAlgoAPI_MakeShape& theAlgo, - std::shared_ptr theResultBody, - std::shared_ptr theBaseShape, - const int theFaceTag, - const int theEdgeTag, - const int theVertexTag, - const std::string theName, - GeomAPI_DataMapOfShapeShape& theSubShapes) +#include + +//================================================================================================== +bool FeaturesPlugin_Tools::getShape(const AttributeSelectionListPtr theSelectionList, + const bool theShareTopology, + ListOfShape& theShapesList, + std::string& theError) { - switch(theBaseShape->shapeType()) { - case GeomAPI_Shape::COMPOUND: { - for(GeomAPI_ShapeIterator anIt(theBaseShape); anIt.more(); anIt.next()) - { - storeModifiedShapes(theAlgo, - theResultBody, - anIt.current(), - theFaceTag, - theEdgeTag, - theVertexTag, - theName, - theSubShapes); + 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; + } + GeomValidators_ShapeType::TypeOfShape aSelType = + GeomValidators_ShapeType::shapeType(theSelectionList->selectionType()); + int aFacesNum = 0; + if (aSelType != GeomValidators_ShapeType::Vertex && + aSelType != GeomValidators_ShapeType::Edge) + 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::SOLID || aST == GeomAPI_Shape::COMPSOLID) { + 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); + } } - break; } - case GeomAPI_Shape::COMPSOLID: - case GeomAPI_Shape::SOLID: - case GeomAPI_Shape::SHELL: { - theResultBody->loadAndOrientModifiedShapes(&theAlgo, - theBaseShape, GeomAPI_Shape::FACE, - theFaceTag, theName + "_Face", theSubShapes, false, true); + } + + // 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; +} + +//================================================================================================== +bool FeaturesPlugin_Tools::shapesFromSelectionList( + const std::shared_ptr theSelectionList, + const bool theStoreFullHierarchy, + GeomAPI_ShapeHierarchy& theHierarchy, + std::list& theParts, ResultPtr& theTextureSource) +{ + int aSize = theSelectionList->size(); + if (aSize == 1) { + auto anObjectAttr = theSelectionList->value(0); + if (anObjectAttr.get()) { + FeaturePtr aFeature = anObjectAttr->contextFeature(); + if (aFeature.get() && aFeature->results().size() == 1) { + theTextureSource = aFeature->firstResult(); + } + else { + if (!aFeature.get()) { + auto aResult = anObjectAttr->context(); + if (aResult.get()) { + theTextureSource = aResult; + } + } + } } - case GeomAPI_Shape::FACE: - case GeomAPI_Shape::WIRE: { - theResultBody->loadAndOrientModifiedShapes(&theAlgo, - theBaseShape, GeomAPI_Shape::EDGE, - theEdgeTag, theName + "_Edge", theSubShapes, false, true); + } + for (int anObjectsIndex = 0; anObjectsIndex < aSize; anObjectsIndex++) { + AttributeSelectionPtr anObjectAttr = theSelectionList->value(anObjectsIndex); + std::shared_ptr anObject = anObjectAttr->value(); + if (!anObject.get()) { // may be for not-activated parts + return false; } - case GeomAPI_Shape::EDGE: { - theResultBody->loadAndOrientModifiedShapes(&theAlgo, - theBaseShape, GeomAPI_Shape::VERTEX, - theVertexTag, theName + "_Vertex", theSubShapes, false, true); + ResultPtr aContext = anObjectAttr->context(); + if (aContext && aContext->groupName() == ModelAPI_ResultPart::group()) + theParts.push_back(aContext); + else { + // store full shape hierarchy for the corresponding version only + theHierarchy.addObject(anObject); + if (theStoreFullHierarchy) + ModelAPI_Tools::fillShapeHierarchy(anObject, aContext, theHierarchy); } } + return true; }