Discussion:
[vtkusers] Accessing the original IDs of selected points in vtkPolyData or vtkUnstructuredGrid
Zoltan Kovacs
2018-11-05 15:35:31 UTC
Permalink
Dear All,

I try to access the ID list of nodes which are selected in a grid. Based on the example
https://lorensen.github.io/VTKExamples/site/Cxx/Picking/HighlightSelectedPoints/
I copied the
class InteractorStyle : public vtkInteractorStyleRubberBandPick
{...}

from the example to catch mouse events. In the function calling the member functions of this class
I have the code

...

vtkSmartPointer<vtkUnstructuredGrid> grid = vtkSmartPointer<vtkUnstructuredGrid>::New();
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();

...
filling 'points' with points from a point list
...

grid->SetPoints(points);
polydata->SetPoints(points);

mapper->SetInputData(grid);
actor->SetMapper(mapper);

renderer->AddActor(actor);
renderer->ResetCamera();

renderWindowInteractor->SetPicker(picker);
interactorStyle->SetPoints(polydata);
renderWindowInteractor->SetInteractorStyle(interactorStyle);

This code can render the nodes from the grid and let one select nodes from the polydata via the rubber band picker. However, when I insert a vtkIdFilter and a vtkSurfaceFilter in the pipeline to save the original node IDs and use them in the selection, the selection does not work:

..

vtkSmartPointer<vtkUnstructuredGrid> grid = vtkSmartPointer<vtkUnstructuredGrid>::New();
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkIdFilter> idFilter = vtkSmartPointer<vtkIdFilter>::New();
vtkSmartPointer<vtkSurfaceFilter> surfaceFilter = vtkSmartPointer<vtkSurfaceFilter>::New();
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();

...
filling 'points' with points from a point list.
...

grid->SetPoints(points);
polydata->SetPoints(points);

idFilter->SetInputData(polydata);
idFilter->SetIdsArrayName("OriginalIds");
idFilter->Update();

surfaceFilter->SetInputConnection(idFilter->GetOutputPort());
surfaceFilter->Update();

vtkPolyData *input = surfaceFilter->GetOutput();

mapper->SetInputData(grid);
actor->SetMapper(mapper);

renderer->AddActor(actor);
renderer->ResetCamera();

renderWindowInteractor->SetPicker(picker);
interactorStyle->SetPoints(input);
renderWindowInteractor->SetInteractorStyle(interactorStyle);

The code still renders the nodes from the grid but the rubber band picking does not select nodes from polydata -> idFilter -> surfaceFilter -> input. Is there any simple way to access the selected node IDs from vtkPolyData? Or, even better, from vktUnstructuredGrid instead of vtkPolyData? Thanks a lot!

Kind regards,
Zoltan

Loading...