2014-09-12 81 views
1

我想从tvtk.PolyData实例中提取顶点数据。例如:如何从tvtk PolyData实例中提取顶点数据?

from numpy import array 
from tvtk.api import tvtk 
from mayavi.sources.vtk_data_source import VTKDataSource 
from mayavi.modules.surface import Surface 
from mayavi import mlab 

pointArr=array([[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,1,1],[1,1,1]],dtype="float64") 
faceArr=array([[0,1,2,3],[2,3,4,5]]) 
faces = tvtk.PolyData() 
faces.points=pointArr 
print faces.points 
faces.polys=faceArr 
faces.point_data.scalars = pointArr[:,2] 
faces.point_data.scalars.name = 'Height' 
src = VTKDataSource(data = faces) 
mlab.pipeline.surface(src, opacity=1.) 
mlab.show() 

这将打印

vtkPoints (0x9811398) 
    Debug: Off 
    Modified Time: 838816 
    Reference Count: 2 
    Registered Events: 
    Registered Observers: 
     vtkObserver (0x98112b8) 
     Event: 33 
     EventName: ModifiedEvent 
     Command: 0x9811688 
     Priority: 0 
     Tag: 1 
    Data: 0x9811480 
    Data Array Name: Points 
    Number Of Points: 6 
    Bounds: 
    Xmin,Xmax: (0, 1) 
    Ymin,Ymax: (0, 1) 
    Zmin,Zmax: (0, 1) 

这到底是怎么回事?我期望看到的NumPy的数组:

[[ 0. 0. 0.] 
[ 1. 0. 0.] 
[ 1. 1. 0.] 
[ 0. 1. 0.] 
[ 0. 1. 1.] 
[ 1. 1. 1.]] 

回答

2

TVTK整点是处理蟒对象(包括numpy的阵列)和VTK物体保持类之间的转换。如果调查faces.points,你会看到它实际上是一个TVTK类实例调用点,但你可以很容易地回到使用

np.array(faces.points) 

不同的看法不应该复制内存numpy的表现,所以这一切都是相当高效。

编辑:自然tvtk还提供了一个基于事件的API和图形编辑元素

+0

你有任何问题的可视化? – mdurant 2014-09-12 14:28:37

+0

谢谢,这解决了我的问题!我不知道一个对象在Python中可能有不同的视图。 Python如何知道如何将Points对象转换为NumPy数组? – 2014-09-13 07:04:46

+0

numpy查找缓冲区或内存视图接口,或者可以处理任何可迭代的数据类型。 – mdurant 2014-09-13 16:30:55