python自定義vtk算法
vtkPythonAlgorithm is great
使用vtkPythonAlgorithm
- 定義vtkPythonAlgorithm對象
- 通過SetPythonObject()使用自定義算法對象
- 調用Initialize(self, vtkself)把vtkPythonAlgorithm引用傳遞給自定義算法對象
- 將以下方法委託給自定義算法對象
- ProcessRequest(self, vtkself, request, inInfo, outInfo)
- FillInputPortInformation(self, vtkself, port, info)
- FillOutputPortInformation(self, vtkself, port, info)
自定義算法對象需要實現 Initialize(self, vtkself),ProcessRequest(self, vtkself, request, inInfo, outInfo),
FillInputPortInformation(self, vtkself, port, info),FillOutputPortInformation(self, vtkself, port, info)
import vtk
class MyAlgorithm(object):
# 設置輸入輸出的個數
def Initialize(self, vtkself):
vtkself.SetNumberOfInputPorts(1)
vtkself.SetNumberOfOutputPorts(1)
# 設置輸入信息
def FillInputPortInformation(self, vtkself, port, info):
info.Set(vtk.vtkAlgorithm.INPUT_REQUIRED_DATA_TYPE(), "vtkDataSet")
return 1
# 設置輸出信息
def FillOutputPortInformation(self, vtkself, port, info):
info.Set(vtk.vtkDataObject.DATA_TYPE_NAME(), "vtkPolyData")
return 1
# def ProcessRequest(self, vtkself, request, inInfo, outInfo):
# if request.Has(vtk.vtkDemandDrivenPipeline.REQUEST_DATA()):
# print ('I am supposed to execute')
# return 1
# 處理數據的流程
def ProcessRequest(self, vtkself, request, inInfo, outInfo):
if request.Has(vtk.vtkDemandDrivenPipeline.REQUEST_DATA()):
inp = inInfo[0].GetInformationObject(0).Get(vtk.vtkDataObject.DATA_OBJECT())
#inp = vtk.vtkDataSet.GetData(inInfo[0])
opt = outInfo.GetInformationObject(0).Get(vtk.vtkDataObject.DATA_OBJECT())
#opt = vtk.vtkPolyData.GetData(outInfo)
cf = vtk.vtkContourFilter()
cf.SetInputData(inp)
cf.SetValue(0, 200)
sf = vtk.vtkShrinkPolyData()
sf.SetInputConnection(cf.GetOutputPort())
sf.Update()
opt.ShallowCopy(sf.GetOutput())
return 1
# 測試
w = vtk.vtkRTAnalyticSource()
pa = vtk.vtkPythonAlgorithm()
pa.SetPythonObject(MyAlgorithm())
pa.SetInputConnection(w.GetOutputPort())
pa.Update()
print( pa.GetOutputDataObject(0).GetClassName())
print( pa.GetOutputDataObject(0).GetNumberOfCells())
使用VTKPythonAlgorithmBase
VTKPythonAlgorithmBase是 vtkPythonAlgorithm的子類,方便於定義vtk算法。
import vtk
from vtk.util.vtkAlgorithm import VTKPythonAlgorithmBase
class ContourShrink(VTKPythonAlgorithmBase):
# 構造函數設置輸入輸出個數和參數
def __init__(self):
VTKPythonAlgorithmBase.__init__(self,
nInputPorts=1, inputType='vtkDataSet',
nOutputPorts=1, outputType='vtkPolyData')
self.__ShrinkFactor = 0.5
self.__ContourValue = 200
def SetShrinkFactor(self, factor):
if factor != self.__ShrinkFactor:
self.__ShrinkFactor = factor
self.Modified()
def GetShrinkFactor(self):
return self.__ShrinkFactor
def SetContourValue(self, value):
if value != self.__ContourValue:
self.__ContourValue = value
self.Modified()
def GetContourValue(self):
return self.__ContourValue
def RequestData(self, request, inInfo, outInfo):
print ('Executing')
inp = vtk.vtkDataSet.GetData(inInfo[0])
opt = vtk.vtkPolyData.GetData(outInfo)
cf = vtk.vtkContourFilter()
cf.SetInputData(inp)
cf.SetValue(0, self.__ContourValue)
sf = vtk.vtkShrinkPolyData()
sf.SetShrinkFactor(self.__ShrinkFactor)
sf.SetInputConnection(cf.GetOutputPort())
sf.Update()
opt.ShallowCopy(sf.GetOutput())
return 1
# 測試
w = vtk.vtkRTAnalyticSource()
pa = ContourShrink()
pa.SetInputConnection(w.GetOutputPort())
pa.Update()
print (pa.GetOutputDataObject(0).GetClassName())
print (pa.GetOutputDataObject(0).GetNumberOfCells())
pa.SetShrinkFactor(0.7)
pa.SetContourValue(100)
pa.Update()
print (pa.GetOutputDataObject(0).GetClassName())
print (pa.GetOutputDataObject(0).GetNumberOfCells())