2013-02-19 33 views
5

Próbuję zapisać dane z jednolitej siatki do pliku XML vtk, dzięki czemu mogę renderować przy użyciu Paraview. Chciałbym, aby mój plik wyjściowy zawierał dwie zmienne: jeden wektor 3-składnikowy i jedną wartość skalarną w każdym punkcie. Udało mi się napisać .vti plik zawierający wektory tylko tak:C++ vtk xml writer (vtkImageData) - wiele zmiennych w tym samym pliku 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; 
} 

Jak mogę dodać dodatkową wartość skalarną do każdego punktu siatki?

Odpowiedz

5

pracowałem się, jak to zrobić samodzielnie, na podstawie kodu Pythona w tej odpowiedzi:

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

W przypadku gdy ktoś jest zainteresowany jak to zrobić to samo, tu jest „tłumaczone jako” kod .

#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; 
}