2013-02-19 26 views
5

均一なグリッドからvtk XMLファイルにデータを書き込もうとしているので、Paraviewを使用してレンダリングできます。出力ファイルに2つの変数、1つの3要素ベクトルと1つのスカラー値が含まれるようにします。C++ vtk xml writer(vtkImageData) - 同じvtiファイルの複数の変数

#include <vtkVersion.h> 
#include <vtkSmartPointer.h> 
#include <vtkXMLImageDataWriter.h> 
#include <vtkImageData.h>  

int main() 
{ 
    int nx = 10, ny = 10, nz = 10; 

    vtkSmartPointer<vtkImageData> imageData = 
     vtkSmartPointer<vtkImageData>::New(); 
    imageData->SetDimensions(nx, ny, nz); 

#if VTK_MAJOR_VERSION <= 5 
    imageData->SetNumberOfScalarComponents(3); 
    imageData->SetScalarTypeToDouble(); 
#else 
    imageData->AllocateScalars(VTK_DOUBLE, 3); 
#endif 

    for (int k = 0; k < nz; ++k) { 
     for (int j = 0; j < ny; ++j) { 
      for (int i = 0; i < nx; ++i) { 
       double * voxel = static_cast<double*>(imageData->GetScalarPointer(i,j,k)); 
       int coord = i + j * nx + k * nx * ny; 
       double t = 0.0; 
       double p = 1.0; 
       voxel[0] = sin(t) * cos(p); 
       voxel[1] = sin(t) * sin(p); 
       voxel[2] = cos(t); 
      } 
     } 
    } 

    vtkSmartPointer<vtkXMLImageDataWriter> writer = 
     vtkSmartPointer<vtkXMLImageDataWriter>::New(); 

    writer->SetFileName("test.vti"); 
#if VTK_MAJOR_VERSION <= 5 
    writer->SetInputConnection(imageData->GetProducerPort()); 
#else 
    writer->SetInputData(imageData); 
#endif 
    writer->Write(); 

    return EXIT_SUCCESS; 
} 

がどのように私は、グリッド上のすべての点に追加のスカラー値を追加することができますので、同様に私は、ベクトルのみを含む、.vtiファイルを書き込むために管理していますか?

答えて

5

私はこの答えでPythonコードに基づいて、これを自分で行う方法を働いた:

https://stackoverflow.com/a/7667417/2088135

を誰もが同じことを行う方法に興味がある場合は、ここでの「翻訳」コードです。

#include <vtkVersion.h> 
#include <vtkSmartPointer.h> 
#include <vtkXMLImageDataWriter.h> 
#include <vtkImageData.h> 
#include <vtkPointData.h> 
#include <vtkDoubleArray.h> 

int main() 
{ 
    int nx = 10, ny = 10, nz = 10; 

    vtkSmartPointer<vtkImageData> imageData = 
      vtkSmartPointer<vtkImageData>::New(); 

    imageData->SetDimensions(nx, ny, nz); 

    vtkSmartPointer<vtkDoubleArray> director = 
      vtkSmartPointer<vtkDoubleArray>::New(); 

    director->SetNumberOfComponents(3); 
    director->SetNumberOfTuples(nx * ny * nz); 

    vtkSmartPointer<vtkDoubleArray> energy = 
      vtkSmartPointer<vtkDoubleArray>::New(); 

    energy->SetNumberOfComponents(1); 
    energy->SetNumberOfTuples(nx * ny * nz); 

    for (int i = 0; i < director->GetNumberOfTuples(); ++i) { 
     double t = 1.0; 
     double p = 0.0; 
     double e = 5.0; 
     double x = sin(t) * cos(p), 
       y = sin(t) * sin(p), 
       z = cos(t); 

     director->SetTuple3(i, x, y, z); 
     energy->SetValue(i, e); 
    } 

    imageData->GetPointData()->AddArray(director); 
    director->SetName("Director"); 

    imageData->GetPointData()->AddArray(energy); 
    energy->SetName("Energy"); 

    vtkSmartPointer<vtkXMLImageDataWriter> writer = 
      vtkSmartPointer<vtkXMLImageDataWriter>::New(); 

    writer->SetFileName("test.vti"); 
#if VTK_MAJOR_VERSION <= 5 
    writer->SetInputConnection(imageData->GetProducerPort()); 
#else 
    writer->SetInputData(imageData); 
#endif 
    writer->Write(); 

    return EXIT_SUCCESS; 
} 
関連する問題