[vtkusers] how to cast a vtkDataArray from one type into another?
David Doria
daviddoria+vtk at gmail.com
Thu Oct 8 05:55:39 EDT 2009
On Tue, Oct 6, 2009 at 4:30 PM, Fabio Meneghini <fab.meneghini at gmail.com>wrote:
> Hi all,
> just like the subject of this topic says:
> Let's suppose I got a vtkPolyData with one vtkDataArray field with scalar
> values, of type unsigned char.
> Is there a way to quickly cast all the unsigned char values after loading
> and before visualizing the data??
>
> Thanks in advance,
>
> Cheers.
>
> Fabio Meneghini
>
I thought SafeDowncast would do this - but I guess not? Can anyone explain
why this example does not work (my "invalid cast" output is hit):
#include <vtkDoubleArray.h>
#include <vtkIntArray.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <iostream>
int main(int argc, char *argv[])
{
//create points
vtkPoints* Points = vtkPoints::New();
unsigned int NumberOfPoints = 3;
Points->InsertNextPoint(0.0, 0.0, 0.0);
Points->InsertNextPoint(1.0, 0.0, 0.0);
Points->InsertNextPoint(0.0, 1.0, 0.0);
//add the points to a polydata
vtkPolyData* polydata = vtkPolyData::New();
polydata->SetPoints(Points);
//add distances to each point
vtkDoubleArray* Distances = vtkDoubleArray::New();
Distances->SetNumberOfComponents(1);
Distances->SetName("Distances");
Distances->InsertNextValue(1.1);
Distances->InsertNextValue(2.2);
Distances->InsertNextValue(3.3);
polydata->GetPointData()->AddArray(Distances);
//get the distances from the polydata
vtkDoubleArray* Array =
vtkDoubleArray::SafeDownCast(polydata->GetPointData()->GetArray("Distances"));
if(Array)
{
for(unsigned int i = 0; i < NumberOfPoints; i++)
{
double dist;
dist = Array->GetValue(i);
std::cout << "Distance: " << dist << std::endl;
}
}
//cast the double distances to ints
vtkDoubleArray* DoubleDistances =
vtkDoubleArray::SafeDownCast(polydata->GetPointData()->GetArray("Distances"));
vtkIntArray* IntDistances = vtkIntArray::SafeDownCast(DoubleDistances);
if(IntDistances)
{
for(unsigned int i = 0; i < NumberOfPoints; i++)
{
int dist;
dist = IntDistances->GetValue(i);
std::cout << "Distance: " << dist << std::endl;
}
}
else
{
std::cout << "invalid cast." << std::endl;
}
return 0;
}
Thanks,
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20091008/8bc39a2d/attachment.htm>
More information about the vtkusers
mailing list