Существует (как минимум) три варианта получения ваших точек и переменных из устаревшего файла VTK с использованием API Paraview или / и VTK.
Использование API Paraview
from paraview.simple import *
cylindervtk = LegacyVTKReader(FileNames=['./cylinder.vtk'])
SaveData('./output.csv', proxy=cylindervtk)
и запустите его, используя pvpython
:
pvpython vtk_output_csv.py
Вы получите CSV-файл, похожий на этот:
"density","Points:0","Points:1","Points:2"
1.2,0.5,0.5,0
1.2,0.5,-0.5,0
1.2,0.40451,0.5,-0.29389
1.2,0.40451,-0.5,-0.29389
1.2,0.15451,0.5,-0.47553
1.2,0.15451,-0.5,-0.47553
1.2,-0.15451,0.5,-0.47553
1.2,-0.15451,-0.5,-0.47553
1.2,-0.40451,0.5,-0.29389
1.2,-0.40451,-0.5,-0.29389
1.2,-0.5,0.5,-6.1232e-17
...
, который вы могли бы использовать позже в скрипте (Python или как-то еще) для выполнения некоторых действий постобработки или построения графика.
Использование API Paraview и VTK
Хотя первый вариант очень лаконичен, вам необходимо записать свои данные на жесткий диск, и вам, возможно, придется перезагрузить их позже. Если вы хотите выполнить пост-обработку или зарисовку действий только в одном скрипте Python, то вы пишете временные данные на жестком диске бесплатно.
В следующем коде используется интеграция numpy с VTK . Это позволяет вам загружать ваши координаты и точечные данные в массивы и экспортировать их в конце в файл CSV (или куда угодно):
from paraview.simple import *
from vtk.numpy_interface import dataset_adapter as dsa
import numpy as np
#Paraview reader
pv_reader = LegacyVTKReader(FileNames=['./cylinder.vtk'])
#Fetch the reader data and store them locally into a VTK object
vtk_data = servermanager.Fetch(pv_reader)
#Wrap the vtk_data VTK object to get the coordinates and PointData as numpy arrays
vtk_dataset_adapter = dsa.WrapDataObject(vtk_data)
coords = vtk_dataset_adapter.GetPoints()
density = vtk_dataset_adapter.PointData['density']
data_export = np.column_stack((coords,density))
header = "X Y Z density"
np.savetxt("output2.csv", data_export, header = header)
Использование только VTK API
Последний очень похож на второй, но использует только VTK API:
import vtk
from vtk.numpy_interface import dataset_adapter as dsa
import numpy as np
#PolyDataReader must be modified depending on the type of the Legacy VTK input type
reader = vtk.vtkPolyDataReader()
reader.SetFileName("cylinder.vtk")
reader.ReadAllFieldsOn()
reader.Update()
vtk_data = reader.GetOutput()
vtk_dataset_adapter = dsa.WrapDataObject(vtk_data)
coords = vtk_dataset_adapter.GetPoints()
density = vtk_dataset_adapter.PointData['density']
data_export = np.column_stack((coords,density))
header = "X Y Z density"
np.savetxt("output3.csv", data_export, header = header)
Это решение может быть интересным, поскольку оно имеет только VTK в качестве зависимости, но также работает с pvpython
, поставляемым с Paraview, поскольку VTK является зависимостью от Paraview.