Сохранить массив данных из VTK в Python - PullRequest
0 голосов
/ 26 июня 2018

Вопрос :

Как мне извлечь массив набора данных из VTK в Python и сохранить его в новом файле? например для VTK с наборами данных для величин сила , смещение и ток только извлечение смещение и сохранение его в меньшем файле.

Задача

У меня есть сотни 4 ГБ файлов VTK на удаленном сервере, и я хочу извлечь один из нескольких наборов данных, которые генерируются для разных величин. В этих наборах данных у меня есть скаляры и векторы.

Я написал следующий код VTK Python, в котором я читаю неструктурированную сетку и получаю второй массив данных для последующего сохранения с помощью «vtkArrayWriter».

import vtk
Filename = 'file.vtk'
reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
reader.Update()
obj = reader.GetOutput().GetPointData().GetArray(1)
writer = vtk.vtkArrayWriter()
writer.SetInputData(obj)
writer.SetFileName('test.vtk')
writer.Update()

Код дает мне следующий вывод:

TypeError: SetInputData аргумент 1: метод требует vtkDataObject, a vtkFloatArray был предоставлен.

Мне не удалось привести «vtkFloatArray» к «vtkDataObject» или найти конкретный метод, который поддерживает «vtkFloatArray» в качестве входных данных. Я не нашел много связанных кодов, но, возможно, я погуглил не те ключевые слова В этот момент я застрял.

Примечание :

Это та же процедура, которую можно выполнить, применив фильтр «PassArays» в Paraview и затем сохранив его, но, учитывая размер и характеристики моей проблемы, это нереальное решение.

1 Ответ

0 голосов
/ 27 июня 2018

VTK имеет фильтр vtkPassArrays, документация которого здесь . Вам нужно знать имя массива, который вы хотите в выходном файле, и является ли этот массив данными Point / Cell / Field.

import vtk as v
Filename = 'file.vtk'
reader = v.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
pa = v.vtkPassArrays()
pa.SetInputConnection(reader.GetOutputPort())
pa.AddArray( 0, 'Array1Name' ) # 0 for PointData, 1 for CellData, 2 for FieldData
writer = v.vtkDataSetWriter()
writer.SetFileName('test.vtk')
writer.SetInputConnection(pa.GetOutputPort())
writer.Update()
writer.Write()

Выходной файл test.vtk будет содержать все точки и ячейки, но будет включено только указанное вами имя массива. Если вместо этого вам нужен только массив, а не точки или ячейки, возможно следующее решение с использованием VTK NumPy интеграции и numpy.savetxt .

import numpy as np
import vtk as v
from vtk.numpy_interface import dataset_adapter as dsa
reader = v.vtkUnstructuredGridReader()
reader.SetFileName(Filename)
reader.ReadAllScalarsOn()
reader.ReadAllVectorsOn()
reader.Update()
usg = dsa.WrapDataObject( reader.GetOutput() )
array1 = usg.PointData['Array1Name'] # Assuming you know the name of the array
# array1 is a child class type of numpy.ndarray type
np.savetxt('array1.dat', array1, fmt='%4.5f' )
...