X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Revolution.cpp;h=fb1a60c673c36f57fba2f362fc557fd1ee9664f0;hb=88ee9b2b81cf93a6324336b57e30cc8a3a487499;hp=8f34e2f5657ea0ca48b7cab1bfb85430c98a1ed7;hpb=7ae8f08629e5f99575f3cec07a8b701dd9209591;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp b/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp index 8f34e2f56..fb1a60c67 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp @@ -1,31 +1,36 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: FeaturesPlugin_Revolution.cpp -// Created: 12 May 2015 -// Author: Dmitry Bobylev - -#include - -#include -#include -#include -#include -#include -#include -#include +// 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" #include -#include +#include +#include #include #include -#include -#include -#define FACE 4 -#define EDGE 6 -#define _LATERAL_TAG 1 -#define _FROM_TAG 2 -#define _TO_TAG 3 +#include +#include + +#include +#include +#include //================================================================================================= FeaturesPlugin_Revolution::FeaturesPlugin_Revolution() @@ -35,160 +40,163 @@ FeaturesPlugin_Revolution::FeaturesPlugin_Revolution() //================================================================================================= void FeaturesPlugin_Revolution::initAttributes() { - AttributeSelectionListPtr aSelection = - std::dynamic_pointer_cast(data()->addAttribute( - FeaturesPlugin_Revolution::LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); - // revolution works with faces always - aSelection->setSelectionType("FACE"); + initCompositeSketchAttribtues(InitBaseObjectsList); + + data()->addAttribute(AXIS_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + + data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::typeId()); - data()->addAttribute(FeaturesPlugin_Revolution::AXIS_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(TO_ANGLE_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(FROM_ANGLE_ID(), ModelAPI_AttributeDouble::typeId()); - data()->addAttribute(FeaturesPlugin_Revolution::FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(FeaturesPlugin_Revolution::FROM_ANGLE_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(TO_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(TO_OFFSET_ID(), ModelAPI_AttributeDouble::typeId()); - data()->addAttribute(FeaturesPlugin_Revolution::TO_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(FeaturesPlugin_Revolution::TO_ANGLE_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(FROM_OFFSET_ID(), ModelAPI_AttributeDouble::typeId()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FeaturesPlugin_Revolution::FROM_OBJECT_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FeaturesPlugin_Revolution::TO_OBJECT_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), TO_OBJECT_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FROM_OBJECT_ID()); + + initCompositeSketchAttribtues(InitSketchLauncher); } //================================================================================================= void FeaturesPlugin_Revolution::execute() { - AttributeSelectionListPtr aFaceRefs = selectionList(FeaturesPlugin_Revolution::LIST_ID()); + ListOfShape aBaseShapesList; + ListOfMakeShape aMakeShapesList; - //Getting axis. - std::shared_ptr anAxis; - std::shared_ptr anEdge; - std::shared_ptr anObjRef = selection(FeaturesPlugin_Revolution::AXIS_OBJECT_ID()); - if(anObjRef && anObjRef->value() && anObjRef->value()->isEdge()) { - anEdge = std::shared_ptr(new GeomAPI_Edge(anObjRef->value())); + // Make revolutions. + if(!makeRevolutions(aBaseShapesList, aMakeShapesList)) { + return; } - if(anEdge) { - anAxis = std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), anEdge->line()->direction())); + + // Store results. + 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++); } - // Getting bounding planes. - std::shared_ptr aFromShape(new GeomAPI_Shape()); - std::shared_ptr aToShape(new GeomAPI_Shape()); + removeResults(aResultIndex); +} - anObjRef = selection(FeaturesPlugin_Revolution::FROM_OBJECT_ID()); - if(anObjRef) { - aFromShape = std::dynamic_pointer_cast(anObjRef->value()); +//================================================================================================= +bool FeaturesPlugin_Revolution::makeRevolutions(ListOfShape& theBaseShapes, + ListOfMakeShape& theMakeShapes) +{ + theMakeShapes.clear(); + + // Getting base shapes. + getBaseShapes(theBaseShapes); + + // Getting axis. + static const std::string aSelectionError = "Error: The axis shape selection is bad."; + AttributeSelectionPtr aSelection = selection(AXIS_OBJECT_ID()); + GeomShapePtr aShape = aSelection->value(); + if (!aShape.get()) { + if (aSelection->context().get()) { + aShape = aSelection->context()->shape(); + } } - anObjRef = selection(FeaturesPlugin_Revolution::TO_OBJECT_ID()); - if(anObjRef) { - aToShape = std::dynamic_pointer_cast(anObjRef->value()); + if (!aShape.get()) { + setError(aSelectionError); + return false; } - // Getting angles. - double aFromAngle = real(FeaturesPlugin_Revolution::FROM_ANGLE_ID())->value(); - double aToAngle = real(FeaturesPlugin_Revolution::TO_ANGLE_ID())->value(); - - // for each selected face generate a result - int anIndex = 0, aResultIndex = 0; - for(; anIndex < aFaceRefs->size(); anIndex++) { - std::shared_ptr aFaceRef = aFaceRefs->value(anIndex); - ResultPtr aContextRes = aFaceRef->context(); - std::shared_ptr aContext = aContextRes->shape(); - if (!aContext.get()) { - static const std::string aContextError = "The selection context is bad"; - setError(aContextError); - break; - } + 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 aValueFace = aFaceRef->value(); - int aFacesNum = -1; // this mean that "aFace" is used - ResultConstructionPtr aConstruction = - std::dynamic_pointer_cast(aContextRes); - if (!aValueFace.get()) { // this may be the whole sketch result selected, check and get faces - if (aConstruction.get()) { - aFacesNum = aConstruction->facesNum(); - } else { - static const std::string aFaceError = "Can not find basis for extrusion"; - setError(aFaceError); - break; - } + std::shared_ptr anAxis; + if(anEdge.get()) { + if(anEdge->isLine()) { + anAxis = std::shared_ptr(new GeomAPI_Ax1(anEdge->line()->location(), + anEdge->line()->direction())); } + } - for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) { - ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); - std::shared_ptr aBaseShape; - if (aFacesNum == -1) { - aBaseShape = aValueFace; - } else { - aBaseShape = std::dynamic_pointer_cast(aConstruction->face(aFaceIndex)); - } + if(!anAxis.get()) { + return false; + } - GeomAlgoAPI_Revolution aFeature(aBaseShape, anAxis, aFromShape, aFromAngle, aToShape, aToAngle); - if(!aFeature.isDone()) { - static const std::string aFeatureError = "Revolution algorithm failed"; - setError(aFeatureError); - break; - } + // Getting angles. + double aToAngle = 0.0; + double aFromAngle = 0.0; + + if (string(CREATION_METHOD())->value() == CREATION_METHOD_BY_ANGLES()) { + aToAngle = real(TO_ANGLE_ID())->value(); + aFromAngle = real(FROM_ANGLE_ID())->value(); + } 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 { + } - // Check if shape is valid - if(aFeature.shape()->isNull()) { - static const std::string aShapeError = "Resulting shape is Null"; - setError(aShapeError); - break; + // Getting bounding planes. + GeomShapePtr aToShape; + GeomShapePtr aFromShape; + + 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(!aFeature.isValid()) { - std::string aFeatureError = "Warning: resulting shape is not valid"; - setError(aFeatureError); - break; + if (aToShape.get() && aToShape->isCompound()) { + GeomAPI_ShapeIterator anIt(aToShape); + aToShape = anIt.current(); } - //LoadNamingDS - LoadNamingDS(aFeature, aResultBody, aBaseShape, aContext); - - setResult(aResultBody, aResultIndex); - aResultIndex++; - - if (aFacesNum == -1) - break; } - } - // remove the rest results if there were produced in the previous pass - removeResults(aResultIndex); -} - -//================================================================================================= -void FeaturesPlugin_Revolution::LoadNamingDS(GeomAlgoAPI_Revolution& theFeature, - std::shared_ptr theResultBody, - std::shared_ptr theBasis, - std::shared_ptr theContext) -{ - //load result - if(theBasis->isEqual(theContext)) - theResultBody->store(theFeature.shape()); - else - theResultBody->storeGenerated(theContext, theFeature.shape()); - - GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape(); - theFeature.mapOfShapes(*aSubShapes); - - std::string aGeneratedName = "LateralFace"; - theResultBody->loadAndOrientGeneratedShapes(theFeature.makeShape(), theBasis, EDGE,_LATERAL_TAG, aGeneratedName, *aSubShapes); - - //Insert from face - std::string aBotName = "FromFace"; - std::shared_ptr aBottomFace = theFeature.firstShape(); - if(!aBottomFace->isNull()) { - if(aSubShapes->isBound(aBottomFace)) { - aBottomFace = aSubShapes->find(aBottomFace); + aSelection = selection(FROM_OBJECT_ID()); + if(aSelection.get()) { + aFromShape = std::dynamic_pointer_cast(aSelection->value()); + if(!aFromShape.get() && aSelection->context().get()) { + aFromShape = aSelection->context()->shape(); + } + if (aFromShape.get() && aFromShape->isCompound()) { + GeomAPI_ShapeIterator anIt(aFromShape); + aFromShape = anIt.current(); + } } - theResultBody->generated(aBottomFace, aBotName, _FROM_TAG); } - //Insert to face - std::string aTopName = "ToFace"; - std::shared_ptr aTopFace = theFeature.lastShape(); - if (!aTopFace->isNull()) { - if (aSubShapes->isBound(aTopFace)) { - aTopFace = aSubShapes->find(aTopFace); + // Generating result for each base shape. + 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 (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRevolAlgo, getKind(), anError)) { + setError(anError); + return false; } - theResultBody->generated(aTopFace, aTopName, _TO_TAG); + + theMakeShapes.push_back(aRevolAlgo); } + return true; }