You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VTK非结构化网格多组单元数据提取异常问题求助

VTK多组单元标量数据提取问题

我按照常规方法提取VTK非结构化网格的单元数据,流程正常但仅能获取一组标量数据。实际文件中存在两组标量,调用reader->GetNumberOfScalarsInFile()返回值为2,然而通过vtkCellData* cellData = grid->GetCellData();(grid为reader的输出)获取单元数据后,cellData->GetNumberOfArrays()返回值为1。请问如何提取第二组及更多组数据?

附可在ParaView中正常显示两组数据的VTK示例文件:

# vtk DataFile Version 3.0
Two cubes example
ASCII 
DATASET UNSTRUCTURED_GRID 
POINTS 12 double 
0.0 0.0 0.0 
1.0 0.0 0.0 
1.0 1.0 0.0 
0.0 1.0 0.0
0.0 0.0 1.0 
1.0 0.0 1.0
1.0 1.0 1.0
0.0 1.0 1.0
2.0 0.0 0.0
2.0 1.0 0.0
2.0 0.0 1.0
2.0 1.0 1.0
CELLS 2 18
8   0 1 2 3 4 5 6 7
8   1 8 9 2 5 10 11 6
CELL_TYPES 2
12
12
CELL_DATA 2
SCALARS press float 1
LOOKUP_TABLE default
1
2
SCALARS sat float 1
LOOKUP_TABLE default
0.1
0.2

ParaView中显示的单元数据


解决方法

问题根源在于vtkUnstructuredGridReader默认仅读取第一个标量数组,要加载所有标量数据,需手动启用其他数组的读取权限:

步骤1:获取文件中的所有标量名称

先调用UpdateInformation()更新读取器的元数据,才能正确获取文件内的所有标量名称:

vtkSmartPointer<vtkUnstructuredGridReader> reader = vtkSmartPointer<vtkUnstructuredGridReader>::New();
reader->SetFileName("your_file.vtk");
reader->UpdateInformation();

int scalarCount = reader->GetNumberOfScalarsInFile();
for (int i = 0; i < scalarCount; ++i) {
    const char* scalarName = reader->GetScalarsNameInFile(i);
    std::cout << "标量" << i << "名称:" << scalarName << std::endl;
}

步骤2:启用所有需要读取的标量数组

默认只有第一个标量被启用,使用AddScalarsName()追加其他标量(如果用SetScalarsName()会替换当前启用的标量):

// 启用第二个标量(示例中的"sat")
reader->AddScalarsName(reader->GetScalarsNameInFile(1));
// 若有更多组标量,循环调用AddScalarsName()即可

步骤3:读取数据并获取所有单元数组

完成配置后更新读取器,此时获取的单元数据就能包含所有启用的数组:

reader->Update();
vtkUnstructuredGrid* grid = reader->GetOutput();
vtkCellData* cellData = grid->GetCellData();

// 此时cellData->GetNumberOfArrays()应返回2
for (int i = 0; i < cellData->GetNumberOfArrays(); ++i) {
    vtkDataArray* array = cellData->GetArray(i);
    std::cout << "数组" << i << "名称:" << array->GetName() << std::endl;
    // 示例:获取第0个单元的数值
    double value = array->GetTuple1(0);
    std::cout << "第0个单元数值:" << value << std::endl;
}

关键注意点

  • 必须先执行reader->UpdateInformation(),否则无法正确获取文件中的标量名称列表。
  • 区分SetScalarsName和AddScalarsName:前者会替换当前选中的标量,后者是追加新标量,根据需求选择。

内容的提问来源于stack exchange,提问作者Marseille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:27:33