vtk管線入門2

一個簡單的管線:

在這裏插入圖片描述

import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
 
class MySource(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=0,
            nOutputPorts=1, outputType='vtkPolyData')
 
    def RequestInformation(self, request, inInfo, outInfo):
        print "MySource RequestInformation:"
#        print outInfo.GetInformationObject(0)
        return 1
 
    def RequestUpdateExtent(self, request, inInfo, outInfo):
        print "MySource RequestUpdateExtent:"
#        print outInfo.GetInformationObject(0)
        return 1
 
    def RequestData(self, request, inInfo, outInfo):
        print "MySource RequestData:"
#        print outInfo.GetInformationObject(0)
        return 1
 
class MyFilter(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=1, inputType='vtkPolyData',
            nOutputPorts=1, outputType='vtkPolyData')
 
    def RequestInformation(self, request, inInfo, outInfo):
        print "MyFilter RequestInformation:"
#        print outInfo.GetInformationObject(0)
        return 1
 
    def RequestUpdateExtent(self, request, inInfo, outInfo):
        print "MyFilter RequestUpdateExtent:"
#        print outInfo.GetInformationObject(0)
        return 1
 
    def RequestData(self, request, inInfo, outInfo):
        print "MyFilter RequestData:"
#        print outInfo.GetInformationObject(0)
        return 1

測試:

s = MySource()
f = MyFilter()
f.SetInputConnection(s.GetOutputPort())
f.Update()

輸出:

MySource RequestInformation:
MyFilter RequestInformation:
MyFilter RequestUpdateExtent:
MySource RequestUpdateExtent:
MySource RequestData:
MyFilter RequestData:

管線執行順序

  • RequestInformation
  • RequestUpdateExtent ()
  • RequestData

RequestInformation

RequestInformation 管線中元數據(meta-data)的傳遞。主要包括一些時間戳和範圍。從源到溯傳遞。

自定義傳遞的元數據

from vtk.util import keys
 
metaDataKey = keys.MakeKey(keys.DataObjectMetaDataKey, \
  "a meta-data", "my module")

自定義元數據的值

class MySource(VTKPythonAlgorithmBase):
    def RequestInformation(self, request, inInfo, outInfo):
        print ("MySource RequestInformation:")
        outInfo.GetInformationObject(0).Set(metaDataKey, vtk.vtkPolyData())
        print (outInfo.GetInformationObject(0))
        return 1

測試

import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
from vtk.util import keys

metaDataKey = keys.MakeKey(keys.DataObjectMetaDataKey, \
  "a meta-data", "my module")

class MySource(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=0,
            nOutputPorts=1, outputType='vtkPolyData')
 
    def RequestInformation(self, request, inInfo, outInfo):
        print ("MySource RequestInformation:")
        outInfo.GetInformationObject(0).Set(metaDataKey, vtk.vtkPolyData())
        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestUpdateExtent(self, request, inInfo, outInfo):
        print ("MySource RequestUpdateExtent:")
#        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestData(self, request, inInfo, outInfo):
        print ("MySource RequestData:")
#        print (outInfo.GetInformationObject(0))
        return 1
 
class MyFilter(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=1, inputType='vtkPolyData',
            nOutputPorts=1, outputType='vtkPolyData')
 
    def RequestInformation(self, request, inInfo, outInfo):
        print ("MyFilter RequestInformation:")
        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestUpdateExtent(self, request, inInfo, outInfo):
        print ("MyFilter RequestUpdateExtent:")
#        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestData(self, request, inInfo, outInfo):
        print ("MyFilter RequestData:")
#        print (outInfo.GetInformationObject(0))
        return 1


s = MySource()
 
f = MyFilter()
f.SetInputConnection(s.GetOutputPort())
 
f.Update()

輸出

MySource RequestInformation:
vtkInformation (0000020914F670A0)
  Debug: Off
  Modified Time: 220
  Reference Count: 3
  Registered Events: (none)
  PRODUCER: vtkCompositeDataPipeline(0000020914C7B4F0) port 0
  CONSUMERS: vtkCompositeDataPipeline(0000020914C7D760) port 0
  DATA_OBJECT: vtkPolyData(0000020914F6CEB0)
  a meta-data: vtkPolyData(00000209124DD610)


MyFilter RequestInformation:
vtkInformation (0000020914F67EA0)
  Debug: Off
  Modified Time: 239
  Reference Count: 2
  Registered Events: (none)
  PRODUCER: vtkCompositeDataPipeline(0000020914C7D760) port 0
  DATA_OBJECT: vtkPolyData(0000020914F99180)
  a meta-data: vtkPolyData(00000209124DD610)


MyFilter RequestUpdateExtent:
MySource RequestUpdateExtent:
MySource RequestData:
MyFilter RequestData:

MyFilter中的vtkInformation當中可以看到自定義的元數據a meta-data: vtkPolyData(00000209124DD610)

在溯中對元數據進行修改

拷貝一份元數據,然後再添加一個字符數組。

