可以用vtk InsertValue获取浮点参数吗?

时间:2015-01-30 17:30:34

标签: python vtk

我对InsertValue

有疑问

如果我理解它只需要整数争论。我想知道是否有办法让它取浮动值?或者可能还有其他一些函数可以完成InsertValue的工作但是需要浮点值?我知道有InsertNextValue,但我不确定它在我的情况下是否有效,因为我的数组是一个非常大的数组(~100000乘120)

下面是我的代码,在我的代码中,我正在使fl值整数的条目使其现在正常工作,但理想情况下,如果我不必这样做,它会很棒。

提前致谢:)

 import vtk
 import math
 from vtk import vtkStructuredGrid, vtkPoints, vtkFloatArray, vtkXMLStructuredGridWriter
 import scipy.io
 import numpy
 import os

 #loading the matlab files
 mats = scipy.io.loadmat('/home/lusine/data/3DDA/donut_for_vtk/20130228_050000_3D_E=1.mat')

#x,y,z coordinate, fl flux values
xx = mats['xvect']
yy = mats['yvect']
zz = mats['zvect']
fl = mats['fluxmesh3d'] #3d matrix

nx = xx.shape[1]
ny = yy.shape[1]
nz = zz.shape[1]

fl = numpy.nan_to_num(fl)
inx = numpy.nonzero(fl)
l = len(inx[1])

grid = vtk.vtkStructuredGrid() 
grid.SetDimensions(nx,ny,nz) # sets the dimensions of the grid 
pts = vtk.vtkPoints() # represents 3D points, The data model for vtkPoints is an array of vx-vy-vz triplets accessible by (point or cell) id.
pts.SetNumberOfPoints(nx*ny*nz) # Specify the number of points for this object to hold.

p=0
for i in range(l):
      pts.InsertPoint(p, xx[0][inx[0][i]], yy[0][inx[1][i]], zz[0][inx[2][i]])
      p = p + 1 

SetPoint()
grid.SetPoints(pts)

cdata = vtk.vtkFloatArray()
cdata.SetNumberOfComponents(1)

cdata.SetNumberOfTuples((nx-1)*(ny-1)*(nz-1))
cdata.SetName('cellData')

p=0
for i in range(l-1):
    cdata.InsertValue(p,inx[0][i]+inx[1][i]+inx[2][i])
p = p+1


grid.GetCellData().SetScalars(cdata)


pdata = vtk.vtkFloatArray()
pdata.SetNumberOfComponents(1)
#Get the number of tuples (a component group) in the array
pdata.SetNumberOfTuples(nx*ny*nz)
#Sets the array name
pdata.SetName('pointData')

for i in range(l):
      pdata.InsertValue(int(fl[inx[0][i]][inx[1][i]][inx[2][i]]), inx[0][i]+inx[1][i]+inx[2][i])


grid.GetPointData().SetScalars(pdata)
writer = vtk.vtkXMLStructuredGridWriter()
writer.SetFileName('new_grid.vts')
#writer.SetInput(grid)
writer.SetInputData(grid)
writer.Update()
print 'end' 

1 个答案:

答案 0 :(得分:0)

InsertValue的第一个参数需要一个整数,因为它是要插入值的索引。如果你有一个名为p的numpy数组而不是vtkFloatArray pdata,那么这将等同于你的指令:

pdata.InsertValue(a,b)  becomes p[a]=b

p [0.1]没有意义,它必须是一个整数!

但我对数据有点迷失。你的数组是什么意思(~100000乘120)..你有100.000分,每个点有120个分量的向量吗?在这种情况下,您的pdata应该有120个组件,并为每个点point_index调用

pdata.SetTuple[point_index,[v0,v1...,v119]

pdata.SetComponent[point_index,0,v0]
...
pdata.SetComponent[point_index,119,v119]

如果没有,你确定你必须根据fl值访问pdata(你必须确保fl是int,0< = fl< ntuples,并且你不会有漏洞)。检查你是否可以做与cdata相同的事情(你的代码中的btw总是等于i,你可以只用i)

也可以将numpy数组直接复制到vtk,参见http://vtk.1045678.n5.nabble.com/vtk-to-numpy-how-to-get-a-vtk-array-tp1244891p1244895.html,但你必须非常小心数据的结构