2011-07-13 36 views
7

Tengo algunas VTK-archivos, que se ven así:¿Cómo puedo leer un archivo VTK en una estructura de datos de Python?

# 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 
[...] 

me gustaría tener dos listas de estas VTK-archivos: edgesList y verticesList:

  • edgesList debe contener los bordes as (FromVerticeIndex, ToVerticeIndex, Weight) -tuples
  • verticesList debe contener los vértices como (x, y, z) -tuples. El índice es el índice mencionado en edgesList

No tengo idea de cómo extraer esto con la biblioteca vtk-python estándar. Llegué tan lejos:

Es posible que mi código python-vtk no tenga sentido. Preferiría usar la biblioteca vtk y no usar ningún código autodirigido.

Aquí está mi código escrito por mí mismo. Funciona, pero sería mejor si pudiera utilizar la biblioteca para este 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) 

Respuesta

4

STLreader es adecuado para leer archivos STL. Si tiene un archivo .vtk y desea leer la información de la cuadrícula (nodos, elementos y sus coordenadas), debe utilizar otro lector (vtkXMLReader o vtkDataReader, ambos contienen soporte de cuadrícula estructurado y no estructurado). A continuación, utilice la función vtk_to_numpy del paquete VTK.

Un código de ejemplo se vería así:

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] 
Cuestiones relacionadas