[vtkusers] vtkDenseArray with custom type?

David Doria daviddoria+vtk at gmail.com
Thu Nov 12 13:50:51 EST 2009


On Fri, Nov 6, 2009 at 11:27 AM, Jeff Baumes <jeff.baumes at kitware.com> wrote:
>> So since the vtkDenseArray stores everything internally as a
>> vtkVariant I guess I'd have to read up on vtkVariant and write a
>> conversion function from my type to vtkVariant? Is this the way to go?
>
> Forwarded from vtkArray expert Tim Shead:
> First-and-foremost, vtkDenseArray *does not* use vtkVariant for storage.
>  The vtkArray interface has GetVariantValue(), GetVariantValueN(),
> SetVariantValue(), and SetVariantValueN() methods that the concrete array
> types must implement.  The vtkDenseArray and vtkSparseArray implementations
> assume that your type is implicitly-convertible to vtkVariant, which is true
> of all the "official" VTK types defined in vtkType.h.  These methods are
> there as a convenience, and for consistency with vtkAbstractArray.
>
> So, I see several possible avenues to explore:
>
> * Make your type implicitly convertible to vtkVariant.  As long as you
> aren't actually using the vtkVariant get and set methods, this conversion
> doesn't have to actually do anything ... i.e. it could be as simple as
>
> struct Point
> {
>  // Other stuff here ...
>
>  operator vtkVariant() { return vtkVariant(); }
> };
>
> * Copy-and-paste vtkDenseArray to create your own array implementation, and
> replace the vtkVariant get and set methods with non-functioning stubs.
>
> * Convince the VTK developers to get rid of the vtkVariant get and set
> methods, since they're imposing the conversion-to-vtkVariant requirement.
>
> * Convince the VTK developers to refactor vtkVariant so it can contain any
> type, not just "official" types.  boost::any is an example of how it's done.
>
> Cheers,
> Tim

Tim and Jeff,

Excellent, simply adding a vtkVariant() operator worked perfectly (it
has to be const though).

It is just a bit awkward to have to do this, but it surely is not a
good enough argument to have someone implement boost::any haha.

Thanks for the help - here's a demo for anyone else interested:

#include <vtkSmartPointer.h>
#include <vtkDenseArray.h>

struct Point
{
  double x,y,z;

  operator vtkVariant() const { return vtkVariant(); }
};

int main(int argc, char *argv[])
{
  Point MyPoint;
  MyPoint.x = 1.0;
  MyPoint.y = 2.0;
  MyPoint.z = 3.0;
  vtkstd::cout << MyPoint.x << " " << MyPoint.y << " " << MyPoint.z <<
vtkstd::endl;

  vtkSmartPointer<vtkDenseArray<Point> > array =
vtkSmartPointer<vtkDenseArray<Point> >::New();
  array->Resize(5,5);

  array->SetValue(4,4, MyPoint);

  Point RetrievedPoint = array->GetValue(4,4);
  vtkstd::cout << RetrievedPoint.x << " " << RetrievedPoint.y << " "
<< RetrievedPoint.z << vtkstd::endl;
  return 0;
}

Thanks,

David



More information about the vtkusers mailing list