Some grids make vtkXMLUnstructuredGridWriter write VTU files which vtkXMLUnstructuredGridReader can't read
We found an issue with some vtkUnstructuredGrid
being written by vtkXMLUnstructuredGridWriter
and read back in vtkXMLUnstructuredGridReader
when the vtkCellArray
or vtkPoints
of the grid are null. In our case this happened when a filter stopped before the output was processed at all due to some precondition.
Consider the following code:
const std::string fileName = "C:\\Users\\bengt\\Desktop\\test_ugrid.vtu";
// This makes cells and points in ug get initialized to null
vtkNew<vtkUnstructuredGrid> ug;
ug->Initialize();
// Write to file
vtkNew<vtkXMLUnstructuredGridWriter> ugWriter;
ugWriter->SetInputData(ug);
ugWriter->SetFileName(fileName.c_str());
ugWriter->Write();
// Attempt to read it back from file
vtkNew<vtkXMLUnstructuredGridReader> ugReader;
ugReader->SetFileName(fileName.c_str());
ugReader->Update(); // Error
vtkUnstructuredGrid* output = ugReader->GetOutput();
The result is a VTU file where the <Points>
and <Cells>
elements do not have <DataArray>
children. However, unlike vtkXMLPolyDataReader
, vtkXMLUnstructuredGridReader
always expects those. For the points this is only shown as an error ("No Points element available in first piece found in file. Reading file may fail.") and reading is continued but for cells this is an unrecoverable error ("A piece is missing its Cells element.").
Are vtkUnstructuredGrid
with null points or cells a valid inputs which should be written properly? Furthermore, are VTU files with no <Points>
and <Cells>
data array child elements valid files?
We have an internal fork where we fixed the reader to work with those elements missing but we aren't sure what the proper behavior is supposed to be. Optimally, as our files are out in the wild already, the child elements should be optional and the reader should account for that if the number of cells or points is 0.