Salome HOME
Key_Escape processing in File selector widget. Otherwise, crash happens if file dialo...
[modules/shaper.git] / src / ModuleBase / ModuleBase_ISelection.cpp
index 1669c2381cea636b871832c37c1d69505faf146b..b54f6e4eee19902ad0652be1c036c71bb2bbe6ac 100644 (file)
@@ -1,4 +1,22 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+// Copyright (C) 2014-2017  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or
+// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+//
 
 #include "ModuleBase_ISelection.h"
 
@@ -93,14 +111,33 @@ void ModuleBase_ISelection::filterSelectionOnEqualPoints
   QList<ModuleBase_ViewerPrsPtr>::const_iterator anIt = theSelected.begin(),
                                               aLast = theSelected.end();
   QList<ModuleBase_ViewerPrsPtr>::const_iterator aSubIt;
+
+  std::set<std::shared_ptr<GeomAPI_Vertex> > aVerticesMap;
   for (; anIt != aLast; anIt++) {
-    aSubIt = anIt;
-    aSubIt++;
-    for (; aSubIt != aLast; aSubIt++) {
-      if (isEqualVertices(*anIt, *aSubIt)) {
-        aCandidatesToRemove.append(*aSubIt);
-        break;
+    ModuleBase_ViewerPrsPtr aPrs = *anIt;
+    std::shared_ptr<GeomAPI_Vertex> aGeomPrsVertex = getPresentationVertex(aPrs);
+    if (aGeomPrsVertex.get()) {
+      const TopoDS_Vertex& aPrsVertex = aGeomPrsVertex->impl<TopoDS_Vertex>();
+      std::set<std::shared_ptr<GeomAPI_Vertex> >::const_iterator anIt = aVerticesMap.begin(),
+                                                                 aLast = aVerticesMap.end();
+      bool aFound = false;
+      for (; anIt != aLast && !aFound; anIt++) {
+        std::shared_ptr<GeomAPI_Vertex> aGeomVertex = *anIt;
+        const TopoDS_Vertex& aVertex = aGeomVertex->impl<TopoDS_Vertex>();
+        gp_Pnt aPoint1 = BRep_Tool::Pnt(aVertex);
+        gp_Pnt aPoint2 = BRep_Tool::Pnt(aPrsVertex);
+
+        std::shared_ptr<GeomAPI_Pnt> aPnt1 = std::shared_ptr<GeomAPI_Pnt>
+                        (new GeomAPI_Pnt(aPoint1.X(), aPoint1.Y(), aPoint1.Z()));
+        std::shared_ptr<GeomAPI_Pnt> aPnt2 = std::shared_ptr<GeomAPI_Pnt>
+                        (new GeomAPI_Pnt(aPoint2.X(), aPoint2.Y(), aPoint2.Z()));
+        aFound = aPnt1->isEqual(aPnt2);
+      }
+      if (aFound) {
+        aCandidatesToRemove.append(aPrs);
+        continue;
       }
+      aVerticesMap.insert(aGeomPrsVertex);
     }
   }
   QList<ModuleBase_ViewerPrsPtr>::const_iterator aRemIt = aCandidatesToRemove.begin(),
@@ -110,34 +147,23 @@ void ModuleBase_ISelection::filterSelectionOnEqualPoints
   }
 }
 
-bool ModuleBase_ISelection::isEqualVertices(const ModuleBase_ViewerPrsPtr thePrs1,
-                                            const ModuleBase_ViewerPrsPtr thePrs2)
+std::shared_ptr<GeomAPI_Vertex> ModuleBase_ISelection::getPresentationVertex(
+                                                         const ModuleBase_ViewerPrsPtr& thePrs)
 {
-  bool isEqual = false;
-  Handle(StdSelect_BRepOwner) anOwner1 = Handle(StdSelect_BRepOwner)::DownCast(thePrs1->owner());
-  Handle(StdSelect_BRepOwner) anOwner2 = Handle(StdSelect_BRepOwner)::DownCast(thePrs2->owner());
-
-  if (!anOwner1.IsNull() && anOwner1->HasShape() &&
-      !anOwner2.IsNull() && anOwner2->HasShape()) {
-    const TopoDS_Shape& aShape1 = anOwner1->Shape();
-    const TopoDS_Shape& aShape2 = anOwner2->Shape();
-    //TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
-    if (aShape1.ShapeType() == TopAbs_VERTEX &&
-        aShape2.ShapeType() == TopAbs_VERTEX) {
-      const TopoDS_Vertex& aVertex1 = TopoDS::Vertex(aShape1);
-      const TopoDS_Vertex& aVertex2 = TopoDS::Vertex(aShape2);
-      if (!aVertex1.IsNull() && !aVertex2.IsNull())  {
-        gp_Pnt aPoint1 = BRep_Tool::Pnt(aVertex1);
-        gp_Pnt aPoint2 = BRep_Tool::Pnt(aVertex2);
-
-        std::shared_ptr<GeomAPI_Pnt> aPnt1 = std::shared_ptr<GeomAPI_Pnt>
-                        (new GeomAPI_Pnt(aPoint1.X(), aPoint1.Y(), aPoint1.Z()));
-        std::shared_ptr<GeomAPI_Pnt> aPnt2 = std::shared_ptr<GeomAPI_Pnt>
-                        (new GeomAPI_Pnt(aPoint2.X(), aPoint2.Y(), aPoint2.Z()));
-        isEqual = aPnt1->isEqual(aPnt2);
+  std::shared_ptr<GeomAPI_Vertex> aGeomVertex;
+  Handle(StdSelect_BRepOwner) anOwner = Handle(StdSelect_BRepOwner)::DownCast(thePrs->owner());
+
+  if (!anOwner.IsNull() && anOwner->HasShape()) {
+    const TopoDS_Shape& aShape = anOwner->Shape();
+    if (aShape.ShapeType() == TopAbs_VERTEX) {
+      const TopoDS_Vertex& aVertex = TopoDS::Vertex(aShape);
+      if (!aVertex.IsNull())  {
+        gp_Pnt aPoint = BRep_Tool::Pnt(aVertex);
+        aGeomVertex = std::shared_ptr<GeomAPI_Vertex>(new GeomAPI_Vertex(aPoint.X(), aPoint.Y(),
+                                                                         aPoint.Z()));
       }
     }
   }
-
-  return isEqual;
+  return aGeomVertex;
 }
+