X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Revolution.cpp;h=5a7a34b399d8791c1c086a2412a905f4c12f12c5;hb=676ee79de539b14b242a561857c1505cce13d951;hp=8f34e2f5657ea0ca48b7cab1bfb85430c98a1ed7;hpb=7ae8f08629e5f99575f3cec07a8b701dd9209591;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp b/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp index 8f34e2f56..5a7a34b39 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Revolution.cpp @@ -4,28 +4,23 @@ // Created: 12 May 2015 // Author: Dmitry Bobylev -#include - -#include -#include -#include -#include -#include -#include -#include +#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() @@ -37,158 +32,191 @@ void FeaturesPlugin_Revolution::initAttributes() { AttributeSelectionListPtr aSelection = std::dynamic_pointer_cast(data()->addAttribute( - FeaturesPlugin_Revolution::LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); + LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); // revolution works with faces always aSelection->setSelectionType("FACE"); - data()->addAttribute(FeaturesPlugin_Revolution::AXIS_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(AXIS_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + + data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::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()); } //================================================================================================= void FeaturesPlugin_Revolution::execute() { - AttributeSelectionListPtr aFaceRefs = selectionList(FeaturesPlugin_Revolution::LIST_ID()); + // Getting faces. + ListOfShape aFacesList; + AttributeSelectionListPtr aFacesSelectionList = selectionList(LIST_ID()); + 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 revolution."; + 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); + } + } + } //Getting axis. std::shared_ptr anAxis; std::shared_ptr anEdge; - std::shared_ptr anObjRef = selection(FeaturesPlugin_Revolution::AXIS_OBJECT_ID()); + std::shared_ptr anObjRef = selection(AXIS_OBJECT_ID()); if(anObjRef && anObjRef->value() && anObjRef->value()->isEdge()) { anEdge = std::shared_ptr(new GeomAPI_Edge(anObjRef->value())); + } else if(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 bounding planes. - std::shared_ptr aFromShape(new GeomAPI_Shape()); - std::shared_ptr aToShape(new GeomAPI_Shape()); - - anObjRef = selection(FeaturesPlugin_Revolution::FROM_OBJECT_ID()); - if(anObjRef) { - aFromShape = std::dynamic_pointer_cast(anObjRef->value()); - } - anObjRef = selection(FeaturesPlugin_Revolution::TO_OBJECT_ID()); - if(anObjRef) { - aToShape = std::dynamic_pointer_cast(anObjRef->value()); - } - // 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; - } + double aToAngle = real(TO_ANGLE_ID())->value(); + double aFromAngle = real(FROM_ANGLE_ID())->value(); + + if(string(CREATION_METHOD())->value() == "ByAngles") { + aToAngle = real(TO_ANGLE_ID())->value(); + aFromAngle = real(FROM_ANGLE_ID())->value(); + } else { + aToAngle = real(TO_OFFSET_ID())->value(); + aFromAngle = real(FROM_OFFSET_ID())->value(); + } - 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; + // Getting bounding planes. + std::shared_ptr aToShape; + std::shared_ptr aFromShape; + + if(string(CREATION_METHOD())->value() == "ByPlanesAndOffsets") { + 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(); } } - - 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)); - } - - GeomAlgoAPI_Revolution aFeature(aBaseShape, anAxis, aFromShape, aFromAngle, aToShape, aToAngle); - if(!aFeature.isDone()) { - static const std::string aFeatureError = "Revolution algorithm failed"; - setError(aFeatureError); - break; - } - - // Check if shape is valid - if(aFeature.shape()->isNull()) { - static const std::string aShapeError = "Resulting shape is Null"; - setError(aShapeError); - break; - } - if(!aFeature.isValid()) { - std::string aFeatureError = "Warning: resulting shape is not valid"; - setError(aFeatureError); - break; + 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(); } - //LoadNamingDS - LoadNamingDS(aFeature, aResultBody, aBaseShape, aContext); + } + } - setResult(aResultBody, aResultIndex); - aResultIndex++; + // 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++) { + std::shared_ptr aBaseShape = *anIter; + + GeomAlgoAPI_Revolution aRevolAlgo(aBaseShape, anAxis, aToShape, aToAngle, aFromShape, aFromAngle); + if(!aRevolAlgo.isDone()) { + static const std::string aPrismAlgoError = "Error: Revolution algorithm failed."; + setError(aPrismAlgoError); + aResultIndex = 0; + break; + } - if (aFacesNum == -1) - break; + // Check if shape is valid + if(!aRevolAlgo.shape().get() || aRevolAlgo.shape()->isNull()) { + static const std::string aShapeError = "Error: Resulting shape is Null."; + setError(aShapeError); + aResultIndex = 0; + break; } + if(!aRevolAlgo.isValid()) { + std::string aPrismAlgoError = "Error: Resulting shape is not valid."; + setError(aPrismAlgoError); + aResultIndex = 0; + break; + } + + ResultBodyPtr aResultBody = document()->createBody(data(), aResultIndex); + loadNamingDS(aRevolAlgo, aResultBody, aBaseShape); + setResult(aResultBody, aResultIndex); + aResultIndex++; } - // remove the rest results if there were produced in the previous pass + removeResults(aResultIndex); } //================================================================================================= -void FeaturesPlugin_Revolution::LoadNamingDS(GeomAlgoAPI_Revolution& theFeature, +void FeaturesPlugin_Revolution::loadNamingDS(GeomAlgoAPI_Revolution& theRevolAlgo, std::shared_ptr theResultBody, - std::shared_ptr theBasis, - std::shared_ptr theContext) + std::shared_ptr theBasis) { //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); + theResultBody->storeGenerated(theBasis, theRevolAlgo.shape()); + + std::shared_ptr aSubShapes = theRevolAlgo.mapOfSubShapes(); + + //Insert lateral face : Face from Edge + const std::string aLatName = "LateralFace"; + const int aLatTag = 1; + theResultBody->loadAndOrientGeneratedShapes(&theRevolAlgo, theBasis, GeomAPI_Shape::EDGE, aLatTag, aLatName, *aSubShapes); + + //Insert to faces + int aToFaceIndex = 1; + const std::string aToName = "ToFace"; + int aToTag = 2; + const ListOfShape& aToFaces = theRevolAlgo.toFaces(); + for(ListOfShape::const_iterator anIt = aToFaces.cbegin(); anIt != aToFaces.cend(); anIt++) { + std::shared_ptr aToFace = *anIt; + if(aSubShapes->isBound(aToFace)) { + aToFace = aSubShapes->find(aToFace); } - theResultBody->generated(aBottomFace, aBotName, _FROM_TAG); + std::ostringstream aStr; + aStr << aToName << "_" << aToFaceIndex++; + theResultBody->generated(aToFace, aStr.str(), aToTag++); } - //Insert to face - std::string aTopName = "ToFace"; - std::shared_ptr aTopFace = theFeature.lastShape(); - if (!aTopFace->isNull()) { - if (aSubShapes->isBound(aTopFace)) { - aTopFace = aSubShapes->find(aTopFace); + //Insert from faces + int aFromFaceIndex = 1; + const std::string aFromName = "FromFace"; + int aFromTag = aToTag > 10000 ? aToTag : 10000; + const ListOfShape& aFromFaces = theRevolAlgo.fromFaces(); + for(ListOfShape::const_iterator anIt = aFromFaces.cbegin(); anIt != aFromFaces.cend(); anIt++) { + std::shared_ptr aFromFace = *anIt; + if(aSubShapes->isBound(aFromFace)) { + aFromFace = aSubShapes->find(aFromFace); } - theResultBody->generated(aTopFace, aTopName, _TO_TAG); + std::ostringstream aStr; + aStr << aFromName << "_" << aFromFaceIndex++; + theResultBody->generated(aFromFace, aStr.str(), aFromTag++); } - }