从 VTK 非结构化网格中提取少量单元格数据?

问题描述 投票:0回答:1

我根据this答案提取了单元格数据。

一切正常,但我只得到一组标量数据,但我有两组。

reader->GetNumberOfScalarsInFile();

返回 2,但是

vtkCellData* cellData = grid->GetCellData();  // grid = reader->GetOutput;
cellData->GetNumberOfArrays();

返回1;

如何提取第二组(或更多其他)数据?

编辑: 这是我的 vtk 文件示例(在 paraview 中工作正常)

# 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

c++ vtk
1个回答
0
投票

可以将单元格中的数据存储为具有一个组件的

SCALARS
,而不是使用
FIELD
。然后,可以用
GetTuple1()
来读取。

int main() {
  std::string file = "infile.vtk";
  vtkPointer reader = vtkPointer::New();
  reader->SetFileName(file.c_str());
  reader->Update();
  vtkSmartPointer < vtkDataArray > press = reader->GetOutput()->GetCellData()->GetArray("press");
  vtkSmartPointer < vtkDataArray > sat   = reader->GetOutput()->GetCellData()->GetArray("sat");
  int nc = reader->GetOutput()->GetNumberOfCells();
  std::vector<float> p(nc);
  std::vector<float> s(nc);
  for (int i = 0; i < nc ; ++i) {    
    p[i] =  press->GetTuple1(i) ;
    std::cout<< "p[" << i << "] = "<< p[i] << std::endl;
    s[i] =  sat->GetTuple1(i) ;
    std::cout<< "s[" << i << "] = "<< s[i] << std::endl;
  } 
}

这是示例中使用的文件

input.vtk

# vtk DataFile Version 5.1
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
FIELD FieldData 2
press 1 2 float 
1
2
sat 1 2 float
0.1
0.2
© www.soinside.com 2019 - 2024. All rights reserved.