[vtkusers] Traversing (browsing) VTK pipeline

Андрей Траченко goodrone at gmail.com
Tue Aug 31 04:44:12 EDT 2010


Thank you, David,
your example helped me to find the API I was looking for.

I've written a generic class in Python to browse the pipeline starting
with vtkRenderer, and also a simple inherited class to show how to use
it. I hope it could be useful for somebody.

def iterate_collection(coll):
    number = coll.GetNumberOfItems()
    for i in xrange(number):
        yield coll.GetItemAsObject(i)

class PipelineBrowser(object):
    """ Class for browsing a pipeline built using
        x1.SetInputConnection(x2.GetOutputPort()) pattern.

        Pass a vtkRenderer instance and call browse().
        Inherit from this class and overwrite on_* methods.
    """
    def __init__(self, ren):
        """ ren is a vtkRenderer """
        self.ren = ren
    def browse(self):
        self.browse_renderer(self.ren)

    def on_renderer(self, ren):
        pass
    def browse_renderer(self, ren):
        self.on_renderer(ren)
        for actor in iterate_collection(ren.GetActors()):
            self.browse_actor(actor)

    def on_actor(self, actor):
        pass
    def browse_actor(self, actor):
        self.on_actor(actor)
        self.browse_algorithm(actor.GetMapper(), 0, actor)

    def on_algorithm(self, alg, level, parent):
        pass
    def browse_algorithm(self, alg, level, parent):
        self.on_algorithm(alg, level, parent)
        for port in range(alg.GetNumberOfInputPorts()):
            for index in range(alg.GetNumberOfInputConnections(port)):
                input_alg = alg.GetInputConnection(port, index).GetProducer()
                self.browse_algorithm(input_alg, level + 1, alg)

class PipelinePrinter(PipelineBrowser):
    """ Simple pipeline browser, printing class names to stdout """
    def on_renderer(self, ren):
        print "Renderer:", ren.GetClassName()
    def on_actor(self, actor):
        print "  Actor:", actor.GetClassName()
    def on_algorithm(self, alg, level, parent):
        indent = " " * (level + 2) * 2
        print indent + "Algorithm:", alg.GetClassName()

Andrew

2010/8/31 David E DeMarle <dave.demarle at kitware.com>:
> Here is some code I wrote long ago that runs up the pipeline to find
> out who the progenitor was.
>
> void vtkStreamingUpdateSuppressor::PrintPipe(vtkAlgorithm *alg)
> {
>  //for debugging, this helps me understand which US is which in the messages
>  vtkAlgorithm *algptr = alg;
>  if (!algptr) return;
>  if (algptr->GetNumberOfInputPorts() &&
>      algptr->GetNumberOfInputConnections(0))
>    {
>    vtkAlgorithmOutput *ao = algptr->GetInputConnection(0,0);
>    if (ao)
>      {
>      algptr = ao->GetProducer();
>      this->PrintPipe(algptr);
>      }
>    cerr << "->";
>    }
>  cerr << alg->GetClassName();
> }
>
> Note it only traces up the primary input so it doesn't handle merging,
> and of course it is traversing only upward, so it doesn't handle
> branching either.
>
> I've always meant to, but have not yet, put together a more complete
> pipeline examiner. The API you need to do that should be found almost
> exclusively in vtkExecutive and vtkAlgorithm.
>
> David E DeMarle
> Kitware, Inc.
> R&D Engineer
> 28 Corporate Drive
> Clifton Park, NY 12065-8662
> Phone: 518-371-3971 x109
>
>
>
> 2010/8/27 Андрей Траченко <goodrone at gmail.com>:
>> Another question of the same nature:
>>
>> given a vtkAlgorithm, can I tell what other algorithms are connected
>> to it? I suspect I should use something like vtkExecutive, but I can't
>> fugure out how.
>>
>> 2010/8/27 Андрей Траченко <goodrone at gmail.com>:
>>> Hello,
>>>
>>> I'd like to browse a given VTK pipeline, where filters are connected
>>> with a->SetInputConnection(b->GetOutputPort()), i.e. get a pointer to
>>> every filter in the pipeline. Is it possible to do? Where do I start?
>>> Can I browse it starting with a vtkRenderer?
>>>
>>> Thank you!
>>> Andrew
>>>
>> _______________________________________________
>> 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