如何为同一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
相关产品推荐
相关产品推荐

