将mayavi mlab.contour3d plot转换为vtkPolyData

时间:2016-05-09 08:43:49

标签: python vtk mayavi

我正试图从vtkPolyData情节中获取三角测量mlab.contour3d。我正在使用mayavi因为它似乎是让minimal surfaces正确三角化的最快方法。我需要它为vtkPolyData,因为我想将其保存为.stl文件。

这是我的代码的MWE:

import numpy as np
from mayavi import mlab

def fun(x, y, z):
    return np.cos(x) + np.cos(y) + np.cos(z)

x, y, z = np.mgrid[-1:1:100j, -1:1:100j, -1:1:100j]
contour = mlab.contour3d(x, y, z, fun)
mlab.show()

我从mayavi获得的是已经使用VTK(或tvtk)进行三角测量并显示的曲面,因此应该可以获得vtkPolyData从那里。但到目前为止我发现的唯一方法是使用mlab.savefig(test.obj)导出.obj文件(这很糟糕,因为每次mayavi UI打开时都需要时间来保存文件)并导入该文件再次使用vtkOBJReader,它为我提供了我想要的vtkPolyData

有谁知道更直接的方法吗?

编辑:为了更清楚地澄清我的问题:我可以从可视化中访问数据,例如使用mayavi.tools.pipeline.get_vtk_src(),但它以vtkImageData的形式出现。如果有人知道将其转换为vtkPolyData的方法,那也是一种解决方案。

1 个答案:

答案 0 :(得分:1)

完全巧合我找到了一个解决方案。

import numpy as np
from mayavi import mlab

def fun(x, y, z):
    return np.cos(x) + np.cos(y) + np.cos(z)

x, y, z = np.mgrid[-1:1:100j, -1:1:100j, -1:1:100j]
contour = mlab.contour3d(x, y, z, fun)
actor = contour.actor.actors[0]
polydata = tvtk.to_vtk(actor.mapper.input)  # solution
mlab.show()

诀窍似乎是从管道访问映射器,这是一个PolyDataMapper。然后我只使用tvtk.to_vtk()函数,这样我就可以继续使用vtk,而不是tvtk,至少暂时如此。