X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Revolution.cpp;h=fb1a60c673c36f57fba2f362fc557fd1ee9664f0;hb=04e2497fc973f0afc95d0a4a6f95e37fb27f45e8;hp=ae67aa67a8734a9d07408168418147bbfa7214ad;hpb=57e5ff999c4f23cc66bc2c91fc298c8acf63b2b2;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp b/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp index ae67aa67a..fb1a60c67 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: FeaturesPlugin_Revolution.cpp -// Created: 12 May 2015 -// Author: Dmitry Bobylev +// 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 +// 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_Revolution.h" @@ -13,9 +26,11 @@ #include #include +#include #include #include +#include //================================================================================================= FeaturesPlugin_Revolution::FeaturesPlugin_Revolution() @@ -61,7 +76,8 @@ void FeaturesPlugin_Revolution::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) { + for(; aBaseIt != aBaseShapesList.cend() && anAlgoIt != aMakeShapesList.cend(); + ++aBaseIt, ++anAlgoIt) { storeResult(*aBaseIt, *anAlgoIt, aResultIndex++); } @@ -74,23 +90,40 @@ bool FeaturesPlugin_Revolution::makeRevolutions(ListOfShape& theBaseShapes, { theMakeShapes.clear(); - /// Sub-feature of the composite should be set in the base list. - setSketchObjectToList(); - // Getting base shapes. getBaseShapes(theBaseShapes); - //Getting axis. - std::shared_ptr anAxis; - std::shared_ptr anEdge; + // Getting axis. + static const std::string aSelectionError = "Error: The axis shape selection is bad."; AttributeSelectionPtr aSelection = selection(AXIS_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())); + GeomShapePtr aShape = aSelection->value(); + if (!aShape.get()) { + if (aSelection->context().get()) { + aShape = aSelection->context()->shape(); + } + } + if (!aShape.get()) { + setError(aSelectionError); + return false; + } + + GeomEdgePtr anEdge; + if (aShape->isEdge()) + { + anEdge = aShape->edge(); + } + else if (aShape->isCompound()) + { + GeomAPI_ShapeIterator anIt(aShape); + anEdge = anIt.current()->edge(); } + else + { + setError(aSelectionError); + return false; + } + + std::shared_ptr anAxis; if(anEdge.get()) { if(anEdge->isLine()) { anAxis = std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), @@ -106,25 +139,33 @@ bool FeaturesPlugin_Revolution::makeRevolutions(ListOfShape& theBaseShapes, double aToAngle = 0.0; double aFromAngle = 0.0; - if(string(CREATION_METHOD())->value() == "ByAngles") { + if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_ANGLES()) { aToAngle = real(TO_ANGLE_ID())->value(); aFromAngle = real(FROM_ANGLE_ID())->value(); - } else { + } else if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) { aToAngle = real(TO_OFFSET_ID())->value(); aFromAngle = real(FROM_OFFSET_ID())->value(); + } else if (string(CREATION_METHOD())->value() == CREATION_METHOD_THROUGH_ALL()) { + aToAngle = 360.0; + aFromAngle = 0.0; + } else { } // Getting bounding planes. GeomShapePtr aToShape; GeomShapePtr aFromShape; - if(string(CREATION_METHOD())->value() == "ByPlanesAndOffsets") { + if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_PLANES()) { 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()) { @@ -132,17 +173,25 @@ bool FeaturesPlugin_Revolution::makeRevolutions(ListOfShape& theBaseShapes, if(!aFromShape.get() && aSelection->context().get()) { aFromShape = aSelection->context()->shape(); } + if (aFromShape.get() && aFromShape->isCompound()) { + GeomAPI_ShapeIterator anIt(aFromShape); + aFromShape = anIt.current(); + } } } // 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++) { GeomShapePtr aBaseShape = *anIter; - std::shared_ptr aRevolAlgo(new GeomAlgoAPI_Revolution(aBaseShape, anAxis, - aToShape, aToAngle, - aFromShape, aFromAngle)); - if(!isMakeShapeValid(aRevolAlgo)) { + std::shared_ptr aRevolAlgo(new GeomAlgoAPI_Revolution( + aBaseShape, anAxis, + aToShape, aToAngle, + aFromShape, aFromAngle)); + if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRevolAlgo, getKind(), anError)) { + setError(anError); return false; }