Как преобразовать устаревшие файлы vtk в формат vtu

Я хочу преобразовать устаревшие файлы .vtk в двоичные файлы, предпочтительно файлы .vtu, потому что я использую неструктурированную сетку. Для этого я адаптировал ConvertFile-Example из http://www.vtk.org/Wiki/VTK/Examples/Cxx/IO/ConvertFile

#include <string>
#include <vtkSmartPointer.h>
#include <vtkGenericDataObjectReader.h>
#include <vtkVersion.h>
#include <vtkXMLUnstructuredGridWriter.h>
#include <vtkUnstructuredGrid.h>

int main(int argc, char *argv[])
{
  if(argc < 3)
    {
    std::cerr << "Required arguments: input.vtk output.vtu" << std::endl;
    return EXIT_FAILURE;
    }

  std::string inputFileName = argv[1];
  std::string outputFileName = argv[2];

  vtkSmartPointer<vtkGenericDataObjectReader> reader = vtkSmartPointer<vtkGenericDataObjectReader>::New();
  reader->SetFileName(inputFileName.c_str());
  reader->Update();

  vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer = vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
  writer->SetFileName(outputFileName.c_str());
  writer->SetInputConnection(reader->GetOutputPort());
  writer->Update();

  return EXIT_SUCCESS;
}

Но когда я использую это для преобразования моего устаревшего файла, я теряю все данные ячейки после первого набора. В этом минимальном примере моего устаревшего файла Scal_1 находится в файле .vtu, а Scal_2 — нет.

# vtk DataFile Version 3.1
Lattice Boltzmann data
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 9 INT 
0 0 0 1 0 0 2 0 0 
0 1 0 1 1 0 2 1 0 
0 2 0 1 2 0 2 2 0 

CELLS 4 20
4 0 1 3 4 
4 1 2 4 5 
4 3 4 6 7 
4 4 5 7 8 

CELL_TYPES 4
8 8 8 8 

CELL_DATA 4
SCALARS Scal_1 DOUBLE
LOOKUP_TABLE default
1 2 1 0 

SCALARS Scal_2 DOUBLE
LOOKUP_TABLE default
1 3 2 1

Я все еще новичок в vtk. Должен ли я использовать другой ридер или писатель? Или что-то совсем не так?


person phirus    schedule 02.10.2014    source источник


Ответы (2)


Проблема здесь в том, что выбранный вами читатель сбивается с толку из-за того, что входной файл содержит 2 массива данных ячеек, оба помечены как скаляры. Таким образом, при этом считыватель выводит только один массив данных ячеек. Я предлагаю использовать ParaView, в частности исполняемый файл pvpython, для преобразования файлов. Соответствующий код Python будет выглядеть примерно так:

from paraview.simple import *
r = LegacyVTKReader( FileNames=['input.vtk'] )
w = XMLUnstructuredGridWriter()
w.FileName = 'output.vtu'
w.UpdatePipeline()
person andybauer    schedule 03.10.2014

Вы можете просто использовать meshio (мой проект). Установить с помощью

pip3 install meshio

и беги

meshio-convert in.vtk out.vtu
person Nico Schlömer    schedule 08.03.2019