RequestUpdateExtent
測試1
import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
from vtk.util import keys
# 元數據
requestKey = keys.MakeKey(keys.IntegerRequestKey, "a request", "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:")
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:")
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:")
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()
f.UpdateInformation()
outInfo = f.GetOutputInformation(0)
outInfo.Set(requestKey, 0)
f.PropagateUpdateExtent()
發送請求:
f.UpdateInformation()
outInfo = f.GetOutputInformation(0)
outInfo.Set(requestKey, 0)
f.PropagateUpdateExtent()
輸出:
MySource和MyFilter中原數據a request: 0
MySource RequestInformation:
MyFilter RequestInformation:
MyFilter RequestUpdateExtent:
vtkInformation (0000018D6DE58F50)
Debug: Off
Modified Time: 230
Reference Count: 2
Registered Events: (none)
PRODUCER: vtkCompositeDataPipeline(0000018D6D5A0710) port 0
DATA_OBJECT: vtkPolyData(0000018D6DE58440)
UPDATE_PIECE_NUMBER: 0
UPDATE_NUMBER_OF_PIECES: 1
UPDATE_NUMBER_OF_GHOST_LEVELS: 0
a request: 0
MySource RequestUpdateExtent:
vtkInformation (0000018D6DE59D50)
Debug: Off
Modified Time: 242
Reference Count: 3
Registered Events: (none)
PRODUCER: vtkCompositeDataPipeline(0000018D6D5A2720) port 0
DATA_OBJECT: vtkPolyData(0000018D6B33D280)
CONSUMERS: vtkCompositeDataPipeline(0000018D6D5A0710) port 0
UPDATE_PIECE_NUMBER: 0
UPDATE_NUMBER_OF_PIECES: 1
UPDATE_NUMBER_OF_GHOST_LEVELS: 0
a request: 0
測試2
import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
from vtk.util import keys
metaDataKey = keys.MakeKey(keys.DataObjectMetaDataKey, \
"a meta-data", "my module")
requestKey = keys.MakeKey(keys.IntegerRequestKey, "a request", "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))
areq = outInfo.GetInformationObject(0).Get(requestKey)
inInfo[0].GetInformationObject(0).Set(requestKey, areq + 1)
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()
f.UpdateInformation()
outInfo = f.GetOutputInformation(0)
outInfo.Set(requestKey, 0)
f.PropagateUpdateExtent()
輸出:
MySource RequestInformation:
MyFilter RequestInformation:
MyFilter RequestUpdateExtent:
vtkInformation (0000019826985EE0)
Debug: Off
Modified Time: 230
Reference Count: 2
Registered Events: (none)
PRODUCER: vtkCompositeDataPipeline(00000198268DA7B0) port 0
DATA_OBJECT: vtkPolyData(0000019823F0D670)
UPDATE_PIECE_NUMBER: 0
UPDATE_NUMBER_OF_PIECES: 1
UPDATE_NUMBER_OF_GHOST_LEVELS: 0
a request: 0
MySource RequestUpdateExtent:
vtkInformation (00000198269855E0)
Debug: Off
Modified Time: 243
Reference Count: 3
Registered Events: (none)
PRODUCER: vtkCompositeDataPipeline(00000198268D9BD0) port 0
CONSUMERS: vtkCompositeDataPipeline(00000198268DA7B0) port 0
DATA_OBJECT: vtkPolyData(0000019826983120)
UPDATE_PIECE_NUMBER: 0
UPDATE_NUMBER_OF_PIECES: 1
UPDATE_NUMBER_OF_GHOST_LEVELS: 0
a request: 1
執行過程:
outInfo.Set(requestKey, 0)
->MyFilter.RequestUpdateExtent()
->MySource.RequestUpdateExtent()
- 在RequestInformation中,源(source)生成的元數據(meta-data),默認向下遊複製以及修改後的值向下傳遞。
- 在 RequestUpdateExtent中, 下游會發送改變元數據的請求,改變的值傳遞給上游。
RequestData
RequestInformation
和RequestUpdateExtent
傳遞的是輕量級的元數據。RequestData
和RequestInformation
相似都是向下遊傳遞數據,不同的地方是它傳遞的是重量級的數據。
測試
import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
from vtk.util import keys
requestKey = keys.MakeKey(keys.IntegerRequestKey, "a request", "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))
outInfo0 = outInfo.GetInformationObject(0)
areq = outInfo0.Get(requestKey)
s = vtk.vtkSphereSource()
s.SetRadius(areq)
s.Update()
output = outInfo0.Get(vtk.vtkDataObject.DATA_OBJECT())
output.ShallowCopy(s.GetOutput())
print (output)
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))
areq = outInfo.GetInformationObject(0).Get(requestKey)
inInfo[0].GetInformationObject(0).Set(requestKey, areq + 1)
return 1
def RequestData(self, request, inInfo, outInfo):
print ("MyFilter RequestData:")
inInfo0 = inInfo[0].GetInformationObject(0)
outInfo0 = outInfo.GetInformationObject(0)
input = inInfo0.Get(vtk.vtkDataObject.DATA_OBJECT())
output = outInfo0.Get(vtk.vtkDataObject.DATA_OBJECT())
sh = vtk.vtkShrinkPolyData()
sh.SetInputData(input)
sh.Update()
output.ShallowCopy(sh.GetOutput())
print (output)
return 1
s = MySource()
f = MyFilter()
f.SetInputConnection(s.GetOutputPort())
f.UpdateInformation()
outInfo = f.GetOutputInformation(0)
outInfo.Set(requestKey, 0)
f.PropagateUpdateExtent()
f.Update()