X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Extrusion.cpp;h=436462796606444f0f464522f301f0153fbc27f0;hb=4afb998c2356f5f6a415f6d7183b4427f97f3616;hp=8238b174388404eddc675eb24d0363e3b7d48b60;hpb=8317cfef5ebf2ce9ae8e1c9a3a441c5d30a2850e;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp index 8238b1743..436462796 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: FeaturesPlugin_Extrusion.cpp -// Created: 30 May 2014 -// Author: Vitaly SMETANNIKOV +// Copyright (C) 2014-2021 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 +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// 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 +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// #include "FeaturesPlugin_Extrusion.h" @@ -11,12 +24,15 @@ #include #include #include +#include #include +#include #include #include #include +#include //================================================================================================= FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion() @@ -51,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; } @@ -63,8 +79,12 @@ void FeaturesPlugin_Extrusion::execute() int aResultIndex = 0; ListOfShape::const_iterator aBaseIt = aBaseShapesList.cbegin(); ListOfMakeShape::const_iterator anAlgoIt = aMakeShapesList.cbegin(); - for(; aBaseIt != aBaseShapesList.cend() && anAlgoIt != aMakeShapesList.cend(); ++aBaseIt, ++anAlgoIt) { - storeResult(*aBaseIt, *anAlgoIt, aResultIndex++); + for(; aBaseIt != aBaseShapesList.cend() && anAlgoIt != aMakeShapesList.cend(); + ++aBaseIt, ++anAlgoIt) { + if (aBoundaryShapes.empty()) + storeResult(*aBaseIt, *anAlgoIt, aResultIndex++); + else + storeResultWithBoundaries(*aBaseIt, aBoundaryShapes, *anAlgoIt, aResultIndex++); } removeResults(aResultIndex); @@ -72,6 +92,7 @@ void FeaturesPlugin_Extrusion::execute() //================================================================================================= bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, + ListOfShape& theBoundaryShapes, ListOfMakeShape& theMakeShapes) { theMakeShapes.clear(); @@ -81,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()) { @@ -126,17 +131,28 @@ 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. - for(ListOfShape::const_iterator anIter = theBaseShapes.cbegin(); anIter != theBaseShapes.cend(); anIter++) { + std::string anError; + for(ListOfShape::const_iterator + anIter = theBaseShapes.cbegin(); anIter != theBaseShapes.cend(); anIter++) { std::shared_ptr aBaseShape = *anIter; 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; } @@ -145,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 { + } +}