Salome HOME
Reverted some changes in salome build/run scripts.
[modules/shaper.git] / src / FeaturesPlugin / FeaturesPlugin_CompositeSketch.cpp
index fa777220521b29f16a7a4d3d9d66f7cc2a1ace52..77766fcb58be2cd4dacf071a65bca81d18ae6104 100644 (file)
@@ -358,7 +358,7 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes
       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()) {
+      for(; aVertExp.more(); aVertExp.next()) {
         ListOfShape aGenerated;
         theMakeShape->generated(aVertExp.current(), aGenerated);
         ListOfShape::iterator aGenIter = aGenerated.begin();
@@ -367,7 +367,7 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes
           if (anEdgesFromVertices.isBound(aGenerated)) // already here
             continue;
           std::ostringstream aStream;
-          aStream<<"Lateral_Edge_"<<anIndex++;
+          aStream<<"Lateral_"<<theTag++;
           theResultBody->generated(aGenerated, aStream.str(), theTag++);
 
           anEdgesFromVertices.bind(aGenerated, aVertExp.current());
@@ -377,21 +377,35 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes
       }
       if (isClosed) {
         GeomAPI_ShapeExplorer anEdgesExp(theMakeShape->shape(), GeomAPI_Shape::EDGE);
-        for(int anIndex = 1; anEdgesExp.more(); anEdgesExp.next()) {
+        for(; anEdgesExp.more(); anEdgesExp.next()) {
           if (!anEdgesFromVertices.isBound(anEdgesExp.current())) {
             // found a base edge
             std::ostringstream aStream;
-            aStream<<"Base_Edge_"<<anIndex++;
+            aStream<<"Base_Edge_"<<theTag++;
             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_"<<theTag++;
+            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()) {
+      for(; anEdgeExp.more(); anEdgeExp.next()) {
         ListOfShape aGenerated;
         theMakeShape->generated(anEdgeExp.current(), aGenerated);
         ListOfShape::iterator aGenIter = aGenerated.begin();
@@ -402,10 +416,15 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes
             int aNumEdges = 0;
             int aNumClosed = 0;
             GeomShapePtr aNotClosedEdge;
+            GeomEdgePtr aDegenerateEdge;
             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))
+              if (anEdge->isDegenerated()) {
+                aDegenerateEdge = anEdge;
+                continue;
+              }
+              if (alreadyIterated.isBound(anEdge))
                 continue;
               alreadyIterated.bind(anEdge, anEdge);
               aNumEdges++;
@@ -417,8 +436,16 @@ void FeaturesPlugin_CompositeSketch::storeGenerationHistory(ResultBodyPtr theRes
             }
             if (aNumEdges == 2 && aNumClosed == 1) {
               std::ostringstream aStream;
-              aStream<<"Base_Edge_"<<anIndex++;
+              aStream<<"Base_Edge_"<<theTag++;
               theResultBody->generated(aNotClosedEdge, aStream.str(), theTag++);
+              if (aDegenerateEdge.get()) { // export vertex of the degenerated edge (apex) #2520
+                GeomAPI_ShapeExplorer anEdgeExp(aDegenerateEdge, GeomAPI_Shape::VERTEX);
+                if (anEdgeExp.more()) {
+                  std::ostringstream aStream;
+                  aStream << "Base_Vertex_" << theTag++;
+                  theResultBody->generated(anEdgeExp.current(), aStream.str(), theTag++);
+                }
+              }
             }
           }
         }
@@ -492,6 +519,11 @@ void FeaturesPlugin_CompositeSketch::storeShapes(ResultBodyPtr theResultBody,
       std::string aName = theName + aShapeTypeStr;
       storeSubShape(theResultBody, aShape, aShapeTypeToExplore,
                     theMapOfSubShapes, aName, aShapeIndex, theTag);
+      if (theBaseShapeType == GeomAPI_Shape::WIRE) { // issue 2289: special names also for vertices
+        aName = theName + "Vertex";
+        storeSubShape(theResultBody, aShape, GeomAPI_Shape::VERTEX,
+                      theMapOfSubShapes, aName, aShapeIndex, theTag);
+      }
     }
   }
 }