#include <vtkDataArrayTemplate.h>
+
+#include <vtkCharArray.h>
+#include <vtkSignedCharArray.h>
+#include <vtkUnsignedCharArray.h>
+#include <vtkShortArray.h>
+#include <vtkUnsignedShortArray.h>
+#include <vtkIntArray.h>
+#include <vtkUnsignedIntArray.h>
+#include <vtkLongArray.h>
+#include <vtkUnsignedLongArray.h>
+#include <vtkFloatArray.h>
+#include <vtkDoubleArray.h>
+
#include <vtkPointData.h>
-#include <typeinfo>
+#include <vtkTypeTraits.h>
+#include <creaMessageManager.h>
namespace crea
{
template <class T>
- vtkImageData* CREA_EXPORT NewVtkImageDataFromRaw( T* data,
+ vtkImageData* NewVtkImageDataFromRaw( T* data,
int nx,
int ny,
- int nz)
+ int nz,
+ bool do_not_desalloc)
{
- std::cout << "NV "<<nx<<" " <<ny<<" " << nz<<std::endl;
- std::cout << typeid(T).name() << std::endl;
+ // std::cout << "NV "<<nx<<" " <<ny<<" " << nz<<std::endl;
+ // std::cout << vtkTypeTraits<T>::SizedName() << std::endl;
vtkImageData *image = vtkImageData::New();
image->SetNumberOfScalarComponents(1);
- image->SetScalarType(GetVtkIdType<T>(*data));
+ int vtktype = vtkTypeTraits<T>::VTKTypeID();
+ image->SetScalarType(vtktype);
image->SetDimensions(nx,ny,nz);
image->SetSpacing(1,1,1);
- std::cout << "alloc"<<std::endl;
image->AllocateScalars();
- std::cout << "alloc ok"<<std::endl;
- vtkDataArrayTemplate<T>* array
- = (vtkDataArrayTemplate<T>*)vtkDataArrayTemplate<T>::New();
- std::cout << "data array alloc ok"<<std::endl;
- // array->SetNumberOfComponents( 1 );
- std::cout << "nb compo ok"<<std::endl;
- // The last param of SetArray is set to 1 to keep the class from deleting the array when it cleans up or reallocates memory.
+ vtkDataArray* array = 0;
+ switch (vtktype)
+ {
+ case VTK_CHAR:
+ array = vtkCharArray::New(); break;
+ case VTK_SIGNED_CHAR:
+ array = vtkSignedCharArray::New(); break;
+ case VTK_UNSIGNED_CHAR:
+ array = vtkUnsignedCharArray::New(); break;
+ case VTK_SHORT:
+ array = vtkShortArray::New(); break;
+ case VTK_UNSIGNED_SHORT:
+ array = vtkUnsignedShortArray::New(); break;
+ case VTK_INT:
+ array = vtkIntArray::New(); break;
+ case VTK_UNSIGNED_INT:
+ array = vtkUnsignedIntArray::New(); break;
+ case VTK_LONG:
+ array = vtkLongArray::New(); break;
+ case VTK_UNSIGNED_LONG:
+ array = vtkUnsignedLongArray::New(); break;
+ case VTK_FLOAT:
+ array = vtkFloatArray::New(); break;
+ case VTK_DOUBLE:
+ array = vtkDoubleArray::New(); break;
+ default:
+ creaGlobalError("NewVtkImageDataFromRaw : type "
+ <<vtkTypeTraits<T>::SizedName()
+ <<" non implemented");
+ }
+ vtkDataArrayTemplate<T>* tarray
+ = dynamic_cast<vtkDataArrayTemplate<T>*>(array);
+ array->SetNumberOfComponents( 1 );
size_t size = (long)nx*(long)ny*(long)nz;
- std::cout << "SetArray"<<std::endl;
- array->SetArray( data, size, 1 );
- //Pay attention in particular to the last param of SetArray:
- //http://www.vtk.org/doc/nightly/html/classvtkUnsignedShortArray.html#z798_0
- std::cout << "SetScalars"<<std::endl;
- image->GetPointData( )->SetScalars( array );
- std::cout << "Delete"<<std::endl;
+ // The last param of SetArray is set to 1 to keep the class from deleting the array
+ // when it cleans up or reallocates memory.
+ int dndesa = 0;
+ if (do_not_desalloc) dndesa = 1;
+ tarray->SetArray( data, size, dndesa );
+ image->GetPointData( )->SetScalars( tarray );
array->Delete( );
return image;
}