具有连接信息的 VTK 着色管过滤器

VTK coloring tube filter with connectivity information

我有一个分子,我想用连接它们的球体和管子来表示。我想根据连接信息给管子上色。这意味着我有各种断开连接的区域或断开连接的组件,我想对每个区域进行不同的着色。到目前为止,我在 python 中有这个并且它有效。我已经评论了我为实现这一目标所做的努力。变量 data 是一个 PolyData 数组,其中包含具有连接信息的点、标量和单元格。

tube = vtk.vtkTubeFilter()
tube.SetInput(data)
tube.SetNumberOfSides(5);
#tube.SetVaryRadiusToVaryRadiusByAbsoluteScalar()
tube.SetVaryRadiusToVaryRadiusOff()
tube.SetRadius(0.1)

"""appendFilter = vtk.vtkAppendPolyData()
appendFilter.AddInputConnection(tube.GetOutputPort())
appendFilter.Update()

connectivityFilter = vtk.vtkPolyDataConnectivityFilter()
connectivityFilter.SetInputConnection(appendFilter.GetOutput())
connectivityFilter.ScalarConnectivityOn()
connectivityFilter.FullScalarConnectivityOn()
connectivityFilter.SetExtractionModeToAllRegions()
connectivityFilter.ColorRegionsOn()
connectivityFilter.Update()
"""
#print (connectivityFilter.GetNumberOfExtractedRegions())

tubeMapper = vtk.vtkPolyDataMapper()
tubeMapper.SetInputConnection(tube.GetOutputPort())
tubeMapper.Update()

这是目前的样子

我确实有一些东西在工作,但我不确定连接定义是否有问题。我只是忘记了 getOutputPort 中的 "port" 这个词。无论如何,这就是答案(我省略了原子和管半径以及其他不相关的选项)

tube = vtk.vtkTubeFilter()
tube.SetInput(data)
tube.SetVaryRadiusToVaryRadiusOff()
tube.SetRadius(tuberad)

appendFilter = vtk.vtkAppendPolyData()
appendFilter.AddInputConnection(tube.GetOutputPort())
appendFilter.Update()

connectivityFilter = vtk.vtkPolyDataConnectivityFilter()
connectivityFilter.SetInputConnection(appendFilter.GetOutputPort())
connectivityFilter.SetExtractionModeToAllRegions()
connectivityFilter.ColorRegionsOn()
connectivityFilter.Update()

tubeMapper = vtk.vtkPolyDataMapper()
tubeMapper.SetInputConnection(connectivityFilter.GetOutputPort())
tubeMapper.SetScalarRange(connectivityFilter.GetOutput().GetPointData().GetArray("RegionId").GetRange())
tubeMapper.Update()

它最终看起来不错,但您可能会注意到一些明显连接的组件仍然有不同的颜色,我仍然想知道为什么。