Как я могу прочитать файл VTK в структуру данных Python?
у меня есть некоторые VTK-файлы, которые выглядят так:
# vtk DataFile Version 1.0
Line representation of vtk
ASCII
DATASET POLYDATA
POINTS 30 FLOAT
234 462 35
233 463 35
231 464 35
232 464 35
229 465 35
[...]
LINES 120 360
2 0 1
2 0 1
2 1 0
2 1 3
2 1 0
2 1 3
2 2 5
2 2 3
[...]
Я хотел бы получить два списка из этих VTK-файлов: edgesList и verticesList:
- edgesList должен содержать ребра как (FromVerticeIndex, ToVerticeIndex, Weight) - кортежи
- verticesList должен содержать вершины как (x,y,z)-кортежи. Индекс-это индекс, упомянутый в edgesList
Я понятия не имею, как извлечь это со стандартным-vtk-python библиотека. Я дошел до этого:
import sys, vtk
filename = "/home/graphs/g000231.vtk"
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
reader.Update()
idList = vtk.vtkIdList()
polyDataOutput = reader.GetOutput()
print polyDataOutput.GetPoints().GetData()
возможно, что мой python-vtk-код не имеет смысла. Я бы предпочел использовать библиотеку vtk и не использовать какие-либо самостоятельно написанные фрагменты кода.
вот мой собственноручно написанный фрагмент кода. Это работает, но было бы лучше, если бы я мог использовать библиотеку vtk для этого:
import re
def readVTKtoGraph(filename):
""" Specification of VTK-files:
http://www.vtk.org/VTK/img/file-formats.pdf - page 4 """
f = open(filename)
lines = f.readlines()
f.close()
verticeList = []
edgeList = []
lineNr = 0
pattern = re.compile('([d]+) ([d]+) ([d]+)')
while "POINTS" not in lines[lineNr]:
lineNr += 1
while "LINES" not in lines[lineNr]:
lineNr += 1
m = pattern.match(lines[lineNr])
if m != None:
x = float(m.group(1))
y = float(m.group(2))
z = float(m.group(3))
verticeList.append((x,y,z))
while lineNr < len(lines)-1:
lineNr += 1
m = pattern.match(lines[lineNr])
nrOfPoints = m.group(1)
vertice1 = int(m.group(2))
vertice2 = int(m.group(3))
gewicht = 1.0
edgeList.append((vertice1, vertice2, gewicht))
return (verticeList, edgeList)
2 ответов
Я не использую VTK с Python, но этот читатель должен уметь читать этот файл: http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/GenericDataObjectReader
и вот пример того, как использовать читателя VTK в Python: http://www.vtk.org/Wiki/VTK/Examples/Python/STLReader
STLreader подходит для чтения файлов STL. Если у вас есть .файл vtk и хотите прочитать информацию о сетке (узлы, элементы и их координаты), вы должны использовать другой считыватель (либо vtkXMLReader или vtkDataReader, оба содержат структурированную и неструктурированную поддержку сетки). Тогда используйте vtk_to_numpy функция из пакета VTK.
пример кода будет выглядеть так:
from vtk import *
from vtk.util.numpy_support import vtk_to_numpy
# load a vtk file as input
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName("my_input_data.vtk")
reader.Update()
#Grab a scalar from the vtk file
my_vtk_array = reader.GetOutput().GetPointData().GetArray("my_scalar_name")
#Get the coordinates of the nodes and the scalar values
nodes_nummpy_array = vtk_to_numpy(nodes_vtk_array)
my_numpy_array = vtk_to_numpy(my_vtk_array )
x,y,z= nodes_nummpy_array[:,0] ,
nodes_nummpy_array[:,1] ,
nodes_nummpy_array[:,2]