2013-02-19 7 views
5

Sto provando a scrivere i dati da una griglia uniforme in un file XML vtk, in modo che possa renderlo utilizzando Paraview. Vorrei che il mio file di output contenga due variabili: un vettore a 3 componenti e un valore scalare in ogni punto. Sono riuscito a scrivere un file .vti, contenente i vettori solo, in questo modo:C++ vtk xml writer (vtkImageData) - più variabili nello stesso file 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; 
} 

Come posso aggiungere un valore scalare aggiuntivo per ogni punto della griglia?

risposta

5

ho lavorato come fare questo io stesso, in base al codice Python in questa risposta:

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

Nel caso in cui qualcuno è interessato a come fare la stessa cosa, ecco il codice "tradotto" .

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