python - 从python中的VTK文件中检索构面和点
问题描述
我有一个包含 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
只是一个 1D 数组,我期望一个 2D 数组(大小 3* 面数),其中第一个维度包含面的对应点的数量(如 .ply 文件中)。
欢迎任何有关如何进行的建议
解决方案
你快到了。为了允许不同类型的单元格(三角形、四边形等),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),
...
]
如果所有 polys 都是同一种类型,即n_i==n
all i
,只需重塑一维数组以获得可解释的东西:
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
可以删除,因为它只包含每个单元格的点数。但其余列包含您正在寻找的信息。
为了确定结果,将输出与收集点 id 的“传统”方式进行比较:
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))
推荐阅读
- python - 如何在 django 中通过信号清除表格?
- git - 根据源分支部署到不同的环境
- javascript - 使用自定义 useFetch 钩子 (React.js) 发送 POST 请求并接收响应
- windows - 使用powershell远程删除windows.old
- flutter - Vscode:在调试模式下同时使用 2 个 vs-code 实例
- javascript - 如何打印整个页面的滚动选项卡内容?
- java - 尝试使用 Spring Boot 中的 Swagger 在导航器中更改标题
- android - 如何向具有 ArrayList 属性的数据添加新项目?
- java - 如何更改 java.system.class.loader 属性?
- r - 创建一个新列,显示前一组中的一个在 r 中被污染