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

如何为同一vtkUnstructuredGrid添加多个单元数据数组并写入.vtu?

问题

使用C++ VTK通过vtkUnstructuredGrid生成.vtu文件时,若两次调用SetVectors()方法添加矢量场,最终文件中仅保留最后一个矢量数组。如何实现将多个矢量数据数组写入.vtu文件?以下是最小复现示例:

//VTK headers 
#include <vtkActor.h>
#include <vtkCellArray.h>
#include <vtkDataSetMapper.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTetra.h>
#include <vtkQuad.h>
#include <vtkTriangle.h>

#include <vtkUnstructuredGrid.h>
#include <vtkXMLUnstructuredGridReader.h>
#include <vtkXMLUnstructuredGridWriter.h>
#include <vtkCellData.h>
#include <vtkDoubleArray.h>

int main () {

    vtkNew<vtkPoints> points;
    // Make 4 points
    points->InsertNextPoint(0., 0., 0.);
    points->InsertNextPoint(1., 0., 0.);
    points->InsertNextPoint(1., 1, 0);
    points->InsertNextPoint(0., 1., 0.);
    vtkNew<vtkCellArray> cellArray;
    vtkNew<vtkQuad> quad;
    // make single quad
    quad->GetPointIds()->SetId(0, 0);
    quad->GetPointIds()->SetId(1, 1);
    quad->GetPointIds()->SetId(2, 2);
    quad->GetPointIds()->SetId(3, 3);
    cellArray->InsertNextCell(quad);

    
    vtkNew<vtkUnstructuredGrid> unstructuredGrid;
    unstructuredGrid->SetPoints(points);
    unstructuredGrid->SetCells(VTK_QUAD, cellArray);
    // Data Arrays
    vtkSmartPointer<vtkDoubleArray> Sigma = vtkSmartPointer<vtkDoubleArray>::New();
    Sigma->SetName("Normal Stress");
    Sigma->SetNumberOfComponents(3);
    vtkSmartPointer<vtkDoubleArray>  Tau = vtkSmartPointer<vtkDoubleArray>::New();
    Tau->SetName("Shear Stress ");
    Tau->SetNumberOfComponents(3);
    //  insert values to arrays
    Sigma->InsertNextValue(100.);
    Sigma->InsertNextValue(100.);
    Sigma->InsertNextValue(100.);
    Tau->InsertNextValue(100.);
    Tau->InsertNextValue(100.);
    Tau->InsertNextValue(100.);
    // insert data array to grid
    unstructuredGrid->GetCellData()->SetVectors(Sigma);
    // Tau will overwrite sigma field 
    //  How to fix it
    unstructuredGrid->GetCellData()->SetVectors(Tau);
    
    vtkNew<vtkXMLUnstructuredGridWriter> writer;
    writer->SetFileName("out.vtu");
    writer->SetInputData(unstructuredGrid);
    writer->Write();
    return 0;
}

该示例创建4个点和一个四边形单元,尝试添加两个单元矢量数组,但生成的out.vtu仅包含"Shear Stress"数组。

解决方案
  • SetVectors()方法的作用是设置CellData中默认的矢量数组,调用时会替换之前设置的默认矢量,而非向数组集合中添加新数组。若仅用该方法添加多个数组,只会保留最后一次设置的默认数组。
  • 要保留多个矢量数组,需使用AddArray()方法将所有需要的数组添加到CellData中;若需指定某个数组作为默认显示的矢量,可在添加完成后调用一次SetVectors()指定该数组。

修改后的代码如下:

//VTK headers 
#include <vtkActor.h>
#include <vtkCellArray.h>
#include <vtkDataSetMapper.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkTetra.h>
#include <vtkQuad.h>
#include <vtkTriangle.h>

#include <vtkUnstructuredGrid.h>
#include <vtkXMLUnstructuredGridReader.h>
#include <vtkXMLUnstructuredGridWriter.h>
#include <vtkCellData.h>
#include <vtkDoubleArray.h>

int main () {

    vtkNew<vtkPoints> points;
    // Make 4 points
    points->InsertNextPoint(0., 0., 0.);
    points->InsertNextPoint(1., 0., 0.);
    points->InsertNextPoint(1., 1, 0);
    points->InsertNextPoint(0., 1., 0.);
    vtkNew<vtkCellArray> cellArray;
    vtkNew<vtkQuad> quad;
    // make single quad
    quad->GetPointIds()->SetId(0, 0);
    quad->GetPointIds()->SetId(1, 1);
    quad->GetPointIds()->SetId(2, 2);
    quad->GetPointIds()->SetId(3, 3);
    cellArray->InsertNextCell(quad);

    
    vtkNew<vtkUnstructuredGrid> unstructuredGrid;
    unstructuredGrid->SetPoints(points);
    unstructuredGrid->SetCells(VTK_QUAD, cellArray);
    // Data Arrays
    vtkSmartPointer<vtkDoubleArray> Sigma = vtkSmartPointer<vtkDoubleArray>::New();
    Sigma->SetName("Normal Stress");
    Sigma->SetNumberOfComponents(3);
    vtkSmartPointer<vtkDoubleArray>  Tau = vtkSmartPointer<vtkDoubleArray>::New();
    Tau->SetName("Shear Stress ");
    Tau->SetNumberOfComponents(3);
    //  insert values to arrays
    Sigma->InsertNextValue(100.);
    Sigma->InsertNextValue(100.);
    Sigma->InsertNextValue(100.);
    Tau->InsertNextValue(100.);
    Tau->InsertNextValue(100.);
    Tau->InsertNextValue(100.);
    // 将两个数组添加到CellData中
    unstructuredGrid->GetCellData()->AddArray(Sigma);
    unstructuredGrid->GetCellData()->AddArray(Tau);
    // 可选:设置"Normal Stress"为默认显示的矢量数组
    unstructuredGrid->GetCellData()->SetVectors(Sigma);
    
    vtkNew<vtkXMLUnstructuredGridWriter> writer;
    writer->SetFileName("out.vtu");
    writer->SetInputData(unstructuredGrid);
    writer->Write();
    return 0;
}

修改后生成的out.vtu文件会包含"Normal Stress"和"Shear Stress"两个矢量数组,可在ParaView中切换查看。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:28:13