Скрипт Paraview для экспорта позиции в файл CSV

У меня есть vtk файлы численного моделирования, которые я обычно визуализирую с помощью ParaView. И я хотел бы представить некоторые результаты в документе LaTeX. Для этого мне нравится использовать CSV файлы. Хорошо, что Paraview может экспортировать данные в CSV файлов. Поэтому я могу экспортировать полную временную последовательность переменной плотности в последовательность CSV файлов.

НО, я хотел бы, чтобы эта позиция была включена в эти файлы CSV.

Вот что я могу сделать сейчас:

#### import the simple module from the paraview
from paraview.simple import *
import os 
#### disable automatic camera reset on 'Show'
paraview.simple._DisableFirstRenderCameraReset()


### MY VARIABLES
Folder_output='E:\\My Documents\\VTKfiles'
FileNames_list=[os.path.join(Folder_output, f) for f in os.listdir(Folder_output) if os.path.isfile(os.path.join(Folder_output, f))]
nb_tStep=len(FileNames_list)
Arrays_out_list=[ 'Structured Coordinates:0', 'Structured Coordinates:1' ,' Structured Coordinates:2', 'density',]
CSV_File_Names='E:/My Documents/Results'


for t in range(0,nb_tStep):
    output_LBM_ = LegacyVTKReader(FileNames=FileNames_list[t] )

    ####
    PassArrays1 = PassArrays() 
    PassArrays1.PointDataArrays =  Arrays_out_list
    source = PassArrays1 
    writer = CreateWriter(CSV_File_Names+"{}.csv".format(t), source)
    writer.FieldAssociation = "Points" # or "Cells" 
    writer.UpdatePipeline() 
    del writer 

person R. N    schedule 08.05.2018    source источник
comment
Вы получили что-то с вашим текущим кодом? Я думаю, что он неполный, поскольку ваши данные хранятся внутри output_LBM_ и, похоже, не передаются в качестве источника вашему CSV-писателю.   -  person jcgiret    schedule 10.05.2018
comment
Да, я получаю файл CSV с переменной плотности. Операция PassArrays() получить информацию от ридера, если я правильно понимаю. Таким образом, он правильно передается в качестве источника для записи CSV.   -  person R. N    schedule 16.05.2018


Ответы (1)


Существует (как минимум) три варианта извлечения ваших точек и переменных из устаревшего файла VTK с использованием API Paraview и/или VTK.

Использование API Паравью

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. Это позволяет вам загружать данные координат и точек в массивы numpy и экспортировать их в конце в файл 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.

person jcgiret    schedule 10.05.2018
comment
Спасибо за эти три варианта. С вариантом 1 я получаю файл CSV с плотностью столбцов плюс некоторые другие переменные, которые мне не нужны, и без координат точек! В противном случае, используя ваши варианты 2 и 3, когда я вызываю coords = vtk_dataset_adapter.GetPoints(), я получаю сообщение об ошибке: AttributeError: 'vtkCommonDataModelPython.vtkImageData' object has no attribute 'GetPoints'. Возможно, это связано с тем, что мои файлы vtk используют структурированный набор данных. Есть ли способ изменить эти нежелательные эффекты (дополнительные переменные и отсутствие координат) для всех ваших решений? - person R. N; 16.05.2018
comment
Варианты 2 и 3 у меня отлично работают с небольшой модификацией: coords = np.zeros((vtk_dataset_adapter.GetNumberOfPoints(),3)) for i in range(vtk_dataset_adapter.GetNumberOfPoints()): coords[i,0], coords[i,1], coords[i,2] = vtk_dataset_adapter.GetPoint(i) - person R. N; 23.05.2018