X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Extrusion.cpp;h=c0bcd77f3bcb125d4f58cb8c534c9212ccd66084;hb=3205d0f18200948632155bbe7b640bc1e482243d;hp=4b57ee2b728ad8858d90dc0b418b0a3aeaf43920;hpb=b6be33d3af5a10e204e3bd69708d49b8b9f1a127;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp index 4b57ee2b7..c0bcd77f3 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp @@ -4,31 +4,20 @@ // Created: 30 May 2014 // Author: Vitaly SMETANNIKOV -#include +#include "FeaturesPlugin_Extrusion.h" -#include #include #include -#include -#include #include -#include #include #include #include #include -#include #include -#include +#include #include - -#define _LATERAL_TAG 1 -#define _FIRST_TAG 2 -#define _LAST_TAG 3 -#define EDGE 6 - -#define DEBUG_COMPSOLID +#include //================================================================================================= FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion() @@ -62,7 +51,35 @@ void FeaturesPlugin_Extrusion::initAttributes() //================================================================================================= void FeaturesPlugin_Extrusion::execute() { - AttributeSelectionListPtr aFaceRefs = selectionList(LIST_ID()); + // Getting faces. + ListOfShape aFacesList; + AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID()); + for(int anIndex = 0; anIndex < aFacesSelectionList->size(); anIndex++) { + AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex); + std::shared_ptr aFaceShape = aFaceSel->value(); + if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face. + aFacesList.push_back(aFaceShape); + } else { // This may be the whole sketch result selected, check and get faces. + ResultPtr aContext = aFaceSel->context(); + std::shared_ptr aContextShape = aContext->shape(); + if(!aContextShape.get()) { + static const std::string aContextError = "The selection context is bad"; + setError(aContextError); + return; + } + ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aContext); + if(!aConstruction.get()) { + static const std::string aFaceError = "Can not find basis for extrusion"; + setError(aFaceError); + return; + } + int aFacesNum = aConstruction->facesNum(); + for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) { + aFaceShape = std::dynamic_pointer_cast(aConstruction->face(aFaceIndex)); + aFacesList.push_back(aFaceShape); + } + } + } // Getting sizes. double aToSize = 0.0; @@ -97,116 +114,85 @@ void FeaturesPlugin_Extrusion::execute() } } - // for each selected face generate a result - int anIndex = 0, aResultIndex = 0; -#ifdef DEBUG_COMPSOLID - ResultCompSolidPtr aCompSolidResult = document()->createCompSolid(data(), aResultIndex); - setResult(aCompSolidResult, aResultIndex); - aResultIndex++; -#endif - for(; anIndex < aFaceRefs->size(); anIndex++) { - std::shared_ptr aFaceRef = aFaceRefs->value(anIndex); - ResultPtr aContextRes = aFaceRef->context(); - std::shared_ptr aContext = aContextRes->shape(); - if (!aContext.get()) { - static const std::string aContextError = "The selection context is bad"; - setError(aContextError); + // Searching faces with common edges. + ListOfShape aShells; + ListOfShape aFreeFaces; + std::shared_ptr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aFacesList); + GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, aShells, aFreeFaces); + aShells.insert(aShells.end(), aFreeFaces.begin(), aFreeFaces.end()); + + // Generating result for each shell and face. + int aResultIndex = 0; + for(ListOfShape::const_iterator anIter = aShells.cbegin(); anIter != aShells.cend(); anIter++) { + std::shared_ptr aBaseShape = *anIter; + + GeomAlgoAPI_Prism aPrismAlgo(aBaseShape, aToShape, aToSize, aFromShape, aFromSize); + if(!aPrismAlgo.isDone()) { + static const std::string aPrismAlgoError = "Extrusion algorithm failed"; + setError(aPrismAlgoError); + aResultIndex = 0; break; } - std::shared_ptr aValueFace = aFaceRef->value(); - int aFacesNum = -1; // this mean that "aFace" is used - ResultConstructionPtr aConstruction = - std::dynamic_pointer_cast(aContextRes); - if (!aValueFace.get()) { // this may be the whole sketch result selected, check and get faces - if (aConstruction.get()) { - aFacesNum = aConstruction->facesNum(); - } else { - static const std::string aFaceError = "Can not find basis for extrusion"; - setError(aFaceError); - break; - } + // Check if shape is valid + if(!aPrismAlgo.shape().get() || aPrismAlgo.shape()->isNull()) { + static const std::string aShapeError = "Resulting shape is Null"; + setError(aShapeError); + aResultIndex = 0; + break; } - for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) { -#ifdef DEBUG_COMPSOLID - ResultBodyPtr aResultBody = aCompSolidResult->addResult(aResultIndex); -#else - ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); -#endif - std::shared_ptr aBaseShape; - if (aFacesNum == -1) { - aBaseShape = aValueFace; - } else { - aBaseShape = std::dynamic_pointer_cast(aConstruction->face(aFaceIndex)); - } - - GeomAlgoAPI_Prism aFeature(aBaseShape, aToShape, aToSize, aFromShape, aFromSize); - if(!aFeature.isDone()) { - static const std::string aFeatureError = "Extrusion algorithm failed"; - setError(aFeatureError); - break; - } - - // Check if shape is valid - if(!aFeature.shape().get() || aFeature.shape()->isNull()) { - static const std::string aShapeError = "Resulting shape is Null"; - setError(aShapeError); - break; - } - if(!aFeature.isValid()) { - std::string aFeatureError = "Warning: resulting shape is not valid"; - setError(aFeatureError); - break; - } - //LoadNamingDS - LoadNamingDS(aFeature, aResultBody, aBaseShape, aContext); - setResult(aResultBody, aResultIndex); - aResultIndex++; - - if (aFacesNum == -1) - break; + if(!aPrismAlgo.isValid()) { + std::string aPrismAlgoError = "Warning: resulting shape is not valid"; + setError(aPrismAlgoError); + aResultIndex = 0; + break; } + + ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); + loadNamingDS(aPrismAlgo, aResultBody, aBaseShape); + setResult(aResultBody, aResultIndex); + aResultIndex++; } - // remove the rest results if there were produced in the previous pass + removeResults(aResultIndex); } //================================================================================================= -void FeaturesPlugin_Extrusion::LoadNamingDS(GeomAlgoAPI_Prism& theFeature, +void FeaturesPlugin_Extrusion::loadNamingDS(GeomAlgoAPI_Prism& thePrismAlgo, std::shared_ptr theResultBody, - std::shared_ptr theBasis, - std::shared_ptr theContext) + std::shared_ptr theBasis) { //load result - ModelAPI_BodyBuilder* aResultBuilder = theResultBody->getBodyBuilder(); - if(theBasis->isEqual(theContext)) - aResultBuilder->store(theFeature.shape()); - else - aResultBuilder->storeGenerated(theBasis, theFeature.shape()); + theResultBody->storeGenerated(theBasis, thePrismAlgo.shape()); - std::shared_ptr aSubShapes = theFeature.mapOfShapes(); + std::shared_ptr aSubShapes = thePrismAlgo.mapOfSubShapes(); //Insert lateral face : Face from Edge - std::string aLatName = "LateralFace"; - aResultBuilder->loadAndOrientGeneratedShapes(theFeature.makeShape().get(), theBasis, EDGE,_LATERAL_TAG, aLatName, *aSubShapes); - - //Insert bottom face - std::string aBotName = "BottomFace"; - std::shared_ptr aBottomFace = theFeature.firstShape(); - if(!aBottomFace->isNull()) { - if(aSubShapes->isBound(aBottomFace)) { - aBottomFace = aSubShapes->find(aBottomFace); + const std::string aLatName = "LateralFace"; + const int aLatTag = 1; + theResultBody->loadAndOrientGeneratedShapes(&thePrismAlgo, theBasis, GeomAPI_Shape::EDGE, aLatTag, aLatName, *aSubShapes); + + //Insert to faces + const std::string aToName = "ToFace"; + int aToTag = 2; + const ListOfShape& aToFaces = thePrismAlgo.toFaces(); + for(ListOfShape::const_iterator anIt = aToFaces.cbegin(); anIt != aToFaces.cend(); anIt++) { + std::shared_ptr aToFace = *anIt; + if(aSubShapes->isBound(aToFace)) { + aToFace = aSubShapes->find(aToFace); } - aResultBuilder->generated(aBottomFace, aBotName, _FIRST_TAG); + theResultBody->generated(aToFace, aToName, aToTag++); } - //Insert top face - std::string aTopName = "TopFace"; - std::shared_ptr aTopFace = theFeature.lastShape(); - if (!aTopFace->isNull()) { - if (aSubShapes->isBound(aTopFace)) { - aTopFace = aSubShapes->find(aTopFace); + //Insert from faces + const std::string aFromName = "FromFace"; + int aFromTag = aToTag > 10000 ? aToTag : 10000; + const ListOfShape& aFromFaces = thePrismAlgo.fromFaces(); + for(ListOfShape::const_iterator anIt = aFromFaces.cbegin(); anIt != aFromFaces.cend(); anIt++) { + std::shared_ptr aFromFace = *anIt; + if(aSubShapes->isBound(aFromFace)) { + aFromFace = aSubShapes->find(aFromFace); } - aResultBuilder->generated(aTopFace, aTopName, _LAST_TAG); + theResultBody->generated(aFromFace, aFromName, aFromTag++); } }