Как я могу прочитать файл 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-файлов два списка: edgeList и verticesList:

  • edgeList должен содержать ребра в виде кортежей (FromVerticeIndex, ToVerticeIndex, Weight).
  • verticesList должен содержать вершины в виде (x,y,z)-кортежей. Индекс — это индекс, упомянутый в edgeList.

Я понятия не имею, как извлечь это с помощью стандартной библиотеки 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)

person Martin Thoma    schedule 13.07.2011    source источник


Ответы (2)


Я не использую VTK с Python, но этот ридер должен иметь возможность читать этот файл: http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/GenericDataObjectReader

а вот пример использования VTK-ридера в Python: http://www.vtk.org/Wiki/VTK/Examples/Python/STLReader

person David Doria    schedule 12.12.2011

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]
person SAAD    schedule 04.05.2014