一:主要的知识点
1、说明
本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客
2、知识点纪要
本段代码主要涉及的有①vtkExtractEdges非复合感知过滤器的含义及作用
二:代码及注释
python
from vtkmodules.vtkCommonColor import vtkNamedColors
import vtkmodules.vtkRenderingOpenGL2
import vtkmodules.vtkInteractionStyle
from vtkmodules.vtkCommonDataModel import vtkMultiBlockDataSet
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkRenderingCore import vtkRenderer, vtkActor, vtkRenderWindow, vtkRenderWindowInteractor, \
vtkPolyDataMapper
from vtkmodules.vtkFiltersCore import vtkExtractEdges
from vtkmodules.vtkFiltersGeometry import vtkCompositeDataGeometryFilter
def main():
colors = vtkNamedColors()
leaf1 = vtkSphereSource()
leaf1.SetCenter(0, 0, 0)
leaf1.Update()
leaf2 = vtkSphereSource()
leaf2.SetCenter(1.75, 2.5, 0)
leaf2.SetRadius(1.5)
leaf2.Update()
leaf3 = vtkSphereSource()
leaf3.SetCenter(4, 0, 0)
leaf3.SetRadius(2)
leaf3.Update()
branch = vtkMultiBlockDataSet()
branch.SetBlock(0, leaf1.GetOutput())
branch.SetBlock(1, leaf2.GetOutput())
root = vtkMultiBlockDataSet()
root.SetBlock(0, branch)
root.SetBlock(1, leaf3.GetOutput())
"""
vtkExtractEdges 是一个非复合感知的过滤器
当它接收到一个 vtkMultiBlockDataSet 作为输入时,VTK 的管道机制会自动处理:
它会遍历 MBDS 中的每一个非空块(即 leaf1, leaf2, leaf3),
对每个块单独执行 vtkExtractEdges(提取球体表面的所有三角形边缘),
然后将结果组织回一个新的 vtkMultiBlockDataSet 中
"""
edges = vtkExtractEdges()
edges.SetInputData(root)
"""
vtkCompositeDataGeometryFilter
一种过滤器,专门用于复合数据集,vtk中有一种数据结构叫做Composite Data,例如vtkMultiBlockDataSet、vtkHierarchicalBoxDataSet等。这些数据集其实是容器,内部可能有多个数据块,内部可能有多个数据块(每个块可能是不同类型的数据,比如体数据、网格数据)。
该过滤器的作用就是是遍历这些复合数据集,把里面的数据逐一提取几何(geometry),最后合并成一个vtkPolyData输出
这是一个复合感知的过滤器。它的作用是遍历输入 MBDS(来自 edges 过滤器),将其中所有块的几何数据(在这里是边缘线段)聚合到一个单一的 vtkPolyData 对象中
"""
polydata = vtkCompositeDataGeometryFilter()
polydata.SetInputConnection(edges.GetOutputPort())
renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(0, polydata.GetOutputPort(0))
actor = vtkActor()
actor.GetProperty().SetColor(colors.GetColor3d('Yellow'))
actor.GetProperty().SetLineWidth(2)
actor.SetMapper(mapper)
# Enable user interface interactor.
renderer.AddActor(actor)
renderer.SetBackground(colors.GetColor3d('CornflowerBlue'))
renderWindow.SetWindowName('MultiBlockDataSet')
renderWindow.Render()
renderWindowInteractor.Start()
if __name__ == '__main__':
main()