From 0485546c1d43eb9d0b5bae9678012dfeb7e9b7c7 Mon Sep 17 00:00:00 2001 From: guigues Date: Wed, 1 Oct 2008 14:24:16 +0000 Subject: [PATCH] *** empty log message *** --- src/CMakeLists.txt | 1 + src/creaVtkBasicSlicer.cxx | 140 +++++++++++++++++++++++++++++++++++++ src/creaVtkBasicSlicer.h | 16 +++++ 3 files changed, 157 insertions(+) create mode 100644 src/creaVtkBasicSlicer.cxx create mode 100644 src/creaVtkBasicSlicer.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bb6ece7..67fef9b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,6 +27,7 @@ SET( SRCS creaMessageManager creaRTTI wxVTKRenderWindowInteractor + creaVtkBasicSlicer ) diff --git a/src/creaVtkBasicSlicer.cxx b/src/creaVtkBasicSlicer.cxx new file mode 100644 index 0000000..388644c --- /dev/null +++ b/src/creaVtkBasicSlicer.cxx @@ -0,0 +1,140 @@ +#ifdef USE_VTK + +#include + +#include "vtkRenderWindow.h" +#include "vtkRenderWindowInteractor.h" + +#include "vtkOutlineFilter.h" +#include "vtkPolyDataMapper.h" +#include "vtkActor.h" +#include "vtkImagePlaneWidget.h" +#include "vtkCellPicker.h" +#include "vtkProperty.h" +#include "vtkRenderer.h" +#include "vtkCamera.h" + +namespace crea +{ + + void VtkBasicSlicer( vtkImageData* I ) + { + + int xMin, xMax, yMin, yMax, zMin, zMax; + I->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax); + + double sx, sy, sz; + I->GetSpacing(sx, sy, sz); + + double ox, oy, oz; + I->GetOrigin(ox,oy,oz); + + + // An outline is shown for context. + + vtkOutlineFilter* outline = vtkOutlineFilter::New(); + outline->SetInput(I); + + vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New(); + outlineMapper->SetInputConnection(outline->GetOutputPort()); + + vtkActor* outlineActor = vtkActor::New(); + outlineActor->SetMapper(outlineMapper); + + + // The shared picker enables us to use 3 planes at one time + // and gets the picking order right + vtkCellPicker* picker = vtkCellPicker::New(); + picker->SetTolerance(0.005); + + // The 3 image plane widgets are used to probe the dataset. + vtkImagePlaneWidget* planeWidgetX = vtkImagePlaneWidget::New(); + planeWidgetX->DisplayTextOn(); + planeWidgetX->SetInput(I); + planeWidgetX->SetPlaneOrientationToXAxes(); + planeWidgetX->SetSlicePosition((xMax+xMin)/2.); + planeWidgetX->SetPicker(picker); + planeWidgetX->SetKeyPressActivationValue('x'); + vtkProperty* prop1 = planeWidgetX->GetPlaneProperty(); + prop1->SetColor(1, 0, 0); + + vtkImagePlaneWidget* planeWidgetY = vtkImagePlaneWidget::New(); + planeWidgetY->DisplayTextOn(); + planeWidgetY->SetInput(I); + planeWidgetY->SetPlaneOrientationToYAxes(); + planeWidgetY->SetSlicePosition((yMax+yMin)/2.); + planeWidgetY->SetPicker(picker); + planeWidgetY->SetKeyPressActivationValue('y'); + vtkProperty* prop2 = planeWidgetY->GetPlaneProperty(); + prop2->SetColor(1, 1, 0); + planeWidgetY->SetLookupTable(planeWidgetX->GetLookupTable()); + + // for the z-slice, turn off texture interpolation: + // interpolation is now nearest neighbour, to demonstrate + // cross-hair cursor snapping to pixel centers + vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New(); + planeWidgetZ->DisplayTextOn(); + planeWidgetZ->SetInput(I); + planeWidgetZ->SetPlaneOrientationToZAxes(); + planeWidgetZ->SetSlicePosition((zMax+zMin)/2.); + planeWidgetZ->SetPicker(picker); + planeWidgetZ->SetKeyPressActivationValue('z'); + vtkProperty* prop3 = planeWidgetZ->GetPlaneProperty(); + prop3->SetColor(0, 0, 1); + planeWidgetZ->SetLookupTable(planeWidgetX->GetLookupTable()); + + planeWidgetZ->SetWindowLevel(512,256); + + // Create the RenderWindow and Renderer + vtkRenderer* ren = vtkRenderer::New(); + vtkRenderWindow* renWin = vtkRenderWindow::New(); + renWin->AddRenderer(ren); + + // Add the outline actor to the renderer, set the background color and size + ren->AddActor(outlineActor); + renWin->SetSize(600, 600); + ren->SetBackground(0.1, 0.1, 0.2); + + // an interactor + vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); + iren->SetRenderWindow(renWin); + + // Set the interactor for the widgets + planeWidgetX->SetInteractor(iren); + planeWidgetX->On(); + planeWidgetY->SetInteractor(iren); + planeWidgetY->On(); + planeWidgetZ->SetInteractor(iren); + planeWidgetZ->On(); + + // Create an initial interesting view + vtkCamera* cam1 = ren->GetActiveCamera(); + cam1->SetFocalPoint(0, 0, 0); + cam1->SetPosition(0, 0, -500); + //cam1->OrthogonalizeViewUp(); + cam1->Elevation(110); + cam1->SetViewUp(0, 0, -1); + cam1->Azimuth(45); + ren->ResetCameraClippingRange(); + + // Render it + // render_widget->Render(); + + iren->Initialize(); + renWin->Render(); + iren->Start(); + + ren->Delete(); + renWin->Delete(); + iren->Delete(); + planeWidgetX->Delete(); + planeWidgetY->Delete(); + planeWidgetZ->Delete(); + outline->Delete(); + outlineMapper->Delete(); + outlineActor->Delete(); + picker->Delete(); + } + +} +#endif // USE_VTK diff --git a/src/creaVtkBasicSlicer.h b/src/creaVtkBasicSlicer.h new file mode 100644 index 0000000..cda191a --- /dev/null +++ b/src/creaVtkBasicSlicer.h @@ -0,0 +1,16 @@ +#ifndef __creaVtkBasicSlicer_h_INCLUDED__ +#define __creaVtkBasicSlicer_h_INCLUDED__ + +#ifdef USE_VTK + +#include + +namespace crea +{ + + void VtkBasicSlicer( vtkImageData* I ); +} + + +#endif // USE_VTK +#endif // __creaVtkBasicSlicer_h_INCLUDED__ -- 2.45.1