]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Equal points should not be used in the operation preselection.
authornds <nds@opencascade.com>
Mon, 12 Oct 2015 05:33:04 +0000 (08:33 +0300)
committernds <nds@opencascade.com>
Mon, 12 Oct 2015 05:33:04 +0000 (08:33 +0300)
src/GeomAPI/GeomAPI_Pnt.cpp
src/GeomAPI/GeomAPI_Pnt.h
src/ModuleBase/ModuleBase_ISelection.cpp
src/ModuleBase/ModuleBase_ISelection.h
src/ModuleBase/ModuleBase_OperationFeature.cpp
src/PartSet/PartSet_Validators.cpp

index 0cf67c2ad7ae7c5b506b685c7fc17d66fac336ee..9138365cc1ec6c0fc5bc1ebe7986794d282a3c3b 100644 (file)
@@ -66,6 +66,11 @@ double GeomAPI_Pnt::distance(const std::shared_ptr<GeomAPI_Pnt>& theOther) const
   return MY_PNT->Distance(theOther->impl<gp_Pnt>());
 }
 
+bool GeomAPI_Pnt::isEqual(const std::shared_ptr<GeomAPI_Pnt>& theOther) const
+{
+  return distance(theOther) < Precision::Confusion();
+}
+
 std::shared_ptr<GeomAPI_Pnt2d> GeomAPI_Pnt::to2D(const std::shared_ptr<GeomAPI_Pnt>& theOrigin,
   const std::shared_ptr<GeomAPI_Dir>& theDirX, const std::shared_ptr<GeomAPI_Dir>& theDirY)
 {
index a3016b94315ad794802fee6078735eea8d82de8a..17c2c0db81f000b8f5f4b1f0a4bf6be8aa2dadd7 100644 (file)
@@ -58,6 +58,10 @@ class GeomAPI_Pnt : public GeomAPI_Interface
   GEOMAPI_EXPORT 
   double distance(const std::shared_ptr<GeomAPI_Pnt>& theOther) const;
 
+  /// Returns whether the distance between two points is less then precision confusion
+  GEOMAPI_EXPORT 
+  bool isEqual(const std::shared_ptr<GeomAPI_Pnt>& theOther) const;
+
   /// Projects a point to the plane defined by the origin and 2 axes vectors in this plane
   GEOMAPI_EXPORT 
   std::shared_ptr<GeomAPI_Pnt2d> to2D(const std::shared_ptr<GeomAPI_Pnt>& theOrigin,
index cff9fa134ae48aa270437c0f5992c18fbc3f07b6..9eaf186dc4181b9e8f8a66016250f9fbdf7fef66 100644 (file)
@@ -2,6 +2,12 @@
 
 #include "ModuleBase_ISelection.h"
 
+#include <StdSelect_BRepOwner.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS.hxx>
+#include <BRep_Tool.hxx>
+#include <GeomAPI_Pnt.h>
+
 //********************************************************************
 void ModuleBase_ISelection::appendSelected(const QList<ModuleBase_ViewerPrs> theValues,
                                            QList<ModuleBase_ViewerPrs>& theValuesTo)
@@ -76,3 +82,60 @@ QList<ModuleBase_ViewerPrs> ModuleBase_ISelection::getViewerPrs(const QObjectPtr
   }
   return aSelectedPrs;
 }
+
+//********************************************************************
+void ModuleBase_ISelection::filterPreselectionOnEqualPoints
+                                              (QList<ModuleBase_ViewerPrs>& theSelected)
+{
+  QList<ModuleBase_ViewerPrs> aCandidatesToRemove;
+  QList<ModuleBase_ViewerPrs>::const_iterator anIt = theSelected.begin(),
+                                              aLast = theSelected.end();
+  QList<ModuleBase_ViewerPrs>::const_iterator aSubIt;
+  for (; anIt != aLast; anIt++) {
+    aSubIt = anIt;
+    aSubIt++;
+    for (; aSubIt != aLast; aSubIt++) {
+      if (isEqualVertices(*anIt, *aSubIt)) {
+        aCandidatesToRemove.append(*aSubIt);
+        break;
+      }
+    }
+  }
+  QList<ModuleBase_ViewerPrs>::const_iterator aRemIt = aCandidatesToRemove.begin(),
+                                              aRemLast = aCandidatesToRemove.end();
+  for (; aRemIt != aRemLast; aRemIt++) {
+    theSelected.removeAll(*aRemIt);
+  }
+}
+
+bool ModuleBase_ISelection::isEqualVertices(const ModuleBase_ViewerPrs thePrs1,
+                                            const ModuleBase_ViewerPrs thePrs2)
+{
+  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);
+      }
+    }
+  }
+
+  return isEqual;
+}
index 2c60a76ac05d98038825e48a222649d5ae2948fa..f7289bab76cd4b0306f7cabe14c23fc0110708d5 100644 (file)
@@ -107,6 +107,17 @@ class ModuleBase_ISelection
   //! \return a list of prs, where only object is not empty
   static MODULEBASE_EXPORT QList<ModuleBase_ViewerPrs> getViewerPrs(
                                                        const QObjectPtrList& theObjects);
+
+  /// Removes selection items where owners have equal vertices. The first
+  /// owner with the qual vertex stays in the list.
+  static MODULEBASE_EXPORT void filterPreselectionOnEqualPoints
+                                              (QList<ModuleBase_ViewerPrs>& theSelected);
+private:
+  /// Returns true if the presentations have an owner with a vertex and these vertices are equal.
+  /// \param thePrs1 the first viewer selected presentation
+  /// \param thePrs2 the second viewer selected presentation
+  static bool isEqualVertices(const ModuleBase_ViewerPrs thePrs1,
+                              const ModuleBase_ViewerPrs thePrs2);
 };
 
 #endif
index b3540002f2904995522c7b5644a9eba1de8089a1..7458ae9fd27d996e1a27f2579905555c36f18a2d 100755 (executable)
@@ -299,6 +299,8 @@ void ModuleBase_OperationFeature::activateByPreselection()
   if (myPreSelection.empty())
     return;
 
+  ModuleBase_ISelection::filterPreselectionOnEqualPoints(myPreSelection);
+
   ModuleBase_ModelWidget* aFilledWgt = 0;
   ModuleBase_IPropertyPanel* aPropertyPanel = propertyPanel();
   if (aPropertyPanel) {
index 02683b3554db08b7e313b0fcc5aefe045960ac4d..99468bcf043962bd3b78a489d98eb62eb1579ef1 100755 (executable)
@@ -39,6 +39,8 @@
 int shapesNbPoints(const ModuleBase_ISelection* theSelection)
 {
   QList<ModuleBase_ViewerPrs> aList = theSelection->getSelected(ModuleBase_ISelection::Viewer);
+  ModuleBase_ISelection::filterPreselectionOnEqualPoints(aList);
+
   int aCount = 0;
   foreach (ModuleBase_ViewerPrs aPrs, aList) {
     const TopoDS_Shape& aShape = aPrs.shape();