X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeBoolean.cpp;h=50343a5ba00722d23b997eb804c9a2f460fb6129;hb=c8759835f4eabfde25497d8b6189dda62dba78e8;hp=4783e23b1540a16ba26118297d41d40bf4f08882;hpb=abc04a43de67947a851486f8173e2a86bdd4c376;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp index 4783e23b1..50343a5ba 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeBoolean.cpp @@ -8,10 +8,13 @@ #include #include +#include #include #include -#include +#include +#include +#include //================================================================================================= void FeaturesPlugin_CompositeBoolean::initAttributes() @@ -118,7 +121,9 @@ void FeaturesPlugin_CompositeBoolean::execute() } // Pass faces to soldis creation function. - ListOfShape aBooleanTools = MakeSolids(aSketchFacesList); + ListOfShape aBooleanTools; + std::list> theSolidsAlgos; + makeSolids(aSketchFacesList, aBooleanTools, theSolidsAlgos); if(aBooleanTools.empty()) { return; } @@ -157,9 +162,9 @@ void FeaturesPlugin_CompositeBoolean::execute() return; } - if(GeomAlgoAPI_ShapeProps::volume(aBoolAlgo.shape()) > 1.e-7) { + if(GeomAlgoAPI_ShapeTools::volume(aBoolAlgo.shape()) > 1.e-7) { std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); - LoadNamingDS(aResultBody, anObject, aBooleanTools, aBoolAlgo); + loadNamingDS(aResultBody, anObject, aSketchFacesList, theSolidsAlgos, aBooleanTools, aBoolAlgo); setResult(aResultBody, aResultIndex); aResultIndex++; } @@ -177,7 +182,7 @@ void FeaturesPlugin_CompositeBoolean::execute() } std::shared_ptr aResultBody = document()->createBody(data(), aResultIndex); - LoadNamingDS(aResultBody, aBooleanObjects.front(), aBooleanTools, aBoolAlgo); + loadNamingDS(aResultBody, aBooleanObjects.front(), aSketchFacesList, theSolidsAlgos, aBooleanTools, aBoolAlgo); setResult(aResultBody, aResultIndex); aResultIndex++; break; @@ -193,8 +198,10 @@ void FeaturesPlugin_CompositeBoolean::execute() } //================================================================================================= -void FeaturesPlugin_CompositeBoolean::LoadNamingDS(std::shared_ptr theResultBody, +void FeaturesPlugin_CompositeBoolean::loadNamingDS(std::shared_ptr theResultBody, const std::shared_ptr& theBaseShape, + const ListOfShape& theFaces, + const std::list>& theSolidsAlgos, const ListOfShape& theTools, const GeomAlgoAPI_Boolean& theAlgo) { @@ -202,21 +209,72 @@ void FeaturesPlugin_CompositeBoolean::LoadNamingDS(std::shared_ptrisEqual(theAlgo.shape())) { theResultBody->store(theAlgo.shape()); } else { - theResultBody->storeModified(theBaseShape, theAlgo.shape()); + const int aGenTag = 1; + const int aFrTag = 2; + const int aToTag = 3; + const int aModTag = 4; + const int aDelTag = 5; + const int aSubsolidsTag=6; /// sub solids will be placed at labels 6, 7, etc. if result is compound of solids + const std::string aGenName = "Generated"; + const std::string aModName = "Modified"; + const std::string aLatName = "LateralFace"; + const std::string aFrName = "FromFace"; + const std::string aToName = "ToFace"; - GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape(); + theResultBody->storeModified(theBaseShape, theAlgo.shape(), aSubsolidsTag); + + ListOfShape::const_iterator aFaceIter = theFaces.begin(); + std::list>::const_iterator aSolidsAlgosIter = theSolidsAlgos.begin(); + for(; aFaceIter != theFaces.end() && aSolidsAlgosIter != theSolidsAlgos.end(); aFaceIter++, aSolidsAlgosIter++) { + std::shared_ptr aFromFace; + std::shared_ptr aToFace; + 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->mapOfShapes(); + theResultBody->loadAndOrientGeneratedShapes(aPrismAlgo->makeShape().get(), *aFaceIter, GeomAPI_Shape::EDGE, aGenTag, + aLatName, *aSubShapes.get()); + //TODO:fix + //aFromFace = aPrismAlgo->firstShape(); + //aToFace = aPrismAlgo->lastShape(); + } else if(std::dynamic_pointer_cast(*aSolidsAlgosIter)) { + std::shared_ptr aRevolAlgo = std::dynamic_pointer_cast(*aSolidsAlgosIter); + aSubShapes = aRevolAlgo->mapOfShapes(); + theResultBody->loadAndOrientGeneratedShapes(aRevolAlgo->makeShape().get(), *aFaceIter, GeomAPI_Shape::EDGE, aGenTag, + aLatName, *aSubShapes.get()); + aFromFace = aRevolAlgo->firstShape(); + aToFace = aRevolAlgo->lastShape(); + } + + /* + //Insert bottom face + if(!aFromFace->isNull()) { + if(aSubShapes->isBound(aFromFace)) { + aFromFace = aSubShapes->find(aFromFace); + } + theResultBody->generated(aFromFace, aFrName, aFrTag); + } + + //Insert top face + if (!aToFace->isNull()) { + if (aSubShapes->isBound(aToFace)) { + aToFace = aSubShapes->find(aToFace); + } + theResultBody->generated(aToFace, aToName, aToTag); + } + */ + } - const int aModTag = 1; - const int aDeleteTag = 2; - const std::string aModName = "Modified"; theResultBody->loadAndOrientModifiedShapes(theAlgo.makeShape().get(), theBaseShape, GeomAPI_Shape::FACE, aModTag, aModName, *theAlgo.mapOfShapes().get()); - theResultBody->loadDeletedShapes(theAlgo.makeShape().get(), theBaseShape, GeomAPI_Shape::FACE, aDeleteTag); + theResultBody->loadDeletedShapes(theAlgo.makeShape().get(), theBaseShape, GeomAPI_Shape::FACE, aDelTag); for(ListOfShape::const_iterator anIter = theTools.begin(); anIter != theTools.end(); anIter++) { theResultBody->loadAndOrientModifiedShapes(theAlgo.makeShape().get(), *anIter, GeomAPI_Shape::FACE, aModTag, aModName, *theAlgo.mapOfShapes().get()); - theResultBody->loadDeletedShapes(theAlgo.makeShape().get(), *anIter, GeomAPI_Shape::FACE, aDeleteTag); + theResultBody->loadDeletedShapes(theAlgo.makeShape().get(), *anIter, GeomAPI_Shape::FACE, aDelTag); } } }