2013-02-19 7 views
5

मैं एक समान ग्रिड से डेटा को एक vtk XML फ़ाइल में लिखने की कोशिश कर रहा हूं, ताकि मैं इसे पैराव्यू का उपयोग करके प्रस्तुत कर सकूं। मैं अपनी आउटपुट फ़ाइल को दो चर शामिल करना चाहता हूं: प्रत्येक बिंदु पर एक 3-घटक वेक्टर और एक स्केलर मान। मैं एक .vti फ़ाइल लिखने में कामयाब रहे केवल वैक्टर युक्त है, तो जैसे:सी ++ वीटीके एक्सएमएल लेखक (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; 
} 

मैं कैसे ग्रिड पर प्रत्येक बिंदु के लिए एक अतिरिक्त अदिश मूल्य जोड़ सकते हैं?

उत्तर

5

मैं अपने आप को बाहर काम ऐसा करने के तरीके, इस जवाब में अजगर कोड के आधार पर:

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; 
} 
संबंधित मुद्दे