X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_Extrusion.cpp;h=225e3cf481e78ac7398aab43b1fa18bcad0c055c;hb=85b662214060cf733b44ac7822e3e4db49e2da4b;hp=1decb449c2ebb77ed1bdd4a67ffa1312a507d4b1;hpb=2fbe8125820a68dc99915086b03843f037ae22b6;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp index 1decb449c..225e3cf48 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_Extrusion.cpp @@ -5,208 +5,143 @@ // Author: Vitaly SMETANNIKOV #include "FeaturesPlugin_Extrusion.h" -#include -#include -#include -#include -#include -#include + #include #include -#include -#include #include -#include -#include -#include -#include -#include +#include +#include + #include -using namespace std; -#define _LATERAL_TAG 1 -#define _FIRST_TAG 2 -#define _LAST_TAG 3 -#define EDGE 6 +#include +#include +#include +//================================================================================================= FeaturesPlugin_Extrusion::FeaturesPlugin_Extrusion() { } +//================================================================================================= void FeaturesPlugin_Extrusion::initAttributes() { - AttributeSelectionListPtr aSelection = - std::dynamic_pointer_cast(data()->addAttribute( - FeaturesPlugin_Extrusion::LIST_ID(), ModelAPI_AttributeSelectionList::typeId())); - // extrusion works with faces always - aSelection->setSelectionType("FACE"); + initCompositeSketchAttribtues(InitBaseObjectsList); + + data()->addAttribute(CREATION_METHOD(), ModelAPI_AttributeString::typeId()); + + data()->addAttribute(TO_SIZE_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(FROM_SIZE_ID(), ModelAPI_AttributeDouble::typeId()); + + data()->addAttribute(TO_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(TO_OFFSET_ID(), ModelAPI_AttributeDouble::typeId()); - data()->addAttribute(FeaturesPlugin_Extrusion::TO_SIZE_ID(), ModelAPI_AttributeDouble::typeId()); - data()->addAttribute(FeaturesPlugin_Extrusion::FROM_SIZE_ID(), ModelAPI_AttributeDouble::typeId()); + data()->addAttribute(FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); + data()->addAttribute(FROM_OFFSET_ID(), ModelAPI_AttributeDouble::typeId()); - //data()->addAttribute(FeaturesPlugin_Extrusion::AXIS_OBJECT_ID(), ModelAPI_AttributeReference::typeId()); + data()->addAttribute(DIRECTION_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(FeaturesPlugin_Extrusion::FROM_OBJECT_ID(), ModelAPI_AttributeSelection::typeId()); - data()->addAttribute(FeaturesPlugin_Extrusion::TO_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()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FeaturesPlugin_Extrusion::FROM_OBJECT_ID()); - ModelAPI_Session::get()->validators()->registerNotObligatory(getKind(), FeaturesPlugin_Extrusion::TO_OBJECT_ID()); + initCompositeSketchAttribtues(InitSketchLauncher); } +//================================================================================================= void FeaturesPlugin_Extrusion::execute() { - AttributeSelectionListPtr aFaceRefs = selectionList(FeaturesPlugin_Extrusion::LIST_ID()); + ListOfShape aBaseShapesList; + ListOfMakeShape aMakeShapesList; - std::shared_ptr aFromShape; - std::shared_ptr aToShape; - - // Getting bounding planes. - std::shared_ptr anObjRef = selection(FeaturesPlugin_Extrusion::FROM_OBJECT_ID()); - if (anObjRef) { - aFromShape = std::dynamic_pointer_cast(anObjRef->value()); + // Make extrusions. + if(!makeExtrusions(aBaseShapesList, aMakeShapesList)) { + return; } - anObjRef = selection(FeaturesPlugin_Extrusion::TO_OBJECT_ID()); - if (anObjRef) { - aToShape = std::dynamic_pointer_cast(anObjRef->value()); + + // 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 sizes. - double aFromSize = real(FeaturesPlugin_Extrusion::FROM_SIZE_ID())->value(); - double aToSize = real(FeaturesPlugin_Extrusion::TO_SIZE_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; - } + removeResults(aResultIndex); +} - 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; - } +//================================================================================================= +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(); } + } - 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 bounding faces was not set creating them. - std::shared_ptr aBaseFace(new GeomAPI_Face(aBaseShape)); - std::shared_ptr aBasePln = aBaseFace->getPlane(); - std::shared_ptr aBaseDir = aBasePln->direction(); - std::shared_ptr aBaseLoc = aBasePln->location(); - std::shared_ptr aBasePlane = GeomAlgoAPI_FaceBuilder::planarFace(aBaseLoc, aBaseDir); - - std::shared_ptr aBoundingFromShape = aFromShape ? aFromShape : aBasePlane; - std::shared_ptr aBoundingToShape = aToShape ? aToShape : aBasePlane; - - // Moving bounding faces according to "from" and "to" sizes. - std::shared_ptr aFromFace(new GeomAPI_Face(aBoundingFromShape)); - std::shared_ptr aFromPln = aFromFace->getPlane(); - std::shared_ptr aFromLoc = aFromPln->location(); - std::shared_ptr aFromDir = aFromPln->direction(); - - std::shared_ptr aToFace(new GeomAPI_Face(aBoundingToShape)); - std::shared_ptr aToPln = aToFace->getPlane(); - std::shared_ptr aToLoc = aToPln->location(); - std::shared_ptr aToDir = aToPln->direction(); - - bool aSign = aFromLoc->xyz()->dot(aBaseDir->xyz()) > aToLoc->xyz()->dot(aBaseDir->xyz()); - - std::shared_ptr aFromPnt(new GeomAPI_Pnt(aFromLoc->xyz()->added(aBaseDir->xyz()->multiplied(aSign ? aFromSize : -aFromSize)))); - aBoundingFromShape = GeomAlgoAPI_FaceBuilder::planarFace(aFromPnt, aFromDir); - - std::shared_ptr aToPnt(new GeomAPI_Pnt(aToLoc->xyz()->added(aBaseDir->xyz()->multiplied(aSign ? -aToSize : aToSize)))); - aBoundingToShape = GeomAlgoAPI_FaceBuilder::planarFace(aToPnt, aToDir); - - //GeomAlgoAPI_Extrusion aFeature(aFace, aFromSize); - GeomAlgoAPI_Prism aFeature(aBaseShape, aBoundingFromShape, aBoundingToShape); - if(!aFeature.isDone()) { - static const std::string aFeatureError = "Extrusion algorithm failed"; - setError(aFeatureError); - break; - } + // Getting sizes. + double aToSize = 0.0; + double aFromSize = 0.0; + + if(string(CREATION_METHOD())->value() == "BySizes") { + aToSize = real(TO_SIZE_ID())->value(); + aFromSize = real(FROM_SIZE_ID())->value(); + } else { + aToSize = real(TO_OFFSET_ID())->value(); + aFromSize = real(FROM_OFFSET_ID())->value(); + } - // 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() == "ByPlanesAndOffsets") { + 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; + } + 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(); } - //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_Extrusion::LoadNamingDS(GeomAlgoAPI_Prism& 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(theBasis, theFeature.shape()); - - GeomAPI_DataMapOfShapeShape* aSubShapes = new GeomAPI_DataMapOfShapeShape(); - theFeature.mapOfShapes(*aSubShapes); - - //Insert lateral face : Face from Edge - std::string aLatName = "LateralFace"; - theResultBody->loadAndOrientGeneratedShapes(theFeature.makeShape(), theBasis, EDGE,_LATERAL_TAG, aLatName, *aSubShapes); - - //Insert bottom face - std::string aBotName = "BottomFace"; - std::shared_ptr aBottomFace = theFeature.firstShape(); - if(!aBottomFace->isNull()) { - if(aSubShapes->isBound(aBottomFace)) { - aBottomFace = aSubShapes->find(aBottomFace); - } - theResultBody->generated(aBottomFace, aBotName, _FIRST_TAG); - } + // Generating result for each base shape. + for(ListOfShape::const_iterator anIter = theBaseShapes.cbegin(); anIter != theBaseShapes.cend(); anIter++) { + std::shared_ptr aBaseShape = *anIter; - //Insert top face - std::string aTopName = "TopFace"; - std::shared_ptr aTopFace = theFeature.lastShape(); - if (!aTopFace->isNull()) { - if (aSubShapes->isBound(aTopFace)) { - aTopFace = aSubShapes->find(aTopFace); + std::shared_ptr aPrismAlgo(new GeomAlgoAPI_Prism(aBaseShape, aDir, + aToShape, aToSize, + aFromShape, aFromSize)); + if(!isMakeShapeValid(aPrismAlgo)) { + return false; } - theResultBody->generated(aTopFace, aTopName, _LAST_TAG); + + theMakeShapes.push_back(aPrismAlgo); } + + return true; }