X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_MultiRotation.cpp;h=0b12af92515b52df4c5d843add44c873777011ee;hb=fc72d43b677baa05ae7fd317346fd8b723b799ed;hp=3bd55a63a6e37509e87e02b399bc1269dd31e220;hpb=46aa3024234701a2e73ef90c378ae4bf414d90f7;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_MultiRotation.cpp b/src/FeaturesPlugin/FeaturesPlugin_MultiRotation.cpp index 3bd55a63a..0b12af925 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_MultiRotation.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_MultiRotation.cpp @@ -1,13 +1,33 @@ -// Copyright (C) 2014-201x CEA/DEN, EDF R&D +// Copyright (C) 2017-2023 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 +// // File: FeaturesPlugin_MultiRotation.cpp // Created: 30 Jan 2017 // Author: Clarisse Genrault (CEA) #include +#include #include +#include #include +#include #include #include @@ -15,6 +35,7 @@ #include #include #include +#include #include #include @@ -23,10 +44,13 @@ #include #include #include +#include #include #include +static const std::string MULTIROTATION_VERSION_1("v9.5"); + //================================================================================================= FeaturesPlugin_MultiRotation::FeaturesPlugin_MultiRotation() { @@ -49,148 +73,162 @@ void FeaturesPlugin_MultiRotation::initAttributes() data()->addAttribute(FeaturesPlugin_MultiRotation::NB_COPIES_ANGULAR_ID(), ModelAPI_AttributeInteger::typeId()); - /*data()->addAttribute(FeaturesPlugin_MultiRotation::USE_RADIAL_DIR_ID(), +#ifdef FEATURE_MULTIROTATION_TWO_DIRECTIONS + data()->addAttribute(FeaturesPlugin_MultiRotation::USE_RADIAL_DIR_ID(), ModelAPI_AttributeString::typeId()); data()->addAttribute(FeaturesPlugin_MultiRotation::STEP_RADIAL_ID(), ModelAPI_AttributeDouble::typeId()); data()->addAttribute(FeaturesPlugin_MultiRotation::NB_COPIES_RADIAL_ID(), - ModelAPI_AttributeInteger::typeId());*/ + ModelAPI_AttributeInteger::typeId()); +#endif + + if (!aSelection->isInitialized()) { + // new feature, not read from file + data()->setVersion(MULTIROTATION_VERSION_1); + } } //================================================================================================= void FeaturesPlugin_MultiRotation::execute() { - /*std::string useRadialDir = string(FeaturesPlugin_MultiRotation::USE_RADIAL_DIR_ID())->value(); +#ifdef FEATURE_MULTIROTATION_TWO_DIRECTIONS + std::string useRadialDir = string(FeaturesPlugin_MultiRotation::USE_RADIAL_DIR_ID())->value(); if (useRadialDir.empty()) { performRotation1D(); } else { performRotation2D(); - }*/ + } +#else performRotation1D(); +#endif } //================================================================================================= -void FeaturesPlugin_MultiRotation::performRotation1D() +bool FeaturesPlugin_MultiRotation::paramsOfRotation(std::shared_ptr& theAxis, + double& theAngle, + int& theQuantity) { - // Getting objects. - ListOfShape anObjects; - std::list aContextes; - AttributeSelectionListPtr anObjectsSelList = - selectionList(FeaturesPlugin_MultiRotation::OBJECTS_LIST_ID()); - if (anObjectsSelList->size() == 0) { - return; - } - for(int anObjectsIndex = 0; anObjectsIndex < anObjectsSelList->size(); anObjectsIndex++) { - std::shared_ptr anObjectAttr = - anObjectsSelList->value(anObjectsIndex); - std::shared_ptr anObject = anObjectAttr->value(); - if(!anObject.get()) { // may be for not-activated parts - eraseResults(); - return; - } - anObjects.push_back(anObject); - aContextes.push_back(anObjectAttr->context()); + //Getting axis. + static const std::string aSelectionError = "Error: The axis shape selection is bad."; + AttributeSelectionPtr anObjRef = selection(AXIS_ANGULAR_ID()); + GeomShapePtr aShape = anObjRef->value(); + if (!aShape.get() && anObjRef->context().get()) + aShape = anObjRef->context()->shape(); + if (!aShape.get()) { + setError(aSelectionError); + return false; } - //Getting axis. - std::shared_ptr anAxis; - std::shared_ptr anEdge; - std::shared_ptr anObjRef = - selection(FeaturesPlugin_MultiRotation::AXIS_ANGULAR_ID()); - if(anObjRef && anObjRef->value() && anObjRef->value()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(anObjRef->value())); - } else if (anObjRef && !anObjRef->value() && anObjRef->context() && - anObjRef->context()->shape() && anObjRef->context()->shape()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(anObjRef->context()->shape())); + GeomEdgePtr anEdge; + if (aShape->isEdge()) + anEdge = aShape->edge(); + else if (aShape->isCompound()) { + GeomAPI_ShapeIterator anIt(aShape); + anEdge = anIt.current()->edge(); } - if(anEdge) { - anAxis = std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), - anEdge->line()->direction())); + + if (!anEdge.get()) { + setError(aSelectionError); + return false; } - // Getting number of copies. - int nbCopies = - integer(FeaturesPlugin_MultiRotation::NB_COPIES_ANGULAR_ID())->value(); + theAxis.reset(new GeomAPI_Ax1(anEdge->line()->location(), anEdge->line()->direction())); - if (nbCopies <=0) { + // Getting number of copies. + theQuantity = integer(FeaturesPlugin_MultiRotation::NB_COPIES_ANGULAR_ID())->value(); + if (theQuantity <= 0) { std::string aFeatureError = "Multirotation builder "; - aFeatureError+=":: the number of copies for the angular direction is null or negative."; + aFeatureError += ":: the number of copies for the angular direction is null or negative."; setError(aFeatureError); - return; + return false; } // Getting angle - double anAngle; std::string useAngularStep = string(FeaturesPlugin_MultiRotation::USE_ANGULAR_STEP_ID())->value(); - if (!useAngularStep.empty()) { - anAngle = real(FeaturesPlugin_MultiRotation::STEP_ANGULAR_ID())->value(); - } else { - anAngle = 360./nbCopies; + if (!useAngularStep.empty()) + theAngle = real(FeaturesPlugin_MultiRotation::STEP_ANGULAR_ID())->value(); + else + theAngle = 360. / theQuantity; + return true; +} + +//================================================================================================= +void FeaturesPlugin_MultiRotation::performRotation1D() +{ + bool isKeepSubShapes = data()->version() == MULTIROTATION_VERSION_1; + + // Getting objects. + AttributeSelectionListPtr anObjectsSelList = selectionList(OBJECTS_LIST_ID()); + if (anObjectsSelList->size() == 0) { + setError("Error: empty selection list"); + return; } - // Moving each object. - int aResultIndex = 0; - std::list::iterator aContext = aContextes.begin(); - for(ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); - anObjectsIt++, aContext++) { - std::shared_ptr aBaseShape = *anObjectsIt; - bool isPart = (*aContext)->groupName() == ModelAPI_ResultPart::group(); + GeomAPI_ShapeHierarchy anObjects; + std::list aParts; + ResultPtr aTextureSource; + if (!FeaturesPlugin_Tools::shapesFromSelectionList + (anObjectsSelList, isKeepSubShapes, anObjects, aParts, aTextureSource)) + return; - // Setting result. - if (isPart) { - ResultPartPtr anOrigin = std::dynamic_pointer_cast(*aContext); - std::shared_ptr aTrsf(new GeomAPI_Trsf()); - for (int i=0; isetRotation(anAxis, i*anAngle); - ResultPartPtr aResultPart = document()->copyPart(anOrigin, data(), aResultIndex); - aResultPart->setTrsf(*aContext, aTrsf); - setResult(aResultPart, aResultIndex); - aResultIndex++; - } - } else { - ListOfShape aListOfShape; - std::list > aListOfRotationAlgo; + // Parameters of rotation. + std::shared_ptr anAxis; + double anAngle = 0.0; + int nbCopies = 0; + if (!paramsOfRotation(anAxis, anAngle, nbCopies)) + return; - for (int i=0; i aRotationnAlgo( - new GeomAlgoAPI_Rotation(aBaseShape, anAxis, i*anAngle)); - if (!aRotationnAlgo->check()) { - setError(aRotationnAlgo->getError()); - break; - } + std::string anError; + int aResultIndex = 0; + // Moving each part. + for (std::list::iterator aPRes = aParts.begin(); aPRes != aParts.end(); ++aPRes) { + ResultPartPtr anOrigin = std::dynamic_pointer_cast(*aPRes); + std::shared_ptr aTrsf(new GeomAPI_Trsf()); + for (int i = 0; i < nbCopies; ++i) { + aTrsf->setRotation(anAxis, i * anAngle); + ResultPartPtr aResultPart = document()->copyPart(anOrigin, data(), aResultIndex); + aResultPart->setTrsf(anOrigin, aTrsf); + setResult(aResultPart, aResultIndex++); + } + } - aRotationnAlgo->build(); + // Collect transformations for each object in a part. + std::shared_ptr aMakeShapeList(new GeomAlgoAPI_MakeShapeSet); + for (GeomAPI_ShapeHierarchy::iterator anObjectsIt = anObjects.begin(); + anObjectsIt != anObjects.end(); anObjectsIt++) { + std::shared_ptr aBaseShape = *anObjectsIt; + ListOfShape aListOfShape; - // Checking that the algorithm worked properly. - if (!aRotationnAlgo->isDone()) { - static const std::string aFeatureError = "Error : Multitranslation algorithm failed."; - setError(aFeatureError); - break; - } - if (aRotationnAlgo->shape()->isNull()) { - static const std::string aShapeError = "Error : Resulting shape is null."; - setError(aShapeError); - break; - } - if (!aRotationnAlgo->isValid()) { - static const std::string aFeatureError = "Error : Resulting shape in not valid."; - setError(aFeatureError); - break; - } - aListOfShape.push_back(aRotationnAlgo->shape()); - aListOfRotationAlgo.push_back(aRotationnAlgo); - } - std::shared_ptr aCompound = - GeomAlgoAPI_CompoundBuilder::compound(aListOfShape); - ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); - aResultBody->storeModified(aBaseShape, aCompound); - loadNamingDS(aListOfRotationAlgo, aResultBody, aBaseShape); + for (int i = 0; i < nbCopies; i++) { + std::shared_ptr aRotationnAlgo( + new GeomAlgoAPI_Rotation(aBaseShape, anAxis, i * anAngle)); - setResult(aResultBody, aResultIndex); + // Checking that the algorithm worked properly. + if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRotationnAlgo, getKind(), anError)) { + setError(anError); + break; + } + aListOfShape.push_back(aRotationnAlgo->shape()); + aMakeShapeList->appendAlgo(aRotationnAlgo); } - aResultIndex++; + + GeomShapePtr aCompound = GeomAlgoAPI_CompoundBuilder::compound(aListOfShape); + anObjects.markModified(aBaseShape, aCompound); + } + + // Build results of the operation. + const ListOfShape& anOriginalShapes = anObjects.objects(); + ListOfShape aTopLevel; + anObjects.topLevelObjects(aTopLevel); + for (ListOfShape::iterator anIt = aTopLevel.begin(); anIt != aTopLevel.end(); ++anIt) { + ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); + ModelAPI_Tools::loadModifiedShapes(aResultBody, anOriginalShapes, ListOfShape(), + aMakeShapeList, *anIt, "Rotated"); + // Copy image data, if any + ModelAPI_Tools::copyImageAttribute(aTextureSource, aResultBody); + setResult(aResultBody, aResultIndex++); } // Remove the rest results if there were produced in the previous pass. @@ -198,6 +236,7 @@ void FeaturesPlugin_MultiRotation::performRotation1D() } //================================================================================================= +#ifdef FEATURE_MULTIROTATION_TWO_DIRECTIONS void FeaturesPlugin_MultiRotation::performRotation2D() { // Getting objects. @@ -213,39 +252,19 @@ void FeaturesPlugin_MultiRotation::performRotation2D() anObjectsSelList->value(anObjectsIndex); std::shared_ptr anObject = anObjectAttr->value(); if(!anObject.get()) { // may be for not-activated parts - eraseResults(); return; } anObjects.push_back(anObject); aContextes.push_back(anObjectAttr->context()); } - //Getting axis. + // Parameters of rotation. std::shared_ptr anAxis; - std::shared_ptr anEdge; - std::shared_ptr anObjRef = - selection(FeaturesPlugin_MultiRotation::AXIS_ANGULAR_ID()); - if(anObjRef && anObjRef->value() && anObjRef->value()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(anObjRef->value())); - } else if (anObjRef && !anObjRef->value() && anObjRef->context() && - anObjRef->context()->shape() && anObjRef->context()->shape()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(anObjRef->context()->shape())); - } - if(anEdge) { - anAxis = std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), - anEdge->line()->direction())); - } - - // Getting number of copies int he angular direction. - int nbAngular = - integer(FeaturesPlugin_MultiRotation::NB_COPIES_ANGULAR_ID())->value(); - - if (nbAngular <=0) { - std::string aFeatureError = "Multirotation builder "; - aFeatureError+=":: the number of copies for the angular direction is null or negative."; - setError(aFeatureError); + double anAngle = 0.0; + int nbCopies = 0; + if (!paramsOfRotation(anAxis, anAngle, nbCopies)) return; - } + // Getting number of copies int he radial direction. int nbRadial = @@ -258,16 +277,6 @@ void FeaturesPlugin_MultiRotation::performRotation2D() return; } - // Getting angle - double anAngle; - std::string useAngularStep = - string(FeaturesPlugin_MultiRotation::USE_ANGULAR_STEP_ID())->value(); - if (!useAngularStep.empty()) { - anAngle = real(FeaturesPlugin_MultiRotation::STEP_ANGULAR_ID())->value(); - } else { - anAngle = 360./nbAngular; - } - // Getting step double aStep = real(FeaturesPlugin_MultiRotation::STEP_RADIAL_ID())->value(); @@ -277,7 +286,7 @@ void FeaturesPlugin_MultiRotation::performRotation2D() for(ListOfShape::iterator anObjectsIt = anObjects.begin(); anObjectsIt != anObjects.end(); anObjectsIt++, aContext++) { std::shared_ptr aBaseShape = *anObjectsIt; - bool isPart = (*aContext)->groupName() == ModelAPI_ResultPart::group(); + bool isPart = aContext->get() && (*aContext)->groupName() == ModelAPI_ResultPart::group(); std::shared_ptr aDir = GeomAlgoAPI_ShapeTools::buildDirFromAxisAndShape(aBaseShape, anAxis); @@ -374,8 +383,8 @@ void FeaturesPlugin_MultiRotation::performRotation2D() loadNamingDS2(aListOfTranslationAlgo, aResultBody, aBaseShape); loadNamingDS3(aListOfRotationAlgo, aResultBody, aBaseShape, nbRadial); setResult(aResultBody, aResultIndex); + aResultIndex++; } - aResultIndex++; } // Remove the rest results if there were produced in the previous pass. @@ -388,34 +397,16 @@ void FeaturesPlugin_MultiRotation::loadNamingDS2( std::shared_ptr theResultBody, std::shared_ptr theBaseShape) { - int aTag = 1; - int anIndex = 1; - std::string aRotatedName; - for (std::list >::const_iterator anIt = theListOfTranslationAlgo.begin(); anIt != theListOfTranslationAlgo.cend(); ++anIt) { - std::cout << "LOAD" << std::endl; - std::shared_ptr aSubShapes = (*anIt)->mapOfSubShapes(); - // naming of faces - aRotatedName = "Rotated_Face_" + std::to_string((long long) anIndex); - theResultBody->loadAndOrientModifiedShapes((*anIt).get(), theBaseShape, GeomAPI_Shape::FACE, - aTag++, aRotatedName, *aSubShapes.get(), - false, true); + theResultBody->loadModifiedShapes(*anIt, theBaseShape, GeomAPI_Shape::FACE, "Rotated_Face"); // naming of edges - aRotatedName = "Rotated_Edge_" + std::to_string((long long) anIndex); - theResultBody->loadAndOrientModifiedShapes((*anIt).get(), theBaseShape, GeomAPI_Shape::EDGE, - aTag++, aRotatedName, *aSubShapes.get(), - false, true); + theResultBody->loadModifiedShapes(*anIt, theBaseShape, GeomAPI_Shape::EDGE, "Rotated_Edge"); // naming of vertex - aRotatedName = "Rotated_Vertex_" + std::to_string((long long) anIndex); - theResultBody->loadAndOrientModifiedShapes((*anIt).get(), theBaseShape, GeomAPI_Shape::VERTEX, - aTag++, aRotatedName, *aSubShapes.get(), - false, true); - - ++anIndex; + theResultBody->loadModifiedShapes(*anIt, theBaseShape, GeomAPI_Shape::VERTEX, "Rotated_Vertex"); } } @@ -425,7 +416,6 @@ void FeaturesPlugin_MultiRotation::loadNamingDS3( std::shared_ptr theResultBody, std::shared_ptr theBaseShape, int nb) { - int aTag = 6*nb+1; int anIndex = nb+1; std::string aRotatedName; @@ -438,44 +428,10 @@ void FeaturesPlugin_MultiRotation::loadNamingDS3( for(; anExp.more(); anExp.next()) { aRotatedName = "Rotated_Face_" + std::to_string((long long) anIndex); aRotatedName = aRotatedName + "_" + std::to_string((long long) numFace); - theResultBody->generated(anExp.current(), aRotatedName, aTag++); + theResultBody->generated(anExp.current(), aRotatedName); ++numFace; } ++anIndex; } } - -//================================================================================================= -void FeaturesPlugin_MultiRotation::loadNamingDS( - std::list > theListOfRotationAlgo, - std::shared_ptr theResultBody, - std::shared_ptr theBaseShape) -{ - int aTag = 1; - int anIndex = 1; - std::string aRotatedName; - - for (std::list >::const_iterator anIt = - theListOfRotationAlgo.begin(); anIt != theListOfRotationAlgo.cend(); ++anIt) { - std::shared_ptr aSubShapes = (*anIt)->mapOfSubShapes(); - - // naming of faces - aRotatedName = "Rotated_Face_" + std::to_string((long long) anIndex); - theResultBody->loadAndOrientModifiedShapes((*anIt).get(), theBaseShape, GeomAPI_Shape::FACE, - aTag++, aRotatedName, *aSubShapes.get(), - false, true); - - // naming of edges - aRotatedName = "Rotated_Edge_" + std::to_string((long long) anIndex); - theResultBody->loadAndOrientModifiedShapes((*anIt).get(), theBaseShape, GeomAPI_Shape::EDGE, - aTag++, aRotatedName, *aSubShapes.get(), - false, true); - - // naming of vertex - aRotatedName = "Rotated_Vertex_" + std::to_string((long long) anIndex); - theResultBody->loadAndOrientModifiedShapes((*anIt).get(), theBaseShape, GeomAPI_Shape::VERTEX, - aTag++, aRotatedName, *aSubShapes.get(), - false, true); - ++anIndex; - } -} +#endif