vtk文件格式,自定义写入文件

 

       

vtk文件格式,自定义写入文件

 可以看到主要的写文件类都继承自vtkWriter,vtkWriter中有一个虚函数,和一个纯虚函数:

public:virtual void Write();        protected: virtual void WriteData()=0;

Write函数中调用了WriteData函数,所以子类并没有去重写Write函数,而是重写了WriteData函数

vtkDataWriter类提供了写入数据的一些函数,由于不同类型的对象描述信息不相同,更具体的实现则在vtkDataWriter的子类中实现。vtkDataWriter类并没有WriteData函数的具体实现,vtkDataWriter不能直接用于写入文件。

 

vtk文件格式详细说明:https://lorensen.github.io/VTKExamples/site/VTKFileFormats/ 

格式例图:

 

vtk文件格式,自定义写入文件

       如图所示,前三行是头信息,由具体的writer类(vtkPolyDataWriter、vtkDataSetWriter......)的WriteData函数调用WriteHeader函数写入。头信息之后有一行是用于说明文件存储的是什么类型的vtk对象,如果缺失或为无效值paraview会打不开,在WriteData函数内直接写入文件流。之后是坐标点的数据POINTS,由WriteData内调用WritePoints函数写入。cell的数据,由WriteData函数调用WriteCells函数写入。之后是坐标点的附加数据POINT_DATA,由WriteData函数调用WritePointData函数写入。在之后是cell的附加数据CELL_DATA,与POINT_DATA类似。

      现在碰到一个问题,直接调用Write函数写入的话得到的文件POINT_DATA部分的数据,不管是scalar类型还是vector类型的数据都只会存入已经设置到vtkPointData中的那一个vtkDataArray。而我希望存入多个scalar数据。

     拓展:现有一个new好的vtkPolyData* pd;pd->GetPointData()->AddArray(vtkDataArray* dataArray)函数可以将vtkDataArray* 数据添加到点数据中。vtkDataArray 对象可以设置数据名称,pd->GetPointData()->GetArray(char* arrayName)则可以将已添加的数组取出。取出的数组可用于设置scalar,pd->GetPointData()->SetScalars(vtkDataArray* dataArray)。

     我想将point data中添加的所有array都存储到文件中最为scalar数据。直接使用Write函数是不行的,而多次手动调用WritePointData函数也不行,因为WritePointData函数会写入"POINT_DATA  XX" 这一行信息文件中只允许存在一次。实际上WritePointData函数是写入"POINT_DATA  XX"之后,再调用vtkDataWriter类的受保护的成员函数WriteScalarData函数将scalar数据写入的。实在理不清了的话,打开vtk安装目录下src/IO/legacy 里面是源码。

     可以参照源码,自定义类继承自vtkDataWriter,将WriteScalarData等函数再包装一遍进行使用。