[英]Retrieving facets and point from VTK file in python
我有一個包含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
只是一個一維數組,我期望一個二維數組(大小為3 *小平面的數量),其中第一個維度包含facet對應點的數量(如.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),
...
]
如果所有多邊形都是同一類型,對於所有i
來說都是n_i==n
,只需重新整形1D數組以獲得可解釋的內容:
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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.