1.VTK管线机制
VTK中通过管线机制来实现组合各种算法处理数据。每一种算法是一个Filter,多个Filter连接在一起形成VTK管线。每个Filter可以分为两个组成部分:一个是算法对象,继承自vtkAlgrithm,主要负责处理输入的数据和信息;另一个是执行对象,继承自vtkExecute(),负责通知算法对象何时运行以及传递需要处理的数据和信息。Filter类继承自vtkAlgrithm及其子类,实例化时,内部会生成一个默认的Executive()对象,用于管理执行管线。
数据和信息通过端口在Filter中传递,根据数据流的方向,分为输入端口和输出端口,如下图所示:
Filter的输入数据与信息存储在输入端口中。一个Filter可能有0个输入端口(例如 Reader对象);也可能有一个或多个输入端口(例如,vtkGlyph3D类需要两个输入端口,每个输入端口可以建立多个连接)。
一个Filter可能有1个或多个输出端口,每个输出端口对应一个逻辑输出。例如vtkExtractVectorComponents类,从一个三维向量数据中提取每个分量数据,该Filter需要一个输入端口接受向量数据,三个输出端口用于输出三个分量数据,端口号分别为0,1,2。
Filter之间通过端口(Port)建立连接(Connection)。例如一个标准的连接代码如下:
Filter2->SetInputConnection( Filter1->GetOutputPort() );
该句代码将Filter1的输出端口与Filter2的输入端口建立连接,连接中只涉及了一个输入端口和一个输出端口。而VTK中还有许多Filter可能需要多个输入,例如vtkGlyph3D,该类需要两个输入数据并生成一个输出数据。因此这里需要建立两个连接,相应的函数分别为SetInputConnection()和SetSourceConnection(),其中,SetInputConnection()输入的是几何点集数据,对应输入端口0,SetSourceConnection()输入的是Glyph图形数据,对应输入端口1。vtkGlyph3D中输入的两个数据具有不同的意义,因此建立了两个不同的输入端口。另外,对一个Filter的多个输入数据具有相同意义时,则只需要建立一个输入端口,并使用AddInputConnection()来添加新的连接。例如vtkAppendFilter类实现数据的合并,其多个输入数据具有相同意义,而不像vtkGlyph3D的两个输入表示不同的对象,因此其连接建立如下:
下图显示了Filter之间建立连接的示意图:apeend = vtkAppendFilter::New(); append->AddInputConnection( foo->GetOutputPort ); append->AddInputConnection( bar->GetOutputPort );