首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中检索VTK文件中的面和点

在python中检索VTK文件中的面和点
EN

Stack Overflow用户
提问于 2018-07-06 09:26:17
回答 1查看 1.6K关注 0票数 6

我有一个包含3d模型的vtk文件,

我想提取点坐标和小平面。

下面是一个最小的工作示例:

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)

这是因为numpy_nodes包含所有点的x,y,z坐标,但我无法检索将此模型的面与相应点相关联的列表。

我试过了:

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

但是numpy_nodes只是一个一维数组,我希望是一个2D数组(大小为3*小平面的数量),其中第一个维度包含小平面的对应点的数量(就像在.ply文件中一样)。

欢迎任何关于如何继续进行的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-17 09:12:55

你就快到了。为了允许不同类型的单元格(三角形、四边形等),numpy数组使用以下方案对信息进行编码:

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), 
               ...
              ]

如果所有的i都是同一类型的,也就是说,对于所有的polys都是n_i==n,那么只需重塑一维数组的形状就可以得到一些可解释的东西:

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))

可以删除numpy_cells的第一列,因为它只包含每个单元格的点数。但是其余的列包含您要查找的信息。

要确定结果,请将输出与收集点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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51201888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档