X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Extrusion.cpp;h=10504a1832da15caa49a5e1368fd01d68edba40f;hb=7099969602bc9e4024d18cee3b6095840c56eb1f;hp=baf8f639769f49b80e20980a6b7761b807be346d;hpb=a94fc319f2aa64b43c9a73b5ff7063923648faec;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp index baf8f6397..10504a183 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.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,10 +12,9 @@ // // 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_Extrusion.h" @@ -25,12 +24,15 @@ #include #include #include +#include #include +#include #include #include #include +#include //================================================================================================= FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion() @@ -65,11 +67,11 @@ void FeaturesPlugin_Extrusion::initAttributes() //================================================================================================= void FeaturesPlugin_Extrusion::execute() { - ListOfShape aBaseShapesList; + ListOfShape aBaseShapesList, aBoundaryShapes; ListOfMakeShape aMakeShapesList; // Make extrusions. - if(!makeExtrusions(aBaseShapesList, aMakeShapesList)) { + if(!makeExtrusions(aBaseShapesList, aBoundaryShapes, aMakeShapesList)) { return; } @@ -79,7 +81,10 @@ void FeaturesPlugin_Extrusion::execute() ListOfMakeShape::const_iterator anAlgoIt = aMakeShapesList.cbegin(); for(; aBaseIt != aBaseShapesList.cend() && anAlgoIt != aMakeShapesList.cend(); ++aBaseIt, ++anAlgoIt) { - storeResult(*aBaseIt, *anAlgoIt, aResultIndex++); + if (aBoundaryShapes.empty()) + storeResult(*aBaseIt, *anAlgoIt, aResultIndex++); + else + storeResultWithBoundaries(*aBaseIt, aBoundaryShapes, *anAlgoIt, aResultIndex++); } removeResults(aResultIndex); @@ -87,6 +92,7 @@ void FeaturesPlugin_Extrusion::execute() //================================================================================================= bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, + ListOfShape& theBoundaryShapes, ListOfMakeShape& theMakeShapes) { theMakeShapes.clear(); @@ -96,44 +102,28 @@ bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, //Getting direction. std::shared_ptr aDir; - std::shared_ptr anEdge; - AttributeSelectionPtr aSelection = selection(DIRECTION_OBJECT_ID()); - if(aSelection.get() && aSelection->value().get() && aSelection->value()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(aSelection->value())); - } else if(aSelection->context().get() && - aSelection->context()->shape().get() && - aSelection->context()->shape()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(aSelection->context()->shape())); - } - if(anEdge.get()) { - if(anEdge->isLine()) { - aDir = anEdge->line()->direction(); - } - } + getDirection(aDir); // Getting sizes. double aToSize = 0.0; double aFromSize = 0.0; - - if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_SIZES()) { - aToSize = real(TO_SIZE_ID())->value(); - aFromSize = real(FROM_SIZE_ID())->value(); - } else { - aToSize = real(TO_OFFSET_ID())->value(); - aFromSize = real(FROM_OFFSET_ID())->value(); - } + getSizes(aToSize, aFromSize); // Getting bounding planes. GeomShapePtr aToShape; GeomShapePtr aFromShape; if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) { - aSelection = selection(TO_OBJECT_ID()); + AttributeSelectionPtr aSelection = selection(TO_OBJECT_ID()); if(aSelection.get()) { aToShape = std::dynamic_pointer_cast(aSelection->value()); if(!aToShape.get() && aSelection->context().get()) { aToShape = aSelection->context()->shape(); } + if (aToShape.get() && aToShape->isCompound()) { + GeomAPI_ShapeIterator anIt(aToShape); + aToShape = anIt.current(); + } } aSelection = selection(FROM_OBJECT_ID()); if(aSelection.get()) { @@ -141,10 +131,19 @@ bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, if(!aFromShape.get() && aSelection->context().get()) { aFromShape = aSelection->context()->shape(); } + if (aFromShape.get() && aFromShape->isCompound()) { + GeomAPI_ShapeIterator anIt(aFromShape); + aFromShape = anIt.current(); + } } } + if (aToShape && !aToShape->isPlanar()) + theBoundaryShapes.push_back(aToShape); + if (aFromShape && !aFromShape->isPlanar()) + theBoundaryShapes.push_back(aFromShape); // Generating result for each base shape. + std::string anError; for(ListOfShape::const_iterator anIter = theBaseShapes.cbegin(); anIter != theBaseShapes.cend(); anIter++) { std::shared_ptr aBaseShape = *anIter; @@ -152,7 +151,8 @@ bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, std::shared_ptr aPrismAlgo(new GeomAlgoAPI_Prism(aBaseShape, aDir, aToShape, aToSize, aFromShape, aFromSize)); - if(!isMakeShapeValid(aPrismAlgo)) { + if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aPrismAlgo, getKind(), anError)) { + setError(anError); return false; } @@ -161,3 +161,68 @@ bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, return true; } + +//================================================================================================= +void FeaturesPlugin_Extrusion::storeResultWithBoundaries( + const GeomShapePtr theBaseShape, + const ListOfShape& theBoundaryShapes, + const std::shared_ptr theMakeShape, + const int theIndex) +{ + // Create result body. + ResultBodyPtr aResultBody = document()->createBody(data(), theIndex); + + // Store modified shapes. + ModelAPI_Tools::loadModifiedShapes(aResultBody, theBoundaryShapes, ListOfShape(), + theMakeShape, theMakeShape->shape()); + + // Store generated edges/faces. + storeGenerationHistory(aResultBody, theBaseShape, theMakeShape); + + setResult(aResultBody, theIndex); +} + +//================================================================================================= +void FeaturesPlugin_Extrusion::getDirection(std::shared_ptr& theDir) +{ + static const std::string aSelectionError = "Error: The direction shape selection is bad."; + AttributeSelectionPtr aSelection = selection(DIRECTION_OBJECT_ID()); + GeomShapePtr aShape = aSelection->value(); + if (!aShape.get()) { + if (aSelection->context().get()) { + aShape = aSelection->context()->shape(); + } + } + + GeomEdgePtr anEdge; + if (aShape.get()) { + if (aShape->isEdge()) + { + anEdge = aShape->edge(); + } + else if (aShape->isCompound()) + { + GeomAPI_ShapeIterator anIt(aShape); + anEdge = anIt.current()->edge(); + } + } + + if (anEdge.get()) { + if (anEdge->isLine()) { + theDir = anEdge->line()->direction(); + } + } +} + +//================================================================================================= +void FeaturesPlugin_Extrusion::getSizes(double& theToSize, double& theFromSize) +{ + if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_SIZES()) { + theToSize = real(TO_SIZE_ID())->value(); + theFromSize = real(FROM_SIZE_ID())->value(); + } else if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) { + theToSize = real(TO_OFFSET_ID())->value(); + theFromSize = real(FROM_OFFSET_ID())->value(); + } else { + } +}