- 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<GeomAPI_Shape> aGenerated = *aGenIter;
- if (anEdgesFromVertices.isBound(aGenerated)) // already here
- continue;
- std::ostringstream aStream;
- aStream<<"Lateral_Edge_"<<anIndex++;
- theResultBody->generated(aGenerated, aStream.str(), theTag++);
-
- anEdgesFromVertices.bind(aGenerated, aVertExp.current());
- std::shared_ptr<GeomAPI_Edge> 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_"<<anIndex++;
- theResultBody->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_"<<anIndex++;
- theResultBody->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<GeomAPI_Edge> 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_"<<anIndex++;
- theResultBody->generated(aNotClosedEdge, aStream.str(), theTag++);
- }
- }
- }
- }
- }