2012-07-30 12 views
13

Otrzymałem plik vtk w formacie legacy (uważam, że jest to sieć niestrukturalna) i chciałbym go przeczytać w pythonie i wypisać zamiast niego plik .npy, ponieważ wiem jak sobie z tym poradzić.Czytanie pliku .vtk z pytonem

Plik jest zrzutem z ATHENY, podobnie jak gęstość, prędkość, pole magnetyczne wraz ze współrzędnymi.

Jestem bardzo programista proceduralny, więc wszystkie te obiekty są mylące ...

+3

mógłbyś umieścić próbkę danych plik ten jest? –

+0

Jest [PyEVTK] (https://bitbucket.org/pauloh/pyevtk) do pisania, ale nie obsługuje czytania – jterrace

+0

Oh, z linku jterrace widzę, że jest to format binarny. Bleh. –

Odpowiedz

4

Czy próbowałeś za pomocą ParaView? (http://www.paraview.org/) To daje wizualne wyobrażenie o tym, co dzieje się za kulisami i może wysyłać plik na wiele różnych sposobów. Sugerowałbym to, ponieważ nie mam pojęcia, jakie są twoje dane. http://www.vtk.org/Wiki/VTK/Examples/Python może również mieć przykład, który może pasować do rachunku za Ciebie. Osobiście będę grał z paraview i od tego miejsca.

+1

Używałem wcześniej paraweli, a raczej dodałem do niej opcję ODWIEDŹ. Muszę jednak przeanalizować zawartość pliku i zrobić takie rzeczy jak fft itp., Więc samo wizualizowanie nie wystarczy. –

4

Oto skrypt, który odczytuje dane wielokąta na tablicach numpy z pliku VTK używając VTK Pythona SDK:

import sys 

import numpy 
import vtk 

reader = vtk.vtkPolyDataReader() 
reader.SetFileName(sys.argv[1]) 
reader.Update() 

polydata = reader.GetOutput() 

for i in range(polydata.GetNumberOfCells()): 
    pts = polydata.GetCell(i).GetPoints()  
    np_pts = numpy.array([pts.GetPoint(i) for i in range(pts.GetNumberOfPoints())]) 
    print np_pts 
+0

Byłem w stanie dostać się do etapu GetOutput() przy użyciu vtkDataSetReader() zamiast vtkPolyDataReader, ale nadal jestem zdezorientowany, jak uzyskać informacje. GetNumberOfPoints i GetNumberOfCells wydają mi się sensowne liczby na temat tego, jak duże są te tablice, ale nadal nie wiem, jak wyciągnąć wszystkie zmienne. Czy istnieje sposób na uzyskanie informacji o tym, co dokładnie ma w nim vtk iw jakiej formie? W zrozumiały sposób? –

+0

Jeśli wybierzesz jeden z plików tutaj http://people.sc.fsu.edu/~jburkardt/data/vtk/vtk.html, mogę spróbować pomóc wyodrębnić format. Jest tak wiele różnych formatów. – jterrace

+0

reader.IsFileStructuredPoints() zwraca 1, pozostałe opcje zwracają 0, więc wychodzę z kończyny i wypowiadam jej starszy vtk z Structured Points. –

13

Oto rozwiązanie, które wymyśliłem, sztuką było włączenie ReadAllVectorsOn().

import numpy 
from vtk import vtkStructuredPointsReader 
from vtk.util import numpy_support as VN 

reader = vtkStructuredPointsReader() 
reader.SetFileName(filename) 
reader.ReadAllVectorsOn() 
reader.ReadAllScalarsOn() 
reader.Update() 

data = reader.GetOutput() 

dim = data.GetDimensions() 
vec = list(dim) 
vec = [i-1 for i in dim] 
vec.append(3) 

u = VN.vtk_to_numpy(data.GetCellData().GetArray('velocity')) 
b = VN.vtk_to_numpy(data.GetCellData().GetArray('cell_centered_B')) 

u = u.reshape(vec,order='F') 
b = b.reshape(vec,order='F') 

x = zeros(data.GetNumberOfPoints()) 
y = zeros(data.GetNumberOfPoints()) 
z = zeros(data.GetNumberOfPoints()) 

for i in range(data.GetNumberOfPoints()): 
     x[i],y[i],z[i] = data.GetPoint(i) 

x = x.reshape(dim,order='F') 
y = y.reshape(dim,order='F') 
z = z.reshape(dim,order='F') 
4

Należy wspomnieć, że w swoim najnowszym wydaniu, projekt yt http://yt-project.org/ zawiera wsparcie dla ATHENA, co oznacza, że ​​przez cały ten oznacza to droga do analizy danych symulacyjnych przy użyciu Pythona.

2

meshio (projekt kopalni) zna formatu VTK, więc można po prostu

pip install meshio 

a następnie

import meshio 
points, cells, point_data, cell_data, field_data = meshio.read('file.vtk')