#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
+
/*
{
<< " " << worldPosition[2] << endl;
vtkSmartPointer<vtkIdTypeArray> ids =
- vtkSmartPointer<vtkIdTypeArray>::New();
+ vtkSmartPointer<vtkIdTypeArray>::New()creaVtkCallbackPointPicker *callPicker;
ids->SetNumberOfComponents(1);
ids->InsertNextValue(picker->GetCellId());
}
*/
-
-
}
//=====
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
if (firsttime==true)
{
-
-printf("EED PointPicker::Process Firsttime \n");
firsttime = false;
// vtkCellPicker *picker = vtkCellPicker::New();
// vtkPropPicker *picker = vtkCellPicker::New();
picker->AddObserver( vtkCommand::MouseMoveEvent , callPicker );
bbGetInputRenderer()->GetRenderWindow()->GetInteractor()->SetPicker(picker);
*/
+ callPicker = creaVtkCallbackPointPicker::New();
+ callPicker->setBox( this );
+ } // if firsttime
- creaVtkCallbackPointPicker *callPicker = creaVtkCallbackPointPicker::New();
- callPicker->_renderer = bbGetInputRenderer();
+
+ 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> point;
+ bbSetOutputPoint( point );
+
+
+// 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 );
+
+// std::vector<double> point;
+// point.push_back(-1);
+// point.push_back(-1);
+// point.push_back(-1);
+// bbSetOutputPoint( point );
}
+
//=====
// 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