在工作中常常会遇到需要将流体计算的结果用颜色映射表示的时候。
一般在计算时会将结果存成vtkPointData,于是我们要做的就是取出vtkPointData的数组将其映射出来。
我们需要用到vtkMapper里的这个函数:
SelectColorArray()
当 ScalarMode 设置为 UsePointFieldData 或 UseCellFieldData 时,您可以使用这些方法指定要用于着色的数组。查找表将决定如何将矢量转换为颜色。
完整代码如下:
import vtkmodules.all as vtk
def ReadUnstructuredGrid():
colors = vtk.vtkNamedColors()
filename = "Calculate.vtk"
# 创建自定义lut。lut用于映射器和标量条
lut = vtk.vtkLookupTable()
lut.Build()
reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(filename)
reader.Update()
output = reader.GetOutput()
scalar_range = output.GetScalarRange()
polydata = reader.GetOutput()
# print(polydata.GetNumberOfPoints())
# for i in range(polydata.GetPointData().GetNumberOfArrays()):
# print(polydata.GetPointData().GetArrayName(i))
# print(polydata.GetPointData().GetArray(i))
newAarry = polydata.GetPointData().GetArray(2)
dataRange = newAarry.GetRange()
# lut.SetHueRange(dataRange)
print(dataRange)
mapper = vtk.vtkDataSetMapper()
mapper.SetInputData(output)
mapper.SetScalarRange(dataRange)
mapper.SetLookupTable(lut)
mapper.SetScalarModeToUsePointFieldData()
mapper.SelectColorArray(2)
# mapper.ScalarVisibilityOff()
actor = vtk.vtkActor()
actor.SetMapper(mapper)
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
# 根据可见演员自动设置相机。
# 摄像机将重新定位自己以查看演员的中心点,并沿其初始视图平面法线(即,从摄像机位置到焦点定义的矢量)移动,以便可以看到所有演员。
renderer.GetActiveCamera().Pitch(60)
renderer.GetActiveCamera().SetViewUp(0, 0, 1)
renderer.ResetCamera()
renderer.SetBackground(colors.GetColor3d('White'))
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer)
renWin.SetSize(640, 480)
renWin.SetWindowName('ReadUnstructuredGrid')
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(renWin)
# create the scalar_bar
scalar_bar = vtk.vtkScalarBarActor()
scalar_bar.SetOrientationToHorizontal()
scalar_bar.SetLookupTable(mapper.GetLookupTable())
# scalar_bar.SetHeight()
# create the scalar_bar_widget
scalar_bar_widget = vtk.vtkScalarBarWidget()
scalar_bar_widget.SetInteractor(interactor)
scalar_bar_widget.SetScalarBarActor(scalar_bar)
scalar_bar_widget.On()
renWin.Render()
imagefilter = vtk.vtkWindowToImageFilter()
imagefilter.SetInput(renWin)
writer = vtk.vtkPNGWriter()
writer.SetInputConnection(imagefilter.GetOutputPort())
writer.SetFileName("b.png")
writer.Write()
interactor.Initialize()
interactor.Start()
if __name__ == '__main__':
ReadUnstructuredGrid()
这里我选择了下标为2的数组。