X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FFeaturesPlugin%2FFeaturesPlugin_CompositeSketch.cpp;h=4ddac51f8e867af90f5eae03150fd691db6eeede;hb=84ff9a5e90ebf75292b9ef97a05a4609e67c4022;hp=adde95a0b22668d6cf0d1cf82976265096529ca3;hpb=8e97f0514a5e19febf05a98077f84f63756f169f;p=modules%2Fshaper.git diff --git a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp index adde95a0b..4ddac51f8 100644 --- a/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp +++ b/src/FeaturesPlugin/FeaturesPlugin_CompositeSketch.cpp @@ -42,10 +42,7 @@ 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); + const std::string& theName); //================================================================================================= void FeaturesPlugin_CompositeSketch::initCompositeSketchAttribtues(const int theInitFlags) @@ -274,8 +271,7 @@ void FeaturesPlugin_CompositeSketch::storeResult(const GeomShapePtr theBaseShape aResultBody->storeGenerated(theBaseShape, theMakeShape->shape()); // Store generated edges/faces. - int aGenTag = 1; - storeGenerationHistory(aResultBody, theBaseShape, theMakeShape, aGenTag); + storeGenerationHistory(aResultBody, theBaseShape, theMakeShape); setResult(aResultBody, theIndex); } @@ -283,31 +279,17 @@ void FeaturesPlugin_CompositeSketch::storeResult(const GeomShapePtr theBaseShape //================================================================================================= void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theResultBody, const GeomShapePtr theBaseShape, - const std::shared_ptr theMakeShape, - int& theTag) + const std::shared_ptr theMakeShape) { GeomAPI_Shape::ShapeType aBaseShapeType = theBaseShape->shapeType(); GeomAPI_Shape::ShapeType aShapeTypeToExplode = GeomAPI_Shape::SHAPE; - std::string aGenName = "Generated_"; - std::shared_ptr aMapOfSubShapes = theMakeShape->mapOfSubShapes(); switch(aBaseShapeType) { case GeomAPI_Shape::EDGE: { aShapeTypeToExplode = GeomAPI_Shape::VERTEX; break; } case GeomAPI_Shape::WIRE: { - //std::shared_ptr aV1, aV2; - //GeomAlgoAPI_ShapeTools::findBounds(theBaseShape, aV1, aV2); - //ListOfShape aV1History, aV2History; - //theMakeShape->generated(aV1, aV1History); - //theMakeShape->generated(aV2, aV2History); - //if(!aV1History.empty()) { - // theResultBody->generated(aV1, aV1History.front(), aGenName + "Edge_1", theTag++); - //} - //if(!aV2History.empty()) { - // theResultBody->generated(aV2, aV2History.front(), aGenName + "Edge_2", theTag++); - //} aShapeTypeToExplode = GeomAPI_Shape::COMPOUND; break; } @@ -321,145 +303,36 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes } } + int aLateralIndex = 1; + int aBaseEdgeIndex = 1; + int aVertexIndex = 1; + int aBaseVertexIndex = 1; + if(aShapeTypeToExplode == GeomAPI_Shape::VERTEX || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) { - theResultBody->loadAndOrientGeneratedShapes(theMakeShape.get(), theBaseShape, - GeomAPI_Shape::VERTEX, - theTag++, aGenName + "Edge", - *aMapOfSubShapes.get()); + theResultBody->loadGeneratedShapes(theMakeShape, theBaseShape, GeomAPI_Shape::VERTEX); } if(aShapeTypeToExplode == GeomAPI_Shape::EDGE || aShapeTypeToExplode == GeomAPI_Shape::COMPOUND) { - theResultBody->loadAndOrientGeneratedShapes(theMakeShape.get(), - theBaseShape, GeomAPI_Shape::EDGE, - theTag++, aGenName + "Face", - *aMapOfSubShapes.get()); - } - // issue #2197: make naming of edges generated from vertices - if (aShapeTypeToExplode == GeomAPI_Shape::EDGE) { - GeomAPI_DataMapOfShapeShape aFacesFromFromEdges; - GeomAPI_ShapeExplorer anEdgeExp(theBaseShape, GeomAPI_Shape::EDGE); - for(; anEdgeExp.more(); anEdgeExp.next()) { - ListOfShape aGenerated; - theMakeShape->generated(anEdgeExp.current(), aGenerated); - ListOfShape::iterator aGenIter = aGenerated.begin(); - for(; aGenIter != aGenerated.end(); aGenIter++) { - GeomShapePtr aGen = *aGenIter; - if (aGen.get() && !aGen->isNull()) { - if ((*aGenIter)->shapeType() == GeomAPI_Shape::FACE) { // normal case - aFacesFromFromEdges.bind(aGen, anEdgeExp.current()); - } - } - } - } - - // closed revolution of 1-3 faces can not distinguish lateral and base edges - if (aFacesFromFromEdges.size() <= 3) { - bool isClosed = false; // lateral edges are closed (in full revolution) - GeomAPI_DataMapOfShapeShape anEdgesFromVertices; - GeomAPI_ShapeExplorer aVertExp(theBaseShape, GeomAPI_Shape::VERTEX); - for(int anIndex = 1; aVertExp.more(); aVertExp.next()) { - ListOfShape aGenerated; - theMakeShape->generated(aVertExp.current(), aGenerated); - ListOfShape::iterator aGenIter = aGenerated.begin(); - for(; aGenIter != aGenerated.end(); aGenIter++) { - std::shared_ptr aGenerated = *aGenIter; - if (anEdgesFromVertices.isBound(aGenerated)) // already here - continue; - std::ostringstream aStream; - aStream<<"Lateral_Edge_"<generated(aGenerated, aStream.str(), theTag++); - - anEdgesFromVertices.bind(aGenerated, aVertExp.current()); - std::shared_ptr anEdge(new GeomAPI_Edge(aGenerated)); - isClosed = isClosed || anEdge->isClosed(); - } - } - if (isClosed) { - GeomAPI_ShapeExplorer anEdgesExp(theMakeShape->shape(), GeomAPI_Shape::EDGE); - for(int anIndex = 1; anEdgesExp.more(); anEdgesExp.next()) { - if (!anEdgesFromVertices.isBound(anEdgesExp.current())) { - // found a base edge - std::ostringstream aStream; - aStream<<"Base_Edge_"<generated(anEdgesExp.current(), aStream.str(), theTag++); - // only one orientation is needed - anEdgesFromVertices.bind(anEdgesExp.current(), anEdgesExp.current()); - } - } - } else if (aFacesFromFromEdges.size() == 1) { // 2233: sphere created by the revolution: - // vertices at degenerated edges will have the same name - GeomAPI_DataMapOfShapeShape aVertices; - GeomAPI_ShapeExplorer aVertExp(theMakeShape->shape(), GeomAPI_Shape::VERTEX); - for(int anIndex = 1; aVertExp.more(); aVertExp.next()) { - if (!aVertices.isBound(aVertExp.current())) { - // found a base edge - std::ostringstream aStream; - aStream<<"Vertex_"<generated(aVertExp.current(), aStream.str(), theTag++); - // only one orientation is needed - aVertices.bind(aVertExp.current(), aVertExp.current()); - } - } - } - } else { // issue #2197, test case 4 : edges that produce fully-revolved face, - // but contain only 2 edges (on apex of revolution) - GeomAPI_ShapeExplorer anEdgeExp(theBaseShape, GeomAPI_Shape::EDGE); - for(int anIndex = 1; anEdgeExp.more(); anEdgeExp.next()) { - ListOfShape aGenerated; - theMakeShape->generated(anEdgeExp.current(), aGenerated); - ListOfShape::iterator aGenIter = aGenerated.begin(); - for(; aGenIter != aGenerated.end(); aGenIter++) { - GeomShapePtr aGen = (*aGenIter); - if (aGen.get() && !aGen->isNull()) { - GeomAPI_ShapeExplorer aFaceEdgeExp(aGen, GeomAPI_Shape::EDGE); - int aNumEdges = 0; - int aNumClosed = 0; - GeomShapePtr aNotClosedEdge; - GeomAPI_DataMapOfShapeShape alreadyIterated; - for(; aFaceEdgeExp.more(); aFaceEdgeExp.next()) { - std::shared_ptr anEdge(new GeomAPI_Edge(aFaceEdgeExp.current())); - if (anEdge->isDegenerated() || alreadyIterated.isBound(anEdge)) - continue; - alreadyIterated.bind(anEdge, anEdge); - aNumEdges++; - if (anEdge->isClosed()) { - aNumClosed++; - } else { - aNotClosedEdge = anEdge; - } - } - if (aNumEdges == 2 && aNumClosed == 1) { - std::ostringstream aStream; - aStream<<"Base_Edge_"<generated(aNotClosedEdge, aStream.str(), theTag++); - } - } - } - } - } + theResultBody->loadGeneratedShapes(theMakeShape, theBaseShape, GeomAPI_Shape::EDGE); } std::shared_ptr aMakeSweep = std::dynamic_pointer_cast(theMakeShape); if(aMakeSweep.get()) { // Store from shapes. - storeShapes(theResultBody, aBaseShapeType, aMapOfSubShapes, - aMakeSweep->fromShapes(), "From_", theTag); + storeShapes(theResultBody, aBaseShapeType, aMakeSweep->fromShapes(), "From_"); // Store to shapes. - storeShapes(theResultBody, aBaseShapeType, aMapOfSubShapes, - aMakeSweep->toShapes(), "To_", theTag); + storeShapes(theResultBody, aBaseShapeType, aMakeSweep->toShapes(), "To_"); } } //================================================================================================= void FeaturesPlugin_CompositeSketch::storeShapes(ResultBodyPtr theResultBody, const GeomAPI_Shape::ShapeType theBaseShapeType, - const std::shared_ptr theMapOfSubShapes, const ListOfShape& theShapes, - const std::string theName, - int& theTag) + const std::string theName) { GeomAPI_Shape::ShapeType aShapeTypeToExplore = GeomAPI_Shape::FACE; std::string aShapeTypeStr = "Face"; @@ -488,24 +361,19 @@ void FeaturesPlugin_CompositeSketch::storeShapes(ResultBodyPtr theResultBody, } // Store shapes. - int aShapeIndex = 1; - int aFaceIndex = 1; for(ListOfShape::const_iterator anIt = theShapes.cbegin(); anIt != theShapes.cend(); ++anIt) { GeomShapePtr aShape = *anIt; 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); + storeSubShape(theResultBody, aShape, aShape->shapeType(), aName); } else { std::string aName = theName + aShapeTypeStr; - storeSubShape(theResultBody, aShape, aShapeTypeToExplore, - theMapOfSubShapes, aName, aShapeIndex, theTag); + storeSubShape(theResultBody, aShape, aShapeTypeToExplore, aName); + if (theBaseShapeType == GeomAPI_Shape::WIRE) { // issue 2289: special names also for vertices + aName = theName + "Vertex"; + storeSubShape(theResultBody, aShape, GeomAPI_Shape::VERTEX, aName); + } } } } @@ -513,18 +381,10 @@ void FeaturesPlugin_CompositeSketch::storeShapes(ResultBodyPtr theResultBody, 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) + const std::string& theName) { 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++); + theResultBody->generated(aSubShape, theName); } }