X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeSketch.cpp;h=fd16671cfcfe941a3881485a93739b894e30e0a3;hb=919584a7e5ee83c384873c2627b9865e8ba02272;hp=0b5a103ceb74a3e604583f174019fa0a9243e37e;hpb=87b74a6fd4660ebfa71a40f0be84e44535f84798;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index 0b5a103ce..fd16671cf 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp @@ -17,10 +17,22 @@ #include #include #include +#include + +#include #include +#include #include +static void storeSubShape(ResultBodyPtr theResultBody, + const GeomShapePtr theShape, + const GeomAPI_Shape::ShapeType theType, + const std::shared_ptr theMapOfSubShapes, + const std::string theName, + int& theShapeIndex, + int& theTag); + //================================================================================================= void FeaturesPlugin_CompositeSketch::initCompositeSketchAttribtues(const int theInitFlags) { @@ -104,49 +116,6 @@ void FeaturesPlugin_CompositeSketch::removeFeature(std::shared_ptrsetValue(ObjectPtr()); } -//================================================================================================= -void FeaturesPlugin_CompositeSketch::erase() -{ - if(data().get() && data()->isValid()) { // on abort of sketch of this composite it may be invalid - FeaturePtr aSketch = std::dynamic_pointer_cast(reference(SKETCH_ID())->value()); - if(aSketch.get() && aSketch->data()->isValid()) { - document()->removeFeature(aSketch); - } - } - - ModelAPI_CompositeFeature::erase(); -} - -//================================================================================================= -void FeaturesPlugin_CompositeSketch::setSketchObjectToList() -{ - AttributeSelectionListPtr aBaseObjectsSelectionList = selectionList(BASE_OBJECTS_ID()); - if(!aBaseObjectsSelectionList.get() || aBaseObjectsSelectionList->isInitialized()) { - return; - } - - AttributeReferencePtr aSketchLauncherRef = reference(SKETCH_ID()); - if(!aSketchLauncherRef.get() || !aSketchLauncherRef->isInitialized()) { - return; - } - - FeaturePtr aSketchFeature = std::dynamic_pointer_cast(aSketchLauncherRef->value()); - - if(!aSketchFeature.get() || aSketchFeature->results().empty()) { - return; - } - - ResultPtr aSketchRes = aSketchFeature->results().front(); - ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aSketchRes); - if(!aConstruction.get()) { - return; - } - - if(aBaseObjectsSelectionList->size() == 0) { - aBaseObjectsSelectionList->append(aSketchRes, GeomShapePtr()); - } -} - //================================================================================================= void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesList, const bool theIsMakeShells) @@ -154,6 +123,7 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis theBaseShapesList.clear(); ListOfShape aBaseFacesList; + std::map aSketchWiresMap; AttributeSelectionListPtr aBaseObjectsSelectionList = selectionList(BASE_OBJECTS_ID()); if(!aBaseObjectsSelectionList.get()) { setError("Error: Could not get base objects selection list."); @@ -166,19 +136,32 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis for(int anIndex = 0; anIndex < aBaseObjectsSelectionList->size(); anIndex++) { AttributeSelectionPtr aBaseObjectSelection = aBaseObjectsSelectionList->value(anIndex); if(!aBaseObjectSelection.get()) { - setError("Error: One of the selected base objects is empty."); + setError("Error: Selected base object is empty."); return; } GeomShapePtr aBaseShape = aBaseObjectSelection->value(); if(aBaseShape.get() && !aBaseShape->isNull()) { - aBaseShape->shapeType() == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : - theBaseShapesList.push_back(aBaseShape); + GeomAPI_Shape::ShapeType aST = aBaseShape->shapeType(); + if(aST == GeomAPI_Shape::SOLID || aST == GeomAPI_Shape::COMPSOLID) { + setError("Error: Selected shapes has unsupported type."); + return; + } + ResultConstructionPtr aConstruction = + std::dynamic_pointer_cast(aBaseObjectSelection->context()); + if(aConstruction.get() && !aBaseShape->isEqual(aConstruction->shape()) && aST == GeomAPI_Shape::WIRE) { + // It is a wire on the sketch, store it to make face later. + aSketchWiresMap[aConstruction].push_back(aBaseShape); + continue; + } else { + aST == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : + theBaseShapesList.push_back(aBaseShape); + } } else { // This may be the whole sketch result selected, check and get faces. ResultConstructionPtr aConstruction = std::dynamic_pointer_cast(aBaseObjectSelection->context()); if(!aConstruction.get()) { - setError("Error: One of selected sketches does not have results."); + setError("Error: Selected sketches does not have results."); return; } int aFacesNum = aConstruction->facesNum(); @@ -186,14 +169,20 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis // Probably it can be construction. aBaseShape = aConstruction->shape(); if(aBaseShape.get() && !aBaseShape->isNull()) { - aBaseShape->shapeType() == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : - theBaseShapesList.push_back(aBaseShape); + GeomAPI_Shape::ShapeType aST = aBaseShape->shapeType(); + if(aST != GeomAPI_Shape::VERTEX && aST != GeomAPI_Shape::EDGE && aST != GeomAPI_Shape::WIRE && + aST != GeomAPI_Shape::FACE && aST != GeomAPI_Shape::SHELL) { + setError("Error: Selected shapes has unsupported type."); + return; + } + aST == GeomAPI_Shape::FACE ? aBaseFacesList.push_back(aBaseShape) : + theBaseShapesList.push_back(aBaseShape); } } else { for(int aFaceIndex = 0; aFaceIndex < aFacesNum; aFaceIndex++) { GeomShapePtr aBaseFace = aConstruction->face(aFaceIndex); if(!aBaseFace.get() || aBaseFace->isNull()) { - setError("Error: One of the faces on selected sketch is Null."); + setError("Error: One of the faces on selected sketch is null."); return; } aBaseFacesList.push_back(aBaseFace); @@ -202,8 +191,22 @@ void FeaturesPlugin_CompositeSketch::getBaseShapes(ListOfShape& theBaseShapesLis } } + // Make faces from sketch wires. + for(std::map::const_iterator anIt = aSketchWiresMap.cbegin(); + anIt != aSketchWiresMap.cend(); ++anIt) { + const std::shared_ptr aSketchPlanarEdges = + std::dynamic_pointer_cast((*anIt).first->shape()); + const ListOfShape& aWiresList = (*anIt).second; + ListOfShape aFaces; + GeomAlgoAPI_ShapeTools::makeFacesWithHoles(aSketchPlanarEdges->origin(), + aSketchPlanarEdges->norm(), + aWiresList, + aFaces); + aBaseFacesList.insert(aBaseFacesList.end(), aFaces.begin(), aFaces.end()); + } + // Searching faces with common edges. - if(theIsMakeShells) { + if(theIsMakeShells && aBaseFacesList.size() > 1) { ListOfShape aShells; ListOfShape aFreeFaces; GeomShapePtr aFacesCompound = GeomAlgoAPI_CompoundBuilder::compound(aBaseFacesList); @@ -220,7 +223,7 @@ bool FeaturesPlugin_CompositeSketch::isMakeShapeValid(const std::shared_ptrisDone()) { - setError("Error:" + getKind() + "algorithm failed."); + setError("Error: " + getKind() + " algorithm failed."); return false; } @@ -242,10 +245,10 @@ bool FeaturesPlugin_CompositeSketch::isMakeShapeValid(const std::shared_ptr theMakeShape, - const int theResultIndex) + const int theIndex) { // Create result body. - ResultBodyPtr aResultBody = document()->createBody(data(), theResultIndex); + ResultBodyPtr aResultBody = document()->createBody(data(), theIndex); // Store generated shape. aResultBody->storeGenerated(theBaseShape, theMakeShape->shape()); @@ -254,7 +257,7 @@ void FeaturesPlugin_CompositeSketch::storeResult(const GeomShapePtr theBaseShape int aGenTag = 1; storeGenerationHistory(aResultBody, theBaseShape, theMakeShape, aGenTag); - setResult(aResultBody, theResultIndex); + setResult(aResultBody, theIndex); } //================================================================================================= @@ -271,7 +274,6 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes switch(aBaseShapeType) { case GeomAPI_Shape::VERTEX: { aShapeTypeToExplode = GeomAPI_Shape::VERTEX; - aGenName += "Edge"; break; } case GeomAPI_Shape::EDGE: @@ -281,18 +283,31 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes ListOfShape aV1History, aV2History; theMakeShape->generated(aV1, aV1History); theMakeShape->generated(aV2, aV2History); - theResultBody->generated(aV1, aV1History.front(), aGenName + "Edge_1", theTag++); - theResultBody->generated(aV2, aV2History.front(), aGenName + "Edge_2", theTag++); + if(!aV1History.empty()) { + theResultBody->generated(aV1, aV1History.front(), aGenName + "Edge_1", theTag++); + } + if(!aV2History.empty()) { + theResultBody->generated(aV2, aV2History.front(), aGenName + "Edge_2", theTag++); + } } case GeomAPI_Shape::FACE: case GeomAPI_Shape::SHELL: { aShapeTypeToExplode = GeomAPI_Shape::EDGE; - aGenName += "Face"; break; } + case GeomAPI_Shape::COMPOUND: { + aShapeTypeToExplode = GeomAPI_Shape::COMPOUND; + } + } + + if(aShapeTypeToExplode == GeomAPI_Shape::VERTEX || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) { + theResultBody->loadAndOrientGeneratedShapes(theMakeShape.get(), theBaseShape, GeomAPI_Shape::VERTEX, + theTag++, aGenName + "Edge", *aMapOfSubShapes.get()); + } + if(aShapeTypeToExplode == GeomAPI_Shape::EDGE || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) { + theResultBody->loadAndOrientGeneratedShapes(theMakeShape.get(), theBaseShape, GeomAPI_Shape::EDGE, + theTag++, aGenName + "Face", *aMapOfSubShapes.get()); } - theResultBody->loadAndOrientGeneratedShapes(theMakeShape.get(), theBaseShape, aShapeTypeToExplode, - theTag++, aGenName, *aMapOfSubShapes.get()); std::shared_ptr aMakeSweep = std::dynamic_pointer_cast(theMakeShape); if(aMakeSweep.get()) { @@ -332,21 +347,50 @@ void FeaturesPlugin_CompositeSketch::storeShapes(ResultBodyPtr theResultBody, aShapeTypeStr = "Face"; break; } + case GeomAPI_Shape::COMPOUND: { + aShapeTypeToExplore = GeomAPI_Shape::COMPOUND; + break; + } } // Store shapes. int aShapeIndex = 1; - std::string aName = theName + aShapeTypeStr; + int aFaceIndex = 1; for(ListOfShape::const_iterator anIt = theShapes.cbegin(); anIt != theShapes.cend(); ++anIt) { GeomShapePtr aShape = *anIt; - for(GeomAPI_ShapeExplorer anExp(aShape, aShapeTypeToExplore); anExp.more(); anExp.next()) { - GeomShapePtr aSubShape = anExp.current(); - if(theMapOfSubShapes->isBound(aSubShape)) { - aSubShape = theMapOfSubShapes->find(aSubShape); - } - std::ostringstream aStr; - aStr << aName << "_" << aShapeIndex++; - theResultBody->generated(aSubShape, aStr.str(), theTag++); + + if(aShapeTypeToExplore == GeomAPI_Shape::COMPOUND) { + std::string aName = theName + (aShape->shapeType() == GeomAPI_Shape::EDGE ? "Edge" : "Face"); + storeSubShape(theResultBody, + aShape, + aShape->shapeType(), + theMapOfSubShapes, + aName, + aShape->shapeType() == GeomAPI_Shape::EDGE ? aShapeIndex : aFaceIndex, + theTag); + } else { + std::string aName = theName + aShapeTypeStr; + storeSubShape(theResultBody, aShape, aShapeTypeToExplore, + theMapOfSubShapes, aName, aShapeIndex, theTag); } } -} \ No newline at end of file +} + +void storeSubShape(ResultBodyPtr theResultBody, + const GeomShapePtr theShape, + const GeomAPI_Shape::ShapeType theType, + const std::shared_ptr theMapOfSubShapes, + const std::string theName, + int& theShapeIndex, + int& theTag) +{ + for(GeomAPI_ShapeExplorer anExp(theShape, theType); anExp.more(); anExp.next()) { + GeomShapePtr aSubShape = anExp.current(); + if(theMapOfSubShapes->isBound(aSubShape)) { + aSubShape = theMapOfSubShapes->find(aSubShape); + } + std::ostringstream aStr; + aStr << theName << "_" << theShapeIndex++; + theResultBody->generated(aSubShape, aStr.str(), theTag++); + } +}