使用Python从vtk文件中的数据绘制等高线

2024-07-03 08:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组数据存储在一个VTK文件中,它表示一个域的一个切入点,数组中有标量点数据。我试图产生一个等高线图所说的标量,使它看起来有点像附加的图片使用ParaView。我宁愿使用vtk库而不是使用Matplotlib之类的东西,因为我认为它们可以产生更好的可视化效果。在

我在网上看了几个例子,但没有一个对我有用(不会抛出错误,我最后得到的只是一个只有背景的空渲染),我所能做的只是一个数据的表面图(例如:here)。在

以下是我当前版本的代码(与成功生成曲面图的代码非常相似):

# import data
reader = vtk.vtkdatasetReader()
reader.SetFileName('inputDataFiles/k_zCut.vtk')
reader.ReadAllVectorsOn()
reader.ReadAllScalarsOn()
reader.Update()

# access data
data = reader.GetOutput()
d = data.GetPointData()
array=d.GetArray('k')

# create the filter
contours = vtk.vtkContourFilter()
contours.SetInput(reader.GetOutput())
contours.GenerateValues(5,1.,5.)

# create the mapper
mapper = vtk.vtkPolyDataMapper()
mapper.SetInput(contours.GetOutput())
mapper.ScalarVisibilityOff()
mapper.SetScalarRange(1., 5.)

# create the actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)

# create a rendering window and renderer
ren = vtk.vtkRenderer()
ren.SetBackground( 0.329412, 0.34902, 0.427451 ) #Paraview blue

# Assign actor to the renderer
ren.AddActor(actor)

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
renWin.SetSize(750, 750)

# create a renderwindowinteractor
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# render
renWin.Render()

# screenshot
w2if = vtk.vtkWindowToImageFilter()
w2if.SetInput(renWin)
w2if.Update()
w2if.SetMagnification(5.)

writer = vtk.vtkPNGWriter()
writer.SetFileName("screenshot.png")
writer.SetInput(w2if.GetOutput())
writer.Write()

# Enable user interface interactor
iren.Initialize()
iren.Start()

下面你可以看到我输入文件的一个简短部分。任何帮助都将不胜感激。在

^{pr2}$

Tags: thedatacreatereaderwriteractormappervtk
1条回答
网友
1楼 · 发布于 2024-07-03 08:19:45

如果您想使用一个更“pythonic”的VTK接口,consider using ^{}/^{}/^{}。(不管怎样,VTK都是一个很好的选择!)在

tvtk是一个稍微有点python的、低级的python绑定到VTK,它有一些非常好的特性(例如numpy数组的透明使用)。在

Mayavi和mlab为VTK提供了一个更高级的接口。在

您显示的数据文件片段按原样无效,但如果我们使用类似的片段:

# vtk DataFile Version 2.0
Simple VTK file example
ASCII

DATASET POLYDATA
POINTS 9 float
3.0 0.0 0.0
1.0 1.0 0.0
0.0 3.0 0.0
3.0 0.0 1.0
1.0 1.0 1.0
0.0 3.0 1.0
3.0 2.0 2.0
2.0 2.0 2.0
2.0 3.0 2.0

TRIANGLE_STRIPS 2 14
6 0 3 1 4 2 5
6 3 6 4 7 5 8

POINT_DATA 9
SCALARS nodal float
LOOKUP_TABLE default
0.0 0.1 0.0 0.3 0.6 0.3 0.8 1.0 0.8

在曲面上渲染轮廓可以很简单:

^{pr2}$

enter image description here

或者我们可以更花哨一点:

from mayavi import mlab

# Make a figure with a black background
fig = mlab.figure(bgcolor=(0,0,0))
# Also see methods like: fig.scene.z_plus_view(), etc
fig.scene.camera.azimuth(215)

source = mlab.pipeline.open('test.vtk')
# Show the surface, colored by the scalars
surf = mlab.pipeline.surface(source)
# Draw contours of the scalars on the surface
lines = mlab.pipeline.contour_surface(source)

mlab.show()

enter image description here

相关问题 更多 >