[vtk-developers] With VTK >= 6, how to "choose" between SetInputData() or SetInputConnection() ?

houssen houssen at ipgp.fr
Wed Apr 12 11:09:14 EDT 2017


With VTK >= 6, how to "choose" between SetInputData() or 
SetInputConnection() ? How to know which one SHOULD be used ?

I read carefully this 
http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Replacement_of_SetInput, 
and, I digged several VTK examples 
http://www.vtk.org/Wiki/VTK/Examples/Cxx... Lot of things clarified but 
I'am still confused in exercising this: I feel like I missed some major 
stuffs...

To make it quick, my understanding is that :
1. If I need B to be modified if A is changed, I NEED to do 
"B->SetInputConnection(A->GetOutputPort())".
2. Otherwise, "B->SetInputData(A)" is enough (A will be an input of B 
BUT no link will be set between A and B : changing A does not trigger 
update of B).

Up to here I guess (?) I'am right (at least for the big headlines)... 
Stop me here if not !

Now, I want to have a source (grid) and I need to apply a filter on it. 
Say that in a call back I modify the source: I want BOTH source and 
filter to be updated when call backs are modifying the source. Here is 
what I have:
vtkSmartPointer<vtkUnstructuredGrid> spGrid = 
vtkSmartPointer<vtkUnstructuredGrid>::New(); // Source
// Fill the source with points and cells...
vtkSmartPointer<vtkVertexGlyphFilter> spVertexGlyphs = 
vtkSmartPointer<vtkVertexGlyphFilter>::New();
spVertexGlyphs->SetInputData(spGrid); // Case 2
vtkSmartPointer<vtkPolyDataMapper> spVertexGlyphMap = 
vtkSmartPointer<vtkPolyDataMapper>::New();
spVertexGlyphMap->SetInputConnection(spVertexGlyphs->GetOutputPort()); 
// Case 1 : the filter is updated if the source is modified.

This seems to works: the filter is updated if the source is modified.

But, this does NOT work: the source is NOT modified (= updated in the 
VTK window) when the callback modify it (so the filter may OR NOT be 
updated accordingly ?!).

I expected to be compelled to do:
vtkSmartPointer<vtkDataSetMapper> spGridMap = 
vtkSmartPointer<vtkDataSetMapper>::New();
spGridMap->SetInputConnection(spGrid->GetOutputPort()); // Compilation 
KO because there is not SetInputConnection or GetOutputPort ???
So I'am compelled to do (found lots of examples that do that):
spGridMap->SetInputData(spGrid);
... And I end up with a grid that does NOT update in the VTK window 
when call back modify the source.
I found a way to update it: the callback modify the grid and, at the 
end of the callback, I added "spGrid->Modified()", this triggers the 
update of the source.

So basically, I did what I need ... But:
1. Is the "spGrid->Modified()" a hack ? Or is it the "right" way to do 
? If yes, why (as it seems to bypass the update process) ?
2. Why is there no SetInputConnection on spGridMap ? Why is there no 
GetOutputPort on vtkUnstructuredGrid ?

I just would like to understand the logic behind....

Franck


More information about the vtk-developers mailing list