Salome HOME
Issue #1740 The visualization of selected point in the graphic scene is not visible
[modules/shaper.git] / src / BuildPlugin / BuildPlugin_Face.cpp
index fddd223f053a505c2d48cb5b063e7b2a70dbb38f..774cfdf39787a3745719e15fd8cca67d90e8f009 100644 (file)
@@ -10,6 +10,7 @@
 #include <ModelAPI_ResultBody.h>
 
 #include <GeomAPI_Edge.h>
+#include <GeomAPI_PlanarEdges.h>
 #include <GeomAPI_Pln.h>
 #include <GeomAPI_ShapeExplorer.h>
 
@@ -43,24 +44,43 @@ void BuildPlugin_Face::execute()
 
   // Collect base shapes.
   ListOfShape anEdges;
+  std::list< std::shared_ptr<GeomAPI_Dir> > aListOfNormals;
   for(int anIndex = 0; anIndex < aSelectionList->size(); ++anIndex) {
     AttributeSelectionPtr aSelection = aSelectionList->value(anIndex);
     GeomShapePtr aShape = aSelection->value();
+    GeomShapePtr aContext = aSelection->context()->shape();
     if(!aShape.get()) {
-      aShape = aSelection->context()->shape();
+      aShape = aContext;
     }
     for(GeomAPI_ShapeExplorer anExp(aShape, GeomAPI_Shape::EDGE); anExp.more(); anExp.next()) {
       GeomShapePtr anEdge = anExp.current();
       anEdges.push_back(anEdge);
     }
+
+    // check whether the context is a sketch, in this case store its normal for further needs
+    std::shared_ptr<GeomAPI_PlanarEdges> aSketch =
+        std::dynamic_pointer_cast<GeomAPI_PlanarEdges>(aContext);
+    if (aSketch)
+      aListOfNormals.push_back(aSketch->norm());
   }
 
   // Get plane.
   std::shared_ptr<GeomAPI_Pln> aPln = GeomAlgoAPI_ShapeTools::findPlane(anEdges);
+  std::shared_ptr<GeomAPI_Dir> aNormal = aPln->direction();
+  bool isReverse = !aListOfNormals.empty();
+  std::list< std::shared_ptr<GeomAPI_Dir> >::const_iterator aNormIt = aListOfNormals.begin();
+  for (; aNormIt != aListOfNormals.end() && isReverse; ++aNormIt)
+    if ((*aNormIt)->dot(aNormal) > 1.e-7)
+      isReverse = false;
+  if (isReverse) {
+    aNormal->reverse();
+    aPln = std::shared_ptr<GeomAPI_Pln>(new GeomAPI_Pln(aPln->location(), aNormal));
+  }
 
   // Get faces.
   ListOfShape aFaces;
-  GeomAlgoAPI_SketchBuilder::createFaces(aPln->location(), aPln->xDirection(), aPln->direction(), anEdges, aFaces);
+  GeomAlgoAPI_SketchBuilder::createFaces(aPln->location(), aPln->xDirection(),
+                                         aPln->direction(), anEdges, aFaces);
 
   // Get wires from faces.
   ListOfShape aWires;
@@ -85,12 +105,16 @@ void BuildPlugin_Face::execute()
     GeomShapePtr aShape = *anIt;
     aResultBody->store(aShape);
 
+    int anEdgeIndex = 1;
+
     for(GeomAPI_ShapeExplorer anExp(aShape, GeomAPI_Shape::EDGE); anExp.more(); anExp.next()) {
       GeomShapePtr anEdgeInResult = anExp.current();
       for(ListOfShape::const_iterator anIt = anEdges.cbegin(); anIt != anEdges.cend(); ++anIt) {
         std::shared_ptr<GeomAPI_Edge> anEdgeInList(new GeomAPI_Edge(*anIt));
         if(anEdgeInList->isEqual(anEdgeInResult)) {
-          aResultBody->modified(anEdgeInList, anEdgeInResult, "Edge");
+          aResultBody->modified(anEdgeInList, anEdgeInResult,
+                                "Edge_" + std::to_string((long long)anEdgeIndex), anEdgeIndex);
+          ++anEdgeIndex;
           break;
         }
       }