X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeBoolean.cpp;h=b47952c5dbbc97c950b8c92bc3d073e7e7038287;hb=5a4405dc843479d921b53b83c181cbe9359414fe;hp=f31196f42c0fcbe4fd375a80fd0ebd5e6c22c531;hpb=a94908a12c7428994444fe4f5202461a94390b1d;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp index f31196f42..b47952c5d 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -142,7 +143,7 @@ void FeaturesPlugin_CompositeBoolean::execute() // Pass shells/faces to solids creation function. ListOfShape aTools; - std::list> aSolidsAlgos; + ListOfMakeShape aSolidsAlgos; makeSolids(aShells, aTools, aSolidsAlgos); if(aTools.empty()) { return; @@ -202,7 +203,7 @@ void FeaturesPlugin_CompositeBoolean::execute() if(GeomAlgoAPI_ShapeTools::volume(aBoolAlgo.shape()) > 1.e-7) { std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); loadNamingDS(aResultBody, aShells, aSolidsAlgos, anObject, aTools, aBoolAlgo.shape(), - *aBoolAlgo.makeShape(), *aBoolAlgo.mapOfShapes()); + aBoolAlgo, *aBoolAlgo.mapOfSubShapes().get()); setResult(aResultBody, aResultIndex); aResultIndex++; } @@ -229,35 +230,35 @@ void FeaturesPlugin_CompositeBoolean::execute() } } - GeomAlgoAPI_Boolean aBoolAlgo(aUsedInOperationSolids, aTools, myBooleanOperationType); + std::shared_ptr aBoolAlgo(new GeomAlgoAPI_Boolean(aUsedInOperationSolids, aTools, myBooleanOperationType)); // Checking that the algorithm worked properly. - if(!aBoolAlgo.isDone() || aBoolAlgo.shape()->isNull() || !aBoolAlgo.isValid()) { + if(!aBoolAlgo->isDone() || aBoolAlgo->shape()->isNull() || !aBoolAlgo->isValid()) { setError("Boolean algorithm failed"); return; } GeomAlgoAPI_MakeShapeList aMakeShapeList; - aMakeShapeList.appendAlgo(aBoolAlgo.makeShape()); + aMakeShapeList.appendAlgo(aBoolAlgo); GeomAPI_DataMapOfShapeShape aMapOfShapes; - aMapOfShapes.merge(aBoolAlgo.mapOfShapes()); + aMapOfShapes.merge(aBoolAlgo->mapOfSubShapes()); // Add result to not used solids from compsolid. ListOfShape aShapesToAdd = aNotUsedSolids; - aShapesToAdd.push_back(aBoolAlgo.shape()); - GeomAlgoAPI_PaveFiller aFillerAlgo(aShapesToAdd, true); - if(!aFillerAlgo.isDone()) { + aShapesToAdd.push_back(aBoolAlgo->shape()); + std::shared_ptr aFillerAlgo(new GeomAlgoAPI_PaveFiller(aShapesToAdd, true)); + if(!aFillerAlgo->isDone()) { std::string aFeatureError = "PaveFiller algorithm failed"; setError(aFeatureError); return; } - aMakeShapeList.appendAlgo(aFillerAlgo.makeShape()); - aMapOfShapes.merge(aFillerAlgo.mapOfShapes()); + aMakeShapeList.appendAlgo(aFillerAlgo); + aMapOfShapes.merge(aFillerAlgo->mapOfSubShapes()); - if(GeomAlgoAPI_ShapeTools::volume(aFillerAlgo.shape()) > 1.e-7) { + if(GeomAlgoAPI_ShapeTools::volume(aFillerAlgo->shape()) > 1.e-7) { std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); - loadNamingDS(aResultBody, aShells, aSolidsAlgos, aCompSolid, aTools, aFillerAlgo.shape(), aMakeShapeList, aMapOfShapes); + loadNamingDS(aResultBody, aShells, aSolidsAlgos, aCompSolid, aTools, aFillerAlgo->shape(), aMakeShapeList, aMapOfShapes); setResult(aResultBody, aResultIndex); aResultIndex++; } @@ -304,12 +305,12 @@ void FeaturesPlugin_CompositeBoolean::execute() for(ListOfShape::iterator anIt = anOriginalSolids.begin(); anIt != anOriginalSolids.end(); anIt++) { ListOfShape aOneObjectList; aOneObjectList.push_back(*anIt); - GeomAlgoAPI_Boolean aCutAlgo(aOneObjectList, aNotUsedSolids, GeomAlgoAPI_Boolean::BOOL_CUT); + std::shared_ptr aCutAlgo(new GeomAlgoAPI_Boolean(aOneObjectList, aNotUsedSolids, GeomAlgoAPI_Boolean::BOOL_CUT)); - if(GeomAlgoAPI_ShapeTools::volume(aCutAlgo.shape()) > 1.e-7) { - aSolidsToFuse.push_back(aCutAlgo.shape()); - aMakeShapeList.appendAlgo(aCutAlgo.makeShape()); - aMapOfShapes.merge(aCutAlgo.mapOfShapes()); + if(GeomAlgoAPI_ShapeTools::volume(aCutAlgo->shape()) > 1.e-7) { + aSolidsToFuse.push_back(aCutAlgo->shape()); + aMakeShapeList.appendAlgo(aCutAlgo); + aMapOfShapes.merge(aCutAlgo->mapOfSubShapes()); } } } @@ -320,42 +321,42 @@ void FeaturesPlugin_CompositeBoolean::execute() aTools = aSolidsToFuse; // Fuse all objects and all tools. - GeomAlgoAPI_Boolean aFuseAlgo(anObjects, aTools, myBooleanOperationType); + std::shared_ptr aFuseAlgo(new GeomAlgoAPI_Boolean(anObjects, aTools, myBooleanOperationType)); // Checking that the algorithm worked properly. - if(!aFuseAlgo.isDone() || aFuseAlgo.shape()->isNull() || !aFuseAlgo.isValid()) { + if(!aFuseAlgo->isDone() || aFuseAlgo->shape()->isNull() || !aFuseAlgo->isValid()) { static const std::string aFeatureError = "Boolean algorithm failed"; setError(aFeatureError); return; } - std::shared_ptr aShape = aFuseAlgo.shape(); - aMakeShapeList.appendAlgo(aFuseAlgo.makeShape()); - aMapOfShapes.merge(aFuseAlgo.mapOfShapes()); + std::shared_ptr aShape = aFuseAlgo->shape(); + aMakeShapeList.appendAlgo(aFuseAlgo); + aMapOfShapes.merge(aFuseAlgo->mapOfSubShapes()); // Add result to not used solids from compsolid (if we have any). if(!aNotUsedSolids.empty()) { aNotUsedSolids.push_back(aShape); - GeomAlgoAPI_PaveFiller aFillerAlgo(aNotUsedSolids, true); - if(!aFillerAlgo.isDone()) { + std::shared_ptr aFillerAlgo(new GeomAlgoAPI_PaveFiller(aNotUsedSolids, true)); + if(!aFillerAlgo->isDone()) { std::string aFeatureError = "PaveFiller algorithm failed"; setError(aFeatureError); return; } - if(aFillerAlgo.shape()->isNull()) { + if(aFillerAlgo->shape()->isNull()) { static const std::string aShapeError = "Resulting shape is Null"; setError(aShapeError); return; } - if(!aFillerAlgo.isValid()) { + if(!aFillerAlgo->isValid()) { std::string aFeatureError = "Warning: resulting shape is not valid"; setError(aFeatureError); return; } - aShape = aFillerAlgo.shape(); - aMakeShapeList.appendAlgo(aFillerAlgo.makeShape()); - aMapOfShapes.merge(aFillerAlgo.mapOfShapes()); + aShape = aFillerAlgo->shape(); + aMakeShapeList.appendAlgo(aFillerAlgo); + aMapOfShapes.merge(aFillerAlgo->mapOfSubShapes()); } std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); @@ -377,7 +378,7 @@ void FeaturesPlugin_CompositeBoolean::execute() //================================================================================================= void FeaturesPlugin_CompositeBoolean::loadNamingDS(std::shared_ptr theResultBody, const ListOfShape& theShells, - const std::list>& theSolidsAlgos, + ListOfMakeShape& theSolidsAlgos, const std::shared_ptr theBaseShape, const ListOfShape& theTools, const std::shared_ptr theResultShape, @@ -392,7 +393,7 @@ void FeaturesPlugin_CompositeBoolean::loadNamingDS(std::shared_ptrstoreModified(theBaseShape, theResultShape, aSubsolidsTag); ListOfShape::const_iterator aShellsIter = theShells.begin(); - std::list>::const_iterator aSolidsAlgosIter = theSolidsAlgos.begin(); + ListOfMakeShape::const_iterator aSolidsAlgosIter = theSolidsAlgos.begin(); for(; aShellsIter != theShells.end() && aSolidsAlgosIter != theSolidsAlgos.end(); aShellsIter++, aSolidsAlgosIter++) { - ListOfShape aFromFaces; - ListOfShape aToFaces; - std::shared_ptr aSubShapes; - //Insert lateral face : Face from Edge - if(std::dynamic_pointer_cast(*aSolidsAlgosIter)) { - std::shared_ptr aPrismAlgo = std::dynamic_pointer_cast(*aSolidsAlgosIter); - aSubShapes = aPrismAlgo->mapOfSubShapes(); - theResultBody->loadAndOrientGeneratedShapes(aPrismAlgo.get(), *aShellsIter, GeomAPI_Shape::EDGE, aGenTag, + std::shared_ptr aSolidAlgo = std::dynamic_pointer_cast(*aSolidsAlgosIter); + if(aSolidAlgo.get()) { + std::shared_ptr aSubShapes = aSolidAlgo->mapOfSubShapes(); + theResultBody->loadAndOrientGeneratedShapes(aSolidAlgo.get(), *aShellsIter, GeomAPI_Shape::EDGE, aGenTag, aLatName, *aSubShapes.get()); - aFromFaces = aPrismAlgo->fromFaces(); - aToFaces = aPrismAlgo->toFaces(); - } else if(std::dynamic_pointer_cast(*aSolidsAlgosIter)) { - std::shared_ptr aRevolAlgo = std::dynamic_pointer_cast(*aSolidsAlgosIter); - aSubShapes = aRevolAlgo->mapOfSubShapes(); - theResultBody->loadAndOrientGeneratedShapes(aRevolAlgo.get(), *aShellsIter, GeomAPI_Shape::EDGE, aGenTag, - aLatName, *aSubShapes.get()); - aFromFaces = aRevolAlgo->fromFaces(); - aToFaces = aRevolAlgo->toFaces(); - } - //Insert to faces - for(ListOfShape::const_iterator anIt = aToFaces.cbegin(); anIt != aToFaces.cend(); anIt++) { - std::shared_ptr aToFace = *anIt; - if(aSubShapes->isBound(aToFace)) { - aToFace = aSubShapes->find(aToFace); - } - theResultBody->generated(aToFace, aToName, aToTag++); - } + std::shared_ptr aSweepAlgo = std::dynamic_pointer_cast(aSolidAlgo); + if(aSweepAlgo.get()) { + //Insert to faces + const ListOfShape& aToFaces = aSweepAlgo->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); + } + theResultBody->generated(aToFace, aToName, aToTag++); + } - //Insert from faces - if (aFromTag < aToTag) aFromTag = aToTag; - for(ListOfShape::const_iterator anIt = aFromFaces.cbegin(); anIt != aFromFaces.cend(); anIt++) { - std::shared_ptr aFromFace = *anIt; - if(aSubShapes->isBound(aFromFace)) { - aFromFace = aSubShapes->find(aFromFace); + //Insert from faces + const ListOfShape& aFromFaces = aSweepAlgo->fromFaces(); + if (aFromTag < aToTag) aFromTag = aToTag; + for(ListOfShape::const_iterator anIt = aFromFaces.cbegin(); anIt != aFromFaces.cend(); anIt++) { + std::shared_ptr aFromFace = *anIt; + if(aSubShapes->isBound(aFromFace)) { + aFromFace = aSubShapes->find(aFromFace); + } + theResultBody->generated(aFromFace, aFromName, aFromTag++); + } } - theResultBody->generated(aFromFace, aFromName, aFromTag++); } }