[vtkusers] How to get the input to a filter as algorithm output?
Berk Geveci
berk.geveci at kitware.com
Tue Dec 15 11:33:39 EST 2009
> Second item: In VTK it isn't safe to write a VTK filter that executes
> other VTK filters inside of it. Which is really unfortunate, because
> it sure is a useful thing to be able to do. But if you look through
> all the filters in VTK (i.e. vtkAlgorithm derived objects), you will
> not find a single one that does this.
Not true at all. It is safe to write filters that execute other VTK filters
and it is done (somewhat) regularly. It is however correct that you have
to be really careful doing this.
First rule: do not under any circumstance make an internal filter share
the input of the external filter. This includes both:
blend->AddInputconnection( this->GetInputConnection( ) );
and
blend->AddInput(input);
If you do this, you will (at one point in time) run into all kinds of trouble
because blend's update request will propagate up the pipeline and
this will happen while you are inside the RequestData() of the external
filter. Not good. Don't do it.
A simple solution:
vtkImageData* inputCopy = input->NewInstance();
inputCopy->ShallowCopy(input);
blend->AddInput(inputCopy);
blend->Update();
output->ShallowCopy(blend->GetOutput());
This work for the simple case - where the pipeline is for the most part
working on the whole data. It would also work if you had a mini internal
pipeline ending with blend.
If you are doing streaming or distributed processing, or you are fiddling
around with other pipeline requests, things get more complicated. I can
get into that if someone finds a good example :-)
There is also the case of complete delegation to a sub-filter. Look at
vtkContourFilter.cxx to see how that works.
-berk
On Tue, Dec 15, 2009 at 9:41 AM, David Gobbi <david.gobbi at gmail.com> wrote:
> Where to start... there are a couple important items here.
>
> First, there's nothing wrong with directly accessing data objects when
> you are writing a VTK filter. Obviously the filter must access the
> data. That's completely different from accessing the data objects
> outside of the filters, and whenever I said "don't mess with the data
> objects", I really meant "if you want to mess with the data, then
> write a filter".
>
> Second item: In VTK it isn't safe to write a VTK filter that executes
> other VTK filters inside of it. Which is really unfortunate, because
> it sure is a useful thing to be able to do. But if you look through
> all the filters in VTK (i.e. vtkAlgorithm derived objects), you will
> not find a single one that does this.
>
> Each vtkAlgorithm has an executive that deals with the vtkInformation
> and sends Requests to the vtkAlgorithm. If, internally, you grab the
> algorithm's input and feed it into your little "internal pipeline",
> then that internal pipeline will propagate its own requests to the
> input's producer. As a result a RequestData in the main (external)
> pipeline can cause the internal pipeline to update, which causes all
> sorts of requests to be sent up both the internal and external
> pipeline before the RequestData completes. This is a violation of the
> usual, careful way that the pipeline is supposed to step its way
> through the various requests. It may result in undefined behavior of
> the pipeline.
>
> It would be nice if someone devised a recipe for how to safely use a
> mini-pipeline inside a VTK filter, by using deep copies of the data
> objects or whatnot, but so far I haven't seen one. About the closest
> thing that I've done is use ITK from inside a VTK filter.
>
> David
>
>
> On Tue, Dec 15, 2009 at 1:18 AM, Jérôme <jerome.velut at gmail.com> wrote:
>> Hi David D.,
>>
>> If I understood well, you write VTK pipeline inside a VTK filter. If so, I
>> also do that *very* often. My way avoids to get the input data, just
>> connects the input:
>> blend->AddInputconnection( this->GetInputConnection( ) ); // 'this' being
>> your vtkAlgorithm-derived filter.
>>
>> Secondly, I read with interest the thread in which David G. taught about VTK
>> pipelining. And I don't think he would have your head for using the
>> old-fashioned SetInput method. It is just like... old-fashioned, but you
>> don't "touch" at the data. It is unfair because you add some -maybe-
>> unuseful static cast, but the integrity of the pipeline is still preserved.
>>
>> David G. can you confirm my feelings?
>>
>> Jerome
>>
>> 2009/12/15 David Doria <daviddoria+vtk at gmail.com>
>>>
>>> The first thing I typically do (and I got this by looking at existing
>>> filters) at the beginning of a RequestData() is:
>>>
>>> vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
>>> vtkImageData *input = vtkImageData::SafeDownCast(
>>> inInfo->Get(vtkDataObject::DATA_OBJECT()));
>>>
>>> However, now I have an actual object, so I have to do things like the
>>> following:
>>>
>>> vtkSmartPointer<vtkImageBlend> blend =
>>> vtkSmartPointer<vtkImageBlend>::New();
>>> //blend->AddInputConnection(input->GetOutputPort()); //can't do this
>>> because 'input' is not an algorithm output
>>> blend->AddInput(input);
>>>
>>> David G. would have my head for this! How should this be done instead?
>>>
>>> Thanks,
>>>
>>> David D.
>>> _______________________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the VTK FAQ at:
>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
>> _______________________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the VTK FAQ at:
>> http://www.vtk.org/Wiki/VTK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
More information about the vtkusers
mailing list