python自定義vtk算法 - vtkPythonAlgorithm is great

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())

Reference

vtkPythonAlgorithm is great

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章