]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
GUITHARE issue 0001070: External 20578: Probe C3 (on overlapped presentations)
authorouv <ouv@opencascade.com>
Tue, 24 Apr 2012 10:52:33 +0000 (10:52 +0000)
committerouv <ouv@opencascade.com>
Tue, 24 Apr 2012 10:52:33 +0000 (10:52 +0000)
src/SVTK/SALOME_Actor.cxx
src/SVTK/SALOME_Actor.h
src/SVTK/SVTK_Renderer.cxx
src/SVTK/SVTK_Renderer.h

index 589dee0aa78ed189f61eb5423e113cb86d075a86..9583cc3f26ac542eeadcff1dd4b8fe0a4679064f 100644 (file)
@@ -163,6 +163,7 @@ SALOME_Actor
 ::SALOME_Actor():
   myRenderer(NULL),
   myInteractor(NULL),
+  myPrehighlightedCellId(-1),
   mySelectionMode(ActorSelection),
   myPreHighlightActor(SVTK_Actor::New()),
   myHighlightActor(SVTK_Actor::New()),
@@ -448,6 +449,7 @@ SALOME_Actor
               SVTK_SelectionEvent* theSelectionEvent,
               bool theIsHighlight)
 {
+  myPrehighlightedCellId = -1;
   if ( !GetPickable() )
     return false;
       
@@ -517,6 +519,7 @@ SALOME_Actor
        if ( anObjId >= 0 ) {
          myIsPreselected = CheckDimensionId(aSelectionMode,this,anObjId);
          if(myIsPreselected){
+           myPrehighlightedCellId = anObjId;
            const TColStd_IndexedMapOfInteger& aMapIndex = myPreHighlightActor->GetMapIndex();
            int anExtent = aMapIndex.Extent();
            anIsChanged |= (anExtent == 0 || anExtent > 0 && anObjId != aMapIndex(1));
@@ -594,6 +597,16 @@ SALOME_Actor
   return anIsChanged;
 }
 
+/*!
+  Returns id of the prehighlighted cell (-1 if no cell is highlighted)
+*/
+int
+SALOME_Actor
+::GetPrehighlightedCellId() const
+{
+  return myPrehighlightedCellId;
+}
+
 /*!
   To process highlight (called from SVTK_InteractorStyle)
 */
index e51d4eb4383edec3d8e9ac12ab95936c308d00ae..8c635f5f4d78a5ebcd95232a14e56717e695be8a 100644 (file)
@@ -171,6 +171,11 @@ class SVTK_EXPORT SALOME_Actor : public VTKViewer_Actor
               SVTK_SelectionEvent* theSelectionEvent,
               bool theIsHighlight);
 
+  //! Returns id of the prehighlighted cell (-1 if no cell is highlighted)
+  virtual
+  int
+  GetPrehighlightedCellId() const;
+
   //! To process highlight (called from #SVTK_InteractorStyle)
   virtual 
   bool
@@ -214,6 +219,8 @@ class SVTK_EXPORT SALOME_Actor : public VTKViewer_Actor
 
   Handle(SALOME_InteractiveObject) myIO;
 
+  int myPrehighlightedCellId;
+
   SALOME_Actor();
   ~SALOME_Actor();
 
index cab5ca695e67649dce67d9cff6276d5d3f4bd29f..c2fd4ea62cede20ed9e1e0827bc2981787a512f7 100644 (file)
 #include "VTKViewer_Transform.h"
 #include "VTKViewer_Utilities.h"
 
-#include <vtkCamera.h>
-#include <vtkRenderer.h>
-#include <vtkTextProperty.h>
-#include <vtkObjectFactory.h>
+#include <vtkAbstractVolumeMapper.h>
 #include <vtkCallbackCommand.h>
-
+#include <vtkCamera.h>
+#include <vtkDataSet.h>
+#include <vtkGenericCell.h>
+#include <vtkMapper.h>
 #include <vtkPicker.h>
 #include <vtkPointPicker.h>
-#include <vtkCellPicker.h>
-
 #include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkTextProperty.h>
+#include <vtkObjectFactory.h>
 
 // undefining min and max because CASCADE's defines them and
 // it clashes with std::min(), std::max() included in utilities.h
 #undef min
 #undef max
 
-
 vtkStandardNewMacro(SVTK_Renderer);
+vtkStandardNewMacro(SVTK_CellPicker);
 
 /*!
   Constructor
@@ -67,7 +68,7 @@ SVTK_Renderer
   myPriority(0.0),
   myEventCallbackCommand(vtkCallbackCommand::New()),
   myPointPicker(vtkPointPicker::New()),
-  myCellPicker(vtkCellPicker::New()),
+  myCellPicker(SVTK_CellPicker::New()),
   myPointRectPicker(SVTK_RectPicker::New()),
   myCellRectPicker(SVTK_RectPicker::New()),
   myPreHighlightProperty(vtkProperty::New()),
@@ -751,3 +752,108 @@ SVTK_Renderer
   aCamera->SetFocalPoint(0,0,0);
   this->OnFitAll();
 }
+
+/*!
+  SVTK_CellPicker constructor
+*/
+SVTK_CellPicker::SVTK_CellPicker()
+{
+  this->Cell = vtkGenericCell::New();
+}
+
+/*!
+  SVTK_CellPicker destructor
+*/
+SVTK_CellPicker::~SVTK_CellPicker()
+{
+  this->Cell->Delete();
+}
+
+/*!
+  Redefined virtual method of the vtkCellPicker class
+*/
+double SVTK_CellPicker::IntersectWithLine(double p1[3], double p2[3], double tol, 
+                                          vtkAssemblyPath *path, 
+                                          vtkProp3D *prop3D, 
+                                          vtkAbstractMapper3D *m)
+{
+  vtkIdType numCells, cellId, minCellId;
+  int i, minSubId, subId;
+  double x[3], tMin, t, pcoords[3], minXYZ[3], minPcoords[3];
+  vtkDataSet *input;
+  vtkMapper *mapper;
+  vtkAbstractVolumeMapper *volumeMapper;
+
+  // Get the underlying dataset
+  if ( (mapper=vtkMapper::SafeDownCast(m)) != NULL )
+    {
+    input = mapper->GetInput();
+    }
+  else if ( (volumeMapper=vtkAbstractVolumeMapper::SafeDownCast(m)) != NULL )
+    {
+    input = volumeMapper->GetDataSetInput();
+    }
+  else
+    {
+    return VTK_DOUBLE_MAX;
+    }
+
+  if ( (numCells = input->GetNumberOfCells()) < 1 )
+    {
+    return 2.0;
+    }
+
+  // Intersect each cell with ray.  Keep track of one closest to
+  // the eye (within the tolerance tol) and within the clipping range). 
+  // Note that we fudge the "closest to" (tMin+this->Tolerance) a little and
+  // keep track of the cell with the best pick based on parametric
+  // coordinate (pick the minimum, maximum parametric distance). This 
+  // breaks ties in a reasonable way when cells are the same distance 
+  // from the eye (like cells lying on a 2D plane).
+  //
+  minCellId = -1;
+  minSubId = -1;
+  pcoords[0] = pcoords[1] = pcoords[2] = 0;
+  double pDistMin=VTK_DOUBLE_MAX, pDist;
+  for (tMin=VTK_DOUBLE_MAX,cellId=0; cellId<numCells; cellId++) 
+    {
+    input->GetCell(cellId, this->Cell);
+
+    if ( this->Cell->IntersectWithLine(p1, p2, tol, t, x, pcoords, subId) 
+    && t <= (tMin+this->Tolerance) )
+      {
+      pDist = this->Cell->GetParametricDistance(pcoords);
+      // This is the only difference of this method from the vtkCellPicker's one
+      static double aTolerance = 1E-7;
+      //if ( pDist < pDistMin || (pDist == pDistMin && t < tMin ) )
+      if ( pDist < pDistMin || (pDist == pDistMin && t < tMin + aTolerance ) )
+        {
+        minCellId = cellId;
+        minSubId = subId;
+        for (i=0; i<3; i++)
+          {
+          minXYZ[i] = x[i];
+          minPcoords[i] = pcoords[i];
+          }
+        tMin = t;
+        pDistMin = pDist;
+//        cout << "cell id: " << minCellId << "\n";
+        }//if minimum, maximum
+      }//if a close cell
+    }//for all cells
+  
+  //  Now compare this against other actors.
+  //
+  if ( minCellId>(-1) && tMin < this->GlobalTMin ) 
+    {
+    this->MarkPicked(path, prop3D, m, tMin, minXYZ);
+    this->CellId = minCellId;
+    this->SubId = minSubId;
+    for (i=0; i<3; i++)
+      {
+      this->PCoords[i] = minPcoords[i];
+      }
+    vtkDebugMacro("Picked cell id= " << minCellId);
+    }
+  return tMin;
+}
index 8dbd981b2f9f66d2f4101633c206abbdd3931ac1..1b08d59658e75da60fe9e36aa27fcefd42b956ee 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <vtkObject.h>
 #include <vtkSmartPointer.h>
+#include <vtkCellPicker.h>
 
 class vtkRenderer;
 class vtkCallbackCommand;
@@ -41,7 +42,6 @@ class vtkRenderWindowInteractor;
 
 class vtkPicker;
 class vtkPointPicker;
-class vtkCellPicker;
 class vtkProperty;
 
 class SVTK_RectPicker;
@@ -51,6 +51,7 @@ class VTKViewer_Transform;
 class SVTK_CubeAxesActor2D;
 class VTKViewer_Actor;
 class SVTK_Selector;
+class SVTK_CellPicker;
 
 #ifdef WIN32
 #pragma warning ( disable:4251 )
@@ -236,7 +237,7 @@ class SVTK_EXPORT SVTK_Renderer : public vtkObject
   //----------------------------------------------------------------------------
   // Highlight/ Prehighlight devices
   vtkSmartPointer<vtkPointPicker> myPointPicker;
-  vtkSmartPointer<vtkCellPicker> myCellPicker;
+  vtkSmartPointer<SVTK_CellPicker> myCellPicker;
 
   vtkSmartPointer<SVTK_RectPicker> myPointRectPicker;
   vtkSmartPointer<SVTK_RectPicker> myCellRectPicker;
@@ -252,6 +253,33 @@ class SVTK_EXPORT SVTK_Renderer : public vtkObject
   vtkFloatingPointType myBndBox[6];
 };
 
+/*! 
+  \class SVTK_CellPicker
+  The class is intended to redefine the IntersectWithLine()
+  to correct the mechanism of picking coincident cells
+*/
+class SVTK_CellPicker : public vtkCellPicker
+{
+public:
+  static SVTK_CellPicker* New();
+  vtkTypeMacro(SVTK_CellPicker,vtkCellPicker);
+
+protected:
+  SVTK_CellPicker();
+  ~SVTK_CellPicker();
+
+  virtual double IntersectWithLine(double p1[3], double p2[3], double tol, 
+                                   vtkAssemblyPath *path, vtkProp3D *p, 
+                                   vtkAbstractMapper3D *m);
+
+private:
+  vtkGenericCell *Cell; //used to accelerate picking
+
+private:
+  SVTK_CellPicker(const SVTK_CellPicker&);  // Not implemented.
+  void operator=(const SVTK_CellPicker&);  // Not implemented.
+};
+
 #ifdef WIN32
 //#pragma warning ( default:4251 )
 #endif