Hello everyone,

I am trying to write a VTK reader to read custom volumetric data into Paraview.

I started with the example vtkImageAlgorithm
(http://www.itk.org/Wiki/VTK_Examples_vtkImageAlgorithm_Filter) and
changed it so the Filter doesn't take any input and output a
vtkImageData.

To simplify, I generate a vtkImageData with constant values in the
RequestData method of my filter and assign it to the output using
output->ShallowCopy(imageData) at the end of the method.

When I tried to use this reader as plugin in Paraview, the views
(Outline, Volume) of the data are not working because the dimension of
the vtkImageData are null.

I tried to use the same filter in a VTK code. The output has a
dimension and I can print the content of the vtkImageData. If I add a
Outline actor, I am able to see the extend of the data but if I attach
a Volume actor, I get this error during the runtime :

 terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

If I copy the content of the output into a new vtkImageData, then I am
able to see the data using the Volume Actor and I don't get anymore
the error.

Did I forget something while declaring my filter ?

I attached the header and implementation file of my filter and the
main.cxx for the VTK test.

I am using Paraview 3.7.0 on Ubuntu 9.10.

Thanks for your help,

Sebastien

Aborted
#ifndef __vtkImageAlgorithmFilter_h
#define __vtkImageAlgorithmFilter_h
 
#include "vtkImageAlgorithm.h"
 
class vtkImageAlgorithmFilter : public vtkImageAlgorithm 
{
public:
  vtkTypeRevisionMacro(vtkImageAlgorithmFilter,vtkImageAlgorithm);
  //void PrintSelf(ostream& os, vtkIndent indent);
 
  static vtkImageAlgorithmFilter *New();
 
protected:
  vtkImageAlgorithmFilter();
  ~vtkImageAlgorithmFilter();
 
  int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
 
private:
  vtkImageAlgorithmFilter(const vtkImageAlgorithmFilter&);  // Not implemented.
  void operator=(const vtkImageAlgorithmFilter&);  // Not implemented.
 
};
 
#endif
#include "vtkImageAlgorithmFilter.h"
 
#include "vtkImageData.h"
 
#include "vtkObjectFactory.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkInformationVector.h"
#include "vtkInformation.h"
#include "vtkDataObject.h"
#include "vtkSmartPointer.h"
 
vtkCxxRevisionMacro(vtkImageAlgorithmFilter, "$Revision: 1.70 $");
vtkStandardNewMacro(vtkImageAlgorithmFilter);
 
vtkImageAlgorithmFilter::vtkImageAlgorithmFilter()
{
   this->SetNumberOfInputPorts(0);
  this->SetNumberOfOutputPorts(1);

}
 
vtkImageAlgorithmFilter::~vtkImageAlgorithmFilter()
{
 
}
 
int vtkImageAlgorithmFilter::RequestData(vtkInformation *vtkNotUsed(request),
                                             vtkInformationVector **inputVector,
                                             vtkInformationVector *outputVector)
{

  // generate data
      vtkSmartPointer < vtkImageData > imageData = vtkSmartPointer<vtkImageData>::New();
    //specify the size of the image data
    imageData->SetDimensions(10,10,10);
    imageData->SetNumberOfScalarComponents(1);
    imageData->SetScalarTypeToUnsignedChar();

    int* dims = imageData->GetDimensions();

    cout << "Dims: " << " x: " << dims[0] << " y: " << dims[1] << " z: " << dims[2] << endl;
    cout << "Number of points: " << imageData->GetNumberOfPoints() << endl;
    cout << "Number of cells: " << imageData->GetNumberOfCells() << endl;

    for (int z = 0; z < dims[2]; z++)
      {
        for (int y = 0; y < dims[1]; y++)
        {
        for (int x = 0; x < dims[0]; x++)
          {
          unsigned char* pixel = static_cast<unsigned char*>(imageData->GetScalarPointer(x,y,z));
          pixel[0] = 'e';
          }
        }
      }

 
  // get the info objects
  vtkInformation *outInfo = outputVector->GetInformationObject(0);
 
  vtkImageData *output = vtkImageData::SafeDownCast(
      outInfo->Get(vtkDataObject::DATA_OBJECT()));
 
  output->ShallowCopy(imageData);
 
  return 1;
}

#include <vtkSmartPointer.h>

#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyData.h>
#include <vtkImageData.h>
#include <vtkSmartPointer.h>
#include <vtkOutlineFilter.h>
#include <vtkImageDataGeometryFilter.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPointData.h>
#include <vtkCellData.h>
#include <vtkSampleFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkVolumeProperty.h>
#include <vtkVolumeTextureMapper3D.h>
#include <vtkVolume.h>
#include <vtkColorTransferFunction.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkImageCast.h>

 
#include "vtkImageAlgorithmFilter.h"
#include "vtkImageData.h"
 
void PrintImage(vtkImageData* image);
 
int main (int argc, char *argv[])
{
  vtkSmartPointer<vtkImageAlgorithmFilter> filter = vtkSmartPointer<vtkImageAlgorithmFilter>::New();
  //filter->SetInput(input);
  filter->Update();
 
  vtkImageData* output = filter->GetOutput();
 
  vtkstd::cout << "Output image: " << vtkstd::endl;
  PrintImage(output);

        // bounding box  
    vtkSmartPointer<vtkOutlineFilter> outline = vtkSmartPointer<vtkOutlineFilter>::New();  
    outline->SetInput( output );  
    vtkSmartPointer<vtkPolyDataMapper> outlineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();  
    outlineMapper->SetInput( outline->GetOutput() );
    vtkSmartPointer<vtkActor> outlineActor = vtkSmartPointer<vtkActor>::New();
    outlineActor->SetMapper( outlineMapper );

   // volume
    vtkSmartPointer<vtkPiecewiseFunction> opacityTransferFunction
        = vtkSmartPointer<vtkPiecewiseFunction>::New();
       opacityTransferFunction->AddPoint(0, 0.0);
       opacityTransferFunction->AddPoint(5, 1.0);
   
    vtkSmartPointer<vtkColorTransferFunction> colorTansfertFunction
        = vtkSmartPointer<vtkColorTransferFunction>::New();
       colorTansfertFunction->AddRGBPoint(0, 1, 1, 1);
       colorTansfertFunction->AddRGBPoint(126, .665, .84, .88);
       colorTansfertFunction->AddRGBPoint(127, 0, 1, 0);
       colorTansfertFunction->AddRGBPoint(199, 1, 0, 0);
   
    vtkSmartPointer<vtkVolumeProperty> volumeProperty
        = vtkSmartPointer<vtkVolumeProperty>::New();
       volumeProperty->SetScalarOpacity(opacityTransferFunction);
       volumeProperty->SetColor(colorTansfertFunction);
       //volumeProperty->IndependentComponentsOff();
       volumeProperty->SetInterpolationTypeToLinear();
       volumeProperty->ShadeOn();

    vtkSmartPointer<vtkVolumeTextureMapper3D> volumeMapper
        = vtkSmartPointer<vtkVolumeTextureMapper3D>::New();
       volumeMapper->SetInput(output);

    vtkSmartPointer<vtkVolume> volume
        = vtkVolume::New();
       volume->SetMapper(volumeMapper);
       volume->SetProperty(volumeProperty);



      // a renderer window
  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);

  // an interactor
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // add the actors to the scene
  renderer->AddActor(outlineActor);
renderer->AddVolume(volume);
  renderer->SetBackground(.2, .3, .4);

  // render an image (lights and cameras are created automatically)
  renderWindow->Render();

  // change the interactor style
  vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
    vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
  renderWindowInteractor->SetInteractorStyle(style);

  // begin mouse interaction
  renderWindowInteractor->Start();


  return 0;
}
 
void PrintImage(vtkImageData* image)
{
  int* dims = image->GetDimensions();
 
  for (int y=0; y<dims[1]; y++)
    {
    for (int x=0; x<dims[0]; x++)
      {
      double v = image->GetScalarComponentAsDouble(x,y,0,0);
      vtkstd::cout << v << " ";
    }
    vtkstd::cout << vtkstd::endl;
  }
 
}


_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the ParaView Wiki at: 
http://paraview.org/Wiki/ParaView

Follow this link to subscribe/unsubscribe:
http://www.paraview.org/mailman/listinfo/paraview

Reply via email to