如何用共享坐标编写vtkUnstructuredGrid

时间:2017-11-22 10:53:12

标签: vtk

我正在尝试将关于我自己制作的网格的数据结构转换为vtu格式文件。感谢我仍然提出的question的答案,我能够创建vtu格式文件。

但是,属于多个单元格的所有点都输出到与文件数量一样多的文件。 (在output.vtu中,NumberOfPoints =“10648”NumberOfCells =“1331”.1331 * 8 = 10648)如果我试图在paraview中看到该文件,我无法打开它。

我不知道如何用共享坐标编写vtkUnstructuredGrid。我会感激任何提示。

这是我写的代码。

MyMesh包含单元格和顶点信息。

bool writeVtu(MyMesh *mesh, const char *path)
{
    // create the append filter
    vtkSmartPointer<vtkAppendFilter> append =
      vtkSmartPointer<vtkAppendFilter>::New();

    // add each data set
    for(int i = 0; i < num_cell; i++)
    {
        append->AddInputData(addCell(mesh->cell(i)));
    }
    append->Update();

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

    return true;
}

vtkSmartPointer<vtkUnstructuredGrid>
  addCell(MyCell* cell)
{
    int numberOfVertices = cell->numVertices();

    vtkSmartPointer<vtkPoints> points =
      vtkSmartPointer<vtkPoints>::New();

    for(int i = 0; i < numberOfVertices; i++){
        points->InsertNextPoint(cell->getVertex(i)->getxyz());
    }

    vtkSmartPointer<vtkIdList> idList = vtkIdList::New();
    idList->SetNumberOfIds(numberOfVertices);
    for (vtkIdType i = 0; i < numberOfVertices; i++)
    {
        idList->SetId(i, i);
    }

    vtkSmartPointer<vtkUnstructuredGrid> ug =
      vtkSmartPointer<vtkUnstructuredGrid>::New();
    ug->InsertNextCell(
        vtkCellType(cell->vtkType()) , idList);
    ug->SetPoints(points);
    return ug;
}

1 个答案:

答案 0 :(得分:0)

Apriori,假设MyMesh提供顶点的全局标识符,您可以执行以下操作:

bool writeVtu(MyMesh *mesh, const char *path)
{
    // create the unstructured grid
    vtkSmartPointer<vtkUnstructuredGrid> ug =
      vtkSmartPointer<vtkUnstructuredGrid>::New();

    // create the shared points structure
    vtkSmartPointer<vtkPoints> pts =
      vtkSmartPointer<vtkPoints>::New();
    pts->SetNumberOfPoints(num_points);

    // add each cell
    for(int i = 0; i < num_cell; i++)
    {
        addCell(mesh->cell(i), ug, pts);
    }

    // add the points
    ug->SetPoints(pts);

    // write the result
    vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
    vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
    writer->SetFileName(path);
    writer->SetInputData(ug);
    writer->Write();

    return true;
}

void addCell(MyCell *cell,
  vtkSmartPointer<vtkUnstructuredGrid> ug,
  vtkSmartPointer<vtkPoints> points)
{
    int numberOfVertices = cell->numVertices();

    vtkSmartPointer<vtkIdList> idList = vtkIdList::New();
    idList->SetNumberOfIds(numberOfVertices);
    for(int i = 0; i < numberOfVertices; i++){
        int globalId = cell->getVertex(i)->getId();
        idList->SetId(i, globalId);
        points->SetPoint(globalId, cell->getVertex(i)->getxyz());
    }

    ug->InsertNextCell(
        vtkCellType(cell->vtkType()) , idList);
}

addCell版本同时添加拓扑和几何图形,并且在开始时相应地分配管理点的结构。 在这里,我没有使用vtkAppendFilter,因为我认为一个vtkUnstructuredGrid可以完成相同的工作(基于代码的原始版本)。

请注意,此代码未经测试,因此请注意它可能包含错误。在插入单元格之前调用ug->Allocate(num_cells)可能是必要的。

编辑:我按照R. Y的建议将函数SetId()的第二个参数修改为globalId