X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Extrusion.cpp;h=baf8f639769f49b80e20980a6b7761b807be346d;hb=6139d67f405efbc26673d88a9afbae21a41ead5a;hp=d388035926c7cb47f7189600ee823ebf670537e3;hpb=7c56b92e97952849c0e9002633ed6f871783ae5c;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp index d38803592..baf8f6397 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp @@ -1,26 +1,36 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D --> - -// File: FeaturesPlugin_Extrusion.cpp -// Created: 30 May 2014 -// Author: Vitaly SMETANNIKOV +// Copyright (C) 2014-2017 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" -#include -#include -#include -#include #include #include -#include #include -#include +#include +#include -#include #include -#include -#include +#include +#include +#include //================================================================================================= FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion() @@ -30,11 +40,7 @@ FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion() //================================================================================================= void FeaturesPlugin_Extrusion::initAttributes() { - AttributeSelectionListPtr aSelection = - std::dynamic_pointer_cast(data()->addAttribute( - LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); - // extrusion works with faces always - aSelection->setSelectionType("FACE"); + initCompositeSketchAttribtues(InitBaseObjectsList); data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::typeId()); @@ -47,53 +53,61 @@ void FeaturesPlugin_Extrusion::initAttributes() data()->addAttribute(FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); data()->addAttribute(FROM_OFFSET_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(DIRECTION_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), TO_OBJECT_ID()); ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FROM_OBJECT_ID()); + ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), DIRECTION_OBJECT_ID()); - // Composite Sketch attribute - data()->addAttribute(FeaturesPlugin_CompositeSketch::SKETCH_OBJECT_ID(), - ModelAPI_AttributeReference::typeId()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), - FeaturesPlugin_CompositeSketch::SKETCH_OBJECT_ID()); + initCompositeSketchAttribtues(InitSketchLauncher); } //================================================================================================= void FeaturesPlugin_Extrusion::execute() { - /// feature extrusion does not have the next attribute - AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID()); - if (aFacesSelectionList.get() && !aFacesSelectionList->isInitialized()) { - AttributeReferencePtr aSketchAttr = reference(SKETCH_OBJECT_ID()); - if (aSketchAttr.get() && aSketchAttr->isInitialized()) - setSketchObjectToList(); + ListOfShape aBaseShapesList; + ListOfMakeShape aMakeShapesList; + + // Make extrusions. + if(!makeExtrusions(aBaseShapesList, aMakeShapesList)) { + return; } - // Getting faces. - ListOfShape aFacesList; - for(int anIndex = 0; anIndex < aFacesSelectionList->size(); anIndex++) { - AttributeSelectionPtr aFaceSel = aFacesSelectionList->value(anIndex); - std::shared_ptr aFaceShape = aFaceSel->value(); - if(aFaceShape.get() && !aFaceShape->isNull()) { // Getting face. - aFacesList.push_back(aFaceShape); - } else { // This may be the whole sketch result selected, check and get faces. - ResultPtr aContext = aFaceSel->context(); - std::shared_ptr aContextShape = aContext->shape(); - if(!aContextShape.get()) { - static const std::string aContextError = "Error: The selection context is bad."; - setError(aContextError); - return; - } - ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aContext); - if(!aConstruction.get()) { - static const std::string aFaceError = "Error: Can not find basis for extrusion."; - setError(aFaceError); - return; - } - int aFacesNum = aConstruction->facesNum(); - for(int aFaceIndex = 0; aFaceIndex < aFacesNum || aFacesNum == -1; aFaceIndex++) { - aFaceShape = std::dynamic_pointer_cast(aConstruction->face(aFaceIndex)); - aFacesList.push_back(aFaceShape); - } + // 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++); + } + + removeResults(aResultIndex); +} + +//================================================================================================= +bool FeaturesPlugin_Extrusion::makeExtrusions(ListOfShape& theBaseShapes, + ListOfMakeShape& theMakeShapes) +{ + theMakeShapes.clear(); + + // Getting base shapes. + getBaseShapes(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(); } } @@ -101,146 +115,49 @@ void FeaturesPlugin_Extrusion::execute() double aToSize = 0.0; double aFromSize = 0.0; - if(string(CREATION_METHOD())->value() == "BySizes") { + if(string(CREATION_METHOD())->value() == CREATION_METHOD_BY_SIZES()) { aToSize = real(TO_SIZE_ID())->value(); - aFromSize = real(FROM_SIZE_ID())->value(); + aFromSize = real(FROM_SIZE_ID())->value(); } else { aToSize = real(TO_OFFSET_ID())->value(); - aFromSize = real(FROM_OFFSET_ID())->value(); + aFromSize = real(FROM_OFFSET_ID())->value(); } // Getting bounding planes. - std::shared_ptr aToShape; - std::shared_ptr aFromShape; - - if(string(CREATION_METHOD())->value() == "ByPlanesAndOffsets") { - std::shared_ptr anObjRef = selection(TO_OBJECT_ID()); - if(anObjRef.get() != NULL) { - aToShape = std::dynamic_pointer_cast(anObjRef->value()); - if(aToShape.get() == NULL && anObjRef->context().get() != NULL) { - aToShape = anObjRef->context()->shape(); + 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(); } } - anObjRef = selection(FROM_OBJECT_ID()); - if(anObjRef.get() != NULL) { - aFromShape = std::dynamic_pointer_cast(anObjRef->value()); - if(aFromShape.get() == NULL && anObjRef->context().get() != NULL) { - aFromShape = anObjRef->context()->shape(); + 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(); } } } - // Searching faces with common edges. - ListOfShape aShells; - ListOfShape aFreeFaces; - std::shared_ptr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aFacesList); - GeomAlgoAPI_ShapeTools::combineShapes(aFacesCompound, GeomAPI_Shape::SHELL, aShells, aFreeFaces); - aShells.insert(aShells.end(), aFreeFaces.begin(), aFreeFaces.end()); - - // Generating result for each shell and face. - int aResultIndex = 0; - for(ListOfShape::const_iterator anIter = aShells.cbegin(); anIter != aShells.cend(); anIter++) { + // Generating result for each base shape. + for(ListOfShape::const_iterator + anIter = theBaseShapes.cbegin(); anIter != theBaseShapes.cend(); anIter++) { std::shared_ptr aBaseShape = *anIter; - GeomAlgoAPI_Prism aPrismAlgo(aBaseShape, aToShape, aToSize, aFromShape, aFromSize); - if(!aPrismAlgo.isDone()) { - static const std::string aPrismAlgoError = "Error: Extrusion algorithm failed."; - setError(aPrismAlgoError); - aResultIndex = 0; - break; + std::shared_ptr aPrismAlgo(new GeomAlgoAPI_Prism(aBaseShape, aDir, + aToShape, aToSize, + aFromShape, aFromSize)); + if(!isMakeShapeValid(aPrismAlgo)) { + return false; } - // Check if shape is valid - if(!aPrismAlgo.shape().get() || aPrismAlgo.shape()->isNull()) { - static const std::string aShapeError = "Error: Resulting shape is Null."; - setError(aShapeError); - aResultIndex = 0; - break; - } - if(!aPrismAlgo.isValid()) { - std::string aPrismAlgoError = "Error: Resulting shape is not valid."; - setError(aPrismAlgoError); - aResultIndex = 0; - break; - } - - ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); - loadNamingDS(aPrismAlgo, aResultBody, aBaseShape); - setResult(aResultBody, aResultIndex); - aResultIndex++; - } - - removeResults(aResultIndex); -} - -//================================================================================================= -void FeaturesPlugin_Extrusion::removeFeature(std::shared_ptr theFeature) -{ - AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID()); - if (aFacesSelectionList.get() && aFacesSelectionList->size() > 0) - aFacesSelectionList->clear(); -} - -//================================================================================================= -void FeaturesPlugin_Extrusion::loadNamingDS(GeomAlgoAPI_Prism& thePrismAlgo, - std::shared_ptr theResultBody, - std::shared_ptr theBasis) -{ - //load result - theResultBody->storeGenerated(theBasis, thePrismAlgo.shape()); - - std::shared_ptr aSubShapes = thePrismAlgo.mapOfSubShapes(); - - //Insert lateral face : Face from Edge - const std::string aLatName = "LateralFace"; - const int aLatTag = 1; - theResultBody->loadAndOrientGeneratedShapes(&thePrismAlgo, theBasis, GeomAPI_Shape::EDGE, aLatTag, aLatName, *aSubShapes); - - //Insert to faces - int aToFaceIndex = 1; - const std::string aToName = "ToFace"; - int aToTag = 2; - const ListOfShape& aToFaces = thePrismAlgo.toShapes(); - for(ListOfShape::const_iterator anIt = aToFaces.cbegin(); anIt != aToFaces.cend(); anIt++) { - std::shared_ptr aToFace = *anIt; - if(aSubShapes->isBound(aToFace)) { - aToFace = aSubShapes->find(aToFace); - } - std::ostringstream aStr; - aStr << aToName << "_" << aToFaceIndex++; - theResultBody->generated(aToFace, aStr.str(), aToTag++); + theMakeShapes.push_back(aPrismAlgo); } - //Insert from faces - int aFromFaceIndex = 1; - const std::string aFromName = "FromFace"; - int aFromTag = aToTag > 10000 ? aToTag : 10000; - const ListOfShape& aFromFaces = thePrismAlgo.fromShapes(); - for(ListOfShape::const_iterator anIt = aFromFaces.cbegin(); anIt != aFromFaces.cend(); anIt++) { - std::shared_ptr aFromFace = *anIt; - if(aSubShapes->isBound(aFromFace)) { - aFromFace = aSubShapes->find(aFromFace); - } - std::ostringstream aStr; - aStr << aFromName << "_" << aFromFaceIndex++; - theResultBody->generated(aFromFace, aStr.str(), aFromTag++); - } + return true; } - -//================================================================================================= -void FeaturesPlugin_Extrusion::setSketchObjectToList() -{ - std::shared_ptr aSketchFeature = std::dynamic_pointer_cast( - reference(SKETCH_OBJECT_ID())->value()); - - if(aSketchFeature.get() && !aSketchFeature->results().empty()) { - ResultPtr aSketchRes = aSketchFeature->results().front(); - ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aSketchRes); - if(aConstruction.get()) { - AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID()); - if (aFacesSelectionList.get() && aFacesSelectionList->size() == 0) - aFacesSelectionList->append(aSketchRes, std::shared_ptr()); - } - } -} -