[vtkusers] Volume raycast cause exception in C++

mathieu coursolle mcoursolle at gmail.com
Mon May 23 15:12:47 EDT 2005


Hi everbody,

I want to display an MRI image using a raycast function. It works fine
except that it works only if I use a plane widget at the same time, which
I can not explain. If I comment the line enabling the widget, I throws an
exception when rendered. I can see the result less than a second before
the exception is thrown. 

Here is my code, maybe someone might see what I am doing wrong.
Thanks a lot!

Mathieu

    //DICOM.
    vtkDICOMImageReader* reader_ptr = vtkDICOMImageReader::New();
    vtkSmartPointer<vtkDICOMImageReader> reader(reader_ptr);
    reader_ptr->Delete();

    //reader->SetFileName("D:\\DICOM\\0-3-35.dcm");
    reader->SetDirectoryName("D:\\DICOM");
    reader->Update();
    vtkSmartPointer<vtkImageData> data = reader->GetOutput();

    vtkSmartPointer<vtkImageShiftScale> scale = vtkImageShiftScale::New();
    scale->SetInput(data.GetPointer());
    scale->SetOutputScalarTypeToUnsignedChar();
    scale->Update();

    vtkSmartPointer<vtkPiecewiseFunction> opacity = vtkPiecewiseFunction::New();
    opacity->AddPoint(0, 0);
    opacity->AddPoint(255, 0.2);

    vtkSmartPointer<vtkColorTransferFunction> color =
vtkColorTransferFunction::New();
    color->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
    color->AddRGBPoint(64.0, 1.0, 0.0, 0.0);
    color->AddRGBPoint(128.0, 0.0, 0.0, 1.0);
    color->AddRGBPoint(192.0, 0.0, 1.0, 0.0);
    color->AddRGBPoint(255.0, 0.0, 0.2, 0.0);

    vtkSmartPointer<vtkVolumeProperty> property = vtkVolumeProperty::New();
    property->SetColor(color.GetPointer());
    property->SetScalarOpacity(opacity.GetPointer());
    property->ShadeOn();
    property->SetInterpolationTypeToLinear();

    vtkSmartPointer<vtkVolumeRayCastCompositeFunction> function =
vtkVolumeRayCastCompositeFunction::New();
    vtkSmartPointer<vtkVolumeRayCastMapper> volume_mapper =
vtkVolumeRayCastMapper::New();
    volume_mapper->SetVolumeRayCastFunction(function.GetPointer());
    volume_mapper->SetInput(scale->GetOutput());
    
    vtkSmartPointer<vtkVolume> volume = vtkVolume::New();
    volume->SetMapper(volume_mapper.GetPointer());
    volume->SetProperty(property.GetPointer());
       
    m_Window.GetRenderer()->AddVolume(volume.GetPointer());
    
    double* origin = data->GetOrigin();

    vtkCellPicker* picker = vtkCellPicker::New();
    picker->SetTolerance(0.005);

    vtkLookupTable* lut = vtkLookupTable::New();
    lut->SetTableRange(0, 255);
    lut->SetRampToSQRT();
    lut->SetSaturationRange(0, 0);
    lut->SetValueRange(0, 1);
    lut->SetHueRange(0, 0);
    lut->Build();

    vtkImagePlaneWidget* plane_x = vtkImagePlaneWidget::New();
    plane_x->SetInput(data.GetPointer());
    plane_x->SetPicker(picker);
    plane_x->SetPlaneOrientationToXAxes();
    plane_x->SetLookupTable(lut);
    plane_x->SetInteractor(m_Window.GetInteractor());
    plane_x->SetCurrentRenderer(m_Window.GetRenderer());
    plane_x->SetOrigin(origin);
    plane_x->SetPlaceFactor(1);
    plane_x->DisplayTextOn();

    vtkImagePlaneWidget* plane_y = vtkImagePlaneWidget::New();
    plane_y->SetInput(data.GetPointer());
    plane_y->SetPicker(picker);
    plane_y->SetPlaneOrientationToYAxes();
    plane_y->SetLookupTable(plane_x->GetLookupTable());
    plane_y->SetInteractor(m_Window.GetInteractor());
    plane_y->SetCurrentRenderer(m_Window.GetRenderer());
    plane_y->SetOrigin(origin);
    plane_y->SetPlaceFactor(1);
    plane_y->DisplayTextOn();

    vtkImagePlaneWidget* plane_z = vtkImagePlaneWidget::New();
    plane_z->SetInput(data.GetPointer());
    plane_z->SetPicker(picker);
    plane_z->SetPlaneOrientationToZAxes();
    plane_z->SetLookupTable(plane_x->GetLookupTable());
    plane_z->SetInteractor(m_Window.GetInteractor());
    plane_z->SetCurrentRenderer(m_Window.GetRenderer());
    plane_z->SetOrigin(origin);
    plane_z->SetPlaceFactor(1);
    plane_z->DisplayTextOn();

    plane_x->SetWindowLevel(255, 128);
    plane_y->SetWindowLevel(255, 128);
    plane_z->SetWindowLevel(255, 128);

    plane_x->PlaceWidget();
    plane_y->PlaceWidget();
    plane_z->PlaceWidget();
    //plane_x->On();                              //CRASHES IF COMMENTED HERE!
    //plane_y->On();
    //plane_z->On();

    m_Window.GetRenderer()->Render();
    m_Window.GetRenderer()->ResetCamera();



More information about the vtkusers mailing list