如何在一个.vtu文件中编写多个vtkUnstructuredGrid

时间:2017-11-17 10:58:52

标签: vtk

我想在一个.vtu文件中编写多个非结构化网格。

我在下面尝试过。 MakeHexagonalPrism()和MakeHexahedron()返回vtkSmartPointer类型。 结果是输出文件中只有一个非结构化网格。

  vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
    vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
  writer->SetFileName(filename.c_str());
  writer->SetInputData(MakeHexagonalPrism());
  writer->SetInputData(MakeHexahedron());
  writer->Write();

我也在下面尝试过。 cellArray1和cellArray2的类型是vtkSmartPointer。结果是输出文件中只有一种非结构化网格。

  vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid =
    vtkSmartPointer<vtkUnstructuredGrid>::New();
  unstructuredGrid->SetPoints(points);
  unstructuredGrid->SetCells(VTK_TETRA, cellArray1);
  unstructuredGrid->SetCells(VTK_WEDGE, cellArray2);

我不知道如何在一个.vtu文件中编写多个非结构化网格。 我会感激任何提示。

2 个答案:

答案 0 :(得分:1)

如文档所述,vtkUnstructuredGrid类非常通用。

  

数据集表示所有可能的细胞类型的任意组合

您可以使用vtkAppendFilter将不同的数据集附加到其中,然后将输出作为vtkUnstructuredGrid结果写入.vtu文件。

// create the append filter
vtkSmartPointer<vtkAppendFilter> append =
vtkSmartPointer<vtkAppendfilter>::New();

// add each data set
append->AddInputData(MakeHexagonalPrism());
append->AddInputData(MakeHexahedron());
append->Update();

// write the result
vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
writer->SetFileName(filename.c_str());
writer->SetInputData(append->GetOutput());

编辑:我按照Amit Singh的建议添加了缺少的Update()函数调用

答案 1 :(得分:0)

引用vtkXMLUnstructuredGridWriter可用here

的文档
  

可以将任何非结构化网格输入写入任意数量的一个文件中   流的片段(如果管道的其余部分支持)。

所以我认为使用这个编写器类将多个非结构化网格数据集写入一个文件是不可能的。

您是否希望在同一个非结构化网格(可以写入单个.vtu文件)中的多种类型的单元格而不是同一.vtu文件中的多个非结构化网格?如果是,则必须首先将两个单元阵列组合成单个单元阵列,并创建一个int数组,其中包含整个单元阵列中每个单元的类型。例如,

// Create a Type vector to store cell types
std::vector<int> types;

// Create a new cell array composed of cellArray1 and cellArray2
vtkSmartPointer<vtkCellArray> allCells = 
    vtkSmartPointer<vtkCellArray>::New();

// Traverse cellArray1 and add it's cells to allCells
vtkSmartPointer<vtkIdList> nextCell =
    vtkSmartPointer<vtkIdList>::New();
cellArray1->InitTraversal()
while( cellArray1->GetNextCell( nextCell ) ){
    allCells->InsertNextCell( nextCell );
    types.push_back( VTK_TETRA );
}
// Traverse cellArray2 and add it's cells to allCells
cellArray2->InitTraversal()
while( cellArray2->GetNextCell( nextCell ) ){
    allCells->InsertNextCell( nextCell );
    types.push_back( VTK_WEDGE );
}

//Finally, set allCells to unstructuredGrid
unstructuredGrid->SetCells( &(types[0]), allCells );

现在,当您将此非结构化网格写入.vtu文件时,我认为您应该在一个文件中同时包含楔形类型和四种类型的单元格。