]> Creatis software - creaVtk.git/blobdiff - bbtk_creaVtk_PKG/src/bbcreaVtkPointPicker.cxx
#3489 Bug exampleVoiMPR
[creaVtk.git] / bbtk_creaVtk_PKG / src / bbcreaVtkPointPicker.cxx
index 6bc8262cfb999ec40760ca1e5eaa474597f4fa30..3d71c086809a59cfda0334da4ada5e4a2868acfa 100644 (file)
@@ -7,32 +7,86 @@
 #include <vtkPropPicker.h>
 #include <vtkCellPicker.h>
 #include <vtkRenderWindow.h>
-#include <vtkRenderWindowInteractor.h>
 #include <vtkRendererCollection.h>
+#include <vtkDataSet.h>
+#include <vtkPolyData.h>
+#include <vtkPointData.h>
+#include <vtkDataArray.h>
 
 namespace bbcreaVtk
 {
 
+creaVtkCallbackPointPicker::creaVtkCallbackPointPicker(void)
+{
+       boxPointPicker = NULL;
+}
 
+void creaVtkCallbackPointPicker::setBox(PointPicker *box)
+{
+       boxPointPicker = box;
+}
 
 void creaVtkCallbackPointPicker::Execute(vtkObject *caller, unsigned long, void*)
 {
-               printf("creaVtkCallbackPointPicker EED Picker\n");
-               vtkRenderWindowInteractor *iren = static_cast<vtkRenderWindowInteractor*>(caller);
-
-               int* pos = iren->GetEventPosition();
-        vtkCellPicker *picker = vtkCellPicker::New();
-        picker->SetTolerance(0.0005);
-        picker->Pick(pos[0], pos[1], 0, iren->GetRenderWindow()->GetRenderers()->GetFirstRenderer() );
-
-               if(picker->GetCellId() != -1)
-        {
-                       printf("creaVtkCallbackPointPicker EED picker OK\n");
-               } else {
-                       printf("creaVtkCallbackPointPicker EED picker --\n");
-               } // if
+       if (boxPointPicker!=NULL)
+       {
+               if (boxPointPicker->bbGetInputActive()==true)
+               {
+                       vtkRenderWindowInteractor   *iren   = static_cast<vtkRenderWindowInteractor*>(caller);
+                       int                         *pos    = iren->GetEventPosition();
+                   vtkCellPicker               *picker = vtkCellPicker::New();
+                   picker->SetTolerance(0.0005);
+                   if (boxPointPicker->bbGetInputProp3D()!=NULL ) 
+                   {
+                       picker->AddPickList( boxPointPicker->bbGetInputProp3D() );
+                       picker->PickFromListOn();
+                       }
+                   picker->Pick(pos[0], pos[1], 0, iren->GetRenderWindow()->GetRenderers()->GetFirstRenderer() );
+                       double point[3];
+                       if(picker->GetCellId() != -1)
+                   {
+                               picker->GetPickPosition(point);
+                               std::vector<double> vecPoint;
+                               vecPoint.push_back( point[0] );
+                               vecPoint.push_back( point[1] );
+                               vecPoint.push_back( point[2] );
+                boxPointPicker->bbSetOutputPoint( vecPoint );
+                boxPointPicker->bbSetOutputMesh( picker->GetProp3D() );
+                boxPointPicker->bbSetOutputPointId( picker->GetPointId() );
 
+                boxPointPicker->bbSetOutputCellId( picker->GetCellId() );
+                vtkDataSet *dataset = picker->GetDataSet();
+                if (strcmp(dataset->GetClassName(),"vtkPolyData")==0)
+                {
+                    vtkPolyData     *polydata   = (vtkPolyData*)dataset;
+                    vtkPointData    *pointdata  = polydata->GetPointData();
+                    vtkDataArray    *dataarray;
+                    double          *pValue;
+                    /*
+                    int i,size=pointdata->GetNumberOfArrays();
+                    for(i=0;i<size;i++)
+                    {
+                        dataarray=pointdata->GetArray(i);
+                        printf("EED creaVtkCallbackPointPicker::Execute dataarray=%s  n=%ld p=%ld\n", dataarray->GetName(),dataarray->GetNumberOfValues() ,polydata->GetNumberOfPoints() );
+                    } // for i
+                    */
+                    dataarray   = pointdata->GetNormals();
+                    if (dataarray!=NULL)
+                    {
+                        pValue      = dataarray->GetTuple3( picker->GetPointId() );
+                        std::vector<double> lstNormal;
+                        lstNormal.push_back(pValue[0]);
+                        lstNormal.push_back(pValue[1]);
+                        lstNormal.push_back(pValue[2]);
+                        boxPointPicker->bbSetOutputNormal( lstNormal );
+                    } // if dataarray
+                } // if ClassName
+                boxPointPicker->bbSignalOutputModification();
+                       }  // if
+               } // if Active
+       } // if boxPoiintPicker
 
+    
 /*
 {
  
@@ -40,7 +94,7 @@ void creaVtkCallbackPointPicker::Execute(vtkObject *caller, unsigned long, void*
                   << " " << worldPosition[2] << endl;
  
         vtkSmartPointer<vtkIdTypeArray> ids =
-          vtkSmartPointer<vtkIdTypeArray>::New();
+          vtkSmartPointer<vtkIdTypeArray>::New()creaVtkCallbackPointPicker *callPicker;
         ids->SetNumberOfComponents(1);
         ids->InsertNextValue(picker->GetCellId());
  
@@ -93,8 +147,6 @@ void creaVtkCallbackPointPicker::Execute(vtkObject *caller, unsigned long, void*
         }
 */
 
-
-
 }
 
 
@@ -110,7 +162,6 @@ BBTK_BLACK_BOX_IMPLEMENTATION(PointPicker,bbtk::AtomicBlackBox);
 //===== 
 void PointPicker::Process()
 {
-
 // THE MAIN PROCESSING METHOD BODY
 //   Here we simply set the input 'In' value to the output 'Out'
 //   And print out the output value
@@ -128,8 +179,6 @@ void PointPicker::Process()
   
        if (firsttime==true)
        {
-
-printf("EED PointPicker::Process Firsttime \n");
                firsttime = false;
 //             vtkCellPicker *picker = vtkCellPicker::New();
 //             vtkPropPicker *picker = vtkCellPicker::New();
@@ -146,54 +195,98 @@ printf("EED PointPicker::Process Firsttime \n");
                picker->AddObserver( vtkCommand::MouseMoveEvent , callPicker );
                bbGetInputRenderer()->GetRenderWindow()->GetInteractor()->SetPicker(picker);
 */
+               callPicker = creaVtkCallbackPointPicker::New();
+               callPicker->setBox( this );
+       } // if firsttime
 
-               creaVtkCallbackPointPicker *callPicker = creaVtkCallbackPointPicker::New();
+
+       if (bbGetInputRenderer()!=NULL)
+       {
                vtkRenderWindowInteractor *vrwi = bbGetInputRenderer()->GetRenderWindow()->GetInteractor();
-               vrwi->AddObserver( vtkCommand::EndPickEvent , callPicker );
-               vrwi->AddObserver( vtkCommand::StartPickEvent , callPicker );
-               vrwi->AddObserver( vtkCommand::MouseMoveEvent , callPicker );
+               vrwi->RemoveObserver( callPicker );
 
-       } // if firsttime
+               if (bbGetInputTypeEvent()==0)
+               {
+                       // Nothing
+               } else if (bbGetInputTypeEvent()==1)
+               {
+                       vrwi->AddObserver( vtkCommand::MouseMoveEvent , callPicker );
+               } else if (bbGetInputTypeEvent()==2)
+               {
+                       vrwi->AddObserver( vtkCommand::LeftButtonPressEvent , callPicker );
+               } else if (bbGetInputTypeEvent()==3)
+               {
+#if VTK_MAJOR_VERSION >= 9
+               vrwi->AddObserver( vtkCommand::LeftButtonDoubleClickEvent , callPicker );
+#else
+               printf("EED Warnning!  PointPicker LeftButtonPressEvent since vtk 9 \n");
+#endif
+               } // if TypeEvent       
+               // ....See vtkCommand EventIds
+       } // if bbGetInputRenderer()
 
+               
+//  std::vector<double> lstPoint;
+//  lstPoint.push_back(0);
+//  lstPoint.push_back(0);
+//  lstPoint.push_back(1);
+//  bbSetOutputPoint( lstPoint );
+    
+// BORRAME    bbSetOutputPoint( bbGetInputDefaultPoint() );
+    
+//  bbSetOutputMesh( NULL );
+// Borrame    bbSetOutputPointId( bbGetInputDefaultPointId() );
+//  bbSetOutputCellId( -1 );
+//  bbSetOutputNormal( lstPoint );
+    
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void PointPicker::bbUserSetDefaultValues()
 {
-
 //  SET HERE THE DEFAULT INPUT/OUTPUT VALUES OF YOUR BOX 
 //    Here we initialize the input 'In' to 0
 //   bbSetInputIn(0);
-  
-       firsttime=true;
+       bbSetInputActive(true);
+       bbSetInputTypeEvent(0);
+    bbSetInputDefaultPointId( -1 );
+       bbSetOutputMesh(NULL);
+       bbSetOutputPointId(-1);
+       bbSetOutputCellId(-1);
+       firsttime=true;
+       callPicker=NULL;
+       bbSetInputProp3D(NULL);
+    std::vector<double> lstNormal;
+    lstNormal.push_back(0);
+    lstNormal.push_back(0);
+    lstNormal.push_back(1);
+    bbSetOutputNormal( lstNormal );
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void PointPicker::bbUserInitializeProcessing()
 {
-
 //  THE INITIALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should allocate the internal/output pointers 
-//    if any 
-
-  
+//    if any
 }
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
 void PointPicker::bbUserFinalizeProcessing()
 {
-
 //  THE FINALIZATION METHOD BODY :
 //    Here does nothing 
 //    but this is where you should desallocate the internal/output pointers 
 //    if any
-  
-}
 }
-// EO namespace bbcreaVtk
+
+}// EO namespace bbcreaVtk