Retrieving facets and point from VTK file in python

落爺英雄遲暮 提交于 2021-02-07 14:31:31

问题


I have a vtk file containing a 3d model,

I would like to extract the point coordinates and the facets.

Here is a minimal working example:

import vtk
import numpy
from vtk.util.numpy_support import vtk_to_numpy

reader = vtk.vtkPolyDataReader()
reader.SetFileName('test.vtk')
reader.Update()

polydata = reader.GetOutput()

points = polydata.GetPoints()
array = points.GetData()
numpy_nodes = vtk_to_numpy(array)

This works as numpy_nodescontains the x,y,z coordinates of all points, but I am at loss to retrieve the list that relates the facets of this model to the corresponding points.

I tried:

facets= polydata.GetPolys()
array = facets.GetData()
numpy_nodes = vtk_to_numpy(array)

But then numpy_nodes is just a 1D array where I would expect a 2D array (size 3*number of facets) where the first dimension contains the number of the corresponding points to the facet (as in a .ply file).

Any advise on how to proceed would be welcome


回答1:


You were almost there. To allow cells of different types (triangles, quads, etc.), the numpy array encodes the information with the following scheme:

numpyArray = [ n_0, id_0(0), id_0(1), ..., id_0(n0-1), 
               n_1, id_1(0), id_1(1), ..., id_1(n1-1), 
               ... 
               n_i, id_i(0), id_i(1), ..., id_1(n1-1), 
               ...
              ]

If all polys are of the same kind, that is n_i==n for all i, simply reshape the 1D array to get something interpretable:

cells = polydata.GetPolys()
nCells = cells.GetNumberOfCells()
array = cells.GetData()
# This holds true if all polys are of the same kind, e.g. triangles.
assert(array.GetNumberOfValues()%nCells==0)
nCols = array.GetNumberOfValues()//nCells
numpy_cells = vtk_to_numpy(array)
numpy_cells = numpy_cells.reshape((-1,nCols))

The first column of numpy_cells can be dropped, because it contains just the number of points per cell. But the remaining columns contain the information you were looking for.

To be sure about the result, compare the output with the "traditional" way to collect the point ids:

def getCellIds(polydata):
    cells = polydata.GetPolys()
    ids = []
    idList = vtk.vtkIdList()
    cells.InitTraversal()
    while cells.GetNextCell(idList):
        for i in range(0, idList.GetNumberOfIds()):
            pId = idList.GetId(i)
            ids.append(pId)
    ids = np.array(ids)
    return ids

numpy_cells2 = getCellIds(polydata).reshape((-1,3))

print(numpy_cells[:10,1:])
print(numpy_cells2[:10])
assert(np.array_equal(numpy_cells[:,1:], numpy_cells2))


来源:https://stackoverflow.com/questions/51201888/retrieving-facets-and-point-from-vtk-file-in-python

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!