class MyFilter(VTKPythonAlgorithmBase):
    def RequestInformation(self, request, inInfo, outInfo):
        print ("MyFilter RequestInformation:")
        print (outInfo.GetInformationObject(0))
        metaData = inInfo[0].GetInformationObject(0).Get(
            metaDataKey)
        newMetaData = metaData.NewInstance()
        newMetaData.ShallowCopy(metaData)
        someArray = vtk.vtkCharArray()
        someArray.SetName("someArray")
        newMetaData.GetFieldData().AddArray(someArray)
        outInfo.GetInformationObject(0).Set(metaDataKey, newMetaData)
        print (outInfo.GetInformationObject(0))
        return 1

完整測試

import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
from vtk.util import keys

metaDataKey = keys.MakeKey(keys.DataObjectMetaDataKey, \
  "a meta-data", "my module")

class MySource(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=0,
            nOutputPorts=1, outputType='vtkPolyData')
 
    def RequestInformation(self, request, inInfo, outInfo):
        print ("MySource RequestInformation:")
        outInfo.GetInformationObject(0).Set(metaDataKey, vtk.vtkPolyData())
        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestUpdateExtent(self, request, inInfo, outInfo):
        print ("MySource RequestUpdateExtent:")
#        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestData(self, request, inInfo, outInfo):
        print ("MySource RequestData:")
#        print (outInfo.GetInformationObject(0))
        return 1
 
class MyFilter(VTKPythonAlgorithmBase):
    def __init__(self):
        VTKPythonAlgorithmBase.__init__(self,
            nInputPorts=1, inputType='vtkPolyData',
            nOutputPorts=1, outputType='vtkPolyData')
 
    def RequestInformation(self, request, inInfo, outInfo):
        print ("MyFilter RequestInformation:")
        print (outInfo.GetInformationObject(0))
        metaData = inInfo[0].GetInformationObject(0).Get(
            metaDataKey)
        newMetaData = metaData.NewInstance()
        newMetaData.ShallowCopy(metaData)
        someArray = vtk.vtkCharArray()
        someArray.SetName("someArray")
        newMetaData.GetFieldData().AddArray(someArray)
        outInfo.GetInformationObject(0).Set(metaDataKey, newMetaData)
        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestUpdateExtent(self, request, inInfo, outInfo):
        print ("MyFilter RequestUpdateExtent:")
#        print (outInfo.GetInformationObject(0))
        return 1
 
    def RequestData(self, request, inInfo, outInfo):
        print ("MyFilter RequestData:")
#        print (outInfo.GetInformationObject(0))
        return 1


s = MySource()
 
f = MyFilter()
f.SetInputConnection(s.GetOutputPort())
 
f.Update()

輸出:

(base) C:\Users\wangb\Documents\JupyterNoteBook>C:/Anaconda3/python.exe c:/Users/wangb/Documents/JupyterNoteBook/pipeline2.py
MySource RequestInformation:
vtkInformation (0000010668C600E0)
  Debug: Off
  Modified Time: 220
  Reference Count: 3
  Registered Events: (none)
  PRODUCER: vtkCompositeDataPipeline(000001066895BF10) port 0
  CONSUMERS: vtkCompositeDataPipeline(0000010668959320) port 0
  DATA_OBJECT: vtkPolyData(0000010668C5ED40)
  a meta-data: vtkPolyData(000001066818E9B0)


MyFilter RequestInformation:
vtkInformation (0000010668C5F560)
  Debug: Off
  Modified Time: 239
  Reference Count: 2
  Registered Events: (none)
  PRODUCER: vtkCompositeDataPipeline(0000010668959320) port 0
  DATA_OBJECT: vtkPolyData(00000106660FD9D0)
  a meta-data: vtkPolyData(000001066818E9B0)


vtkInformation (0000010668C5F560)
  Debug: Off
  Modified Time: 264
  Reference Count: 2
  Registered Events: (none)
  PRODUCER: vtkCompositeDataPipeline(0000010668959320) port 0
  DATA_OBJECT: vtkPolyData(00000106660FD9D0)
  a meta-data: vtkPolyData(0000010668C69800)


MyFilter RequestUpdateExtent:
MySource RequestUpdateExtent:
MySource RequestData:
MyFilter RequestData:

在MyFilter中會有兩份元數據 a meta-data: vtkPolyData(000001066818E9B0)a meta-data: vtkPolyData(0000010668C69800)

示意圖:
在這裏插入圖片描述

一個實際的例子

在這裏插入圖片描述

HDFSourceRequestInformation:

def RequestInformation(self, request, inInfo, outInfo):
        f = h5py.File(self.__FileName, 'r')
        dims = f['RTData'].shape[::-1]
        info = outInfo.GetInformationObject(0)
        # 元數據
        info.Set(vtk.vtkStreamingDemandDrivenPipeline.WHOLE_EXTENT(),
            (0, dims[0]-1, 0, dims[1]-1, 0, dims[2]-1), 6)
        return 1

RequestSubsetRequestInformation :

def RequestInformation(self, request, inInfo, outInfo):
    info = outInfo.GetInformationObject(0)
    # 元數據的修改 
    info.Set(vtk.vtkStreamingDemandDrivenPipeline.WHOLE_EXTENT(), \
        self.__UpdateExtent, 6)
    return 1
  1. HDF5Source 在 RequestInformation中創建meta-data,
  2. meta-data 被拷貝到 RequestSubset 的輸出中,
  3. RequestSubset 在 RequestInformation中重寫 meta-data 。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章