将 mayavi mlab.contour3d 图转换为 vtkPolyData
Convert mayavi mlab.contour3d plot to vtkPolyData
我正在尝试从 mlab.contour3d
图中获取三角剖分 vtkPolyData
。我正在使用 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
的方法,那也是一个解决方案。
巧合的是我找到了解决办法。
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
,至少现在是这样。
我正在尝试从 mlab.contour3d
图中获取三角剖分 vtkPolyData
。我正在使用 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
的方法,那也是一个解决方案。
巧合的是我找到了解决办法。
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
,至少现在是这样。