medimage 发表于 2015-12-5 18:06:54

VTK例子20-vtkImagePlaneWidget显示四幅图像

vtkImagePlaneWidget显示四幅图像#include "stdafx.h"#include "vtkActor.h"#include "vtkCamera.h"#include "vtkCellPicker.h"#include "vtkCommand.h"#include "vtkImageActor.h"#include "vtkImageMapToColors.h"#include "vtkImagePlaneWidget.h"#include "vtkImageReader.h"#include "vtkInteractorEventRecorder.h"#include "vtkLookupTable.h"#include "vtkOutlineFilter.h"#include "vtkPolyDataMapper.h"#include "vtkProperty.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkRenderer.h"#include "vtkVolume16Reader.h"#include "vtkImageData.h"#include "vtkTestUtilities.h"#include "vtkRegressionTestImage.h"#include "vtkDebugLeaks.h"

class vtkWidgetWindowLevelCallback : public vtkCommand{public:static vtkWidgetWindowLevelCallback *New(){ return new vtkWidgetWindowLevelCallback; }void Execute( vtkObject *caller, unsigned long vtkNotUsed( event ),                void *callData ){    vtkImagePlaneWidget* self =      reinterpret_cast< vtkImagePlaneWidget* >( caller );    if(!self) return;    double* wl = static_cast<double*>( callData );    if ( self == this->WidgetX )      {      this->WidgetY->SetWindowLevel(wl,wl);      this->WidgetZ->SetWindowLevel(wl,wl);      }    else if( self == this->WidgetY )      {      this->WidgetX->SetWindowLevel(wl,wl);      this->WidgetZ->SetWindowLevel(wl,wl);      }    else if (self == this->WidgetZ)      {      this->WidgetX->SetWindowLevel(wl,wl);      this->WidgetY->SetWindowLevel(wl,wl);      }}vtkWidgetWindowLevelCallback():WidgetX( 0 ), WidgetY( 0 ), WidgetZ ( 0 ) {}vtkImagePlaneWidget* WidgetX;vtkImagePlaneWidget* WidgetY;vtkImagePlaneWidget* WidgetZ;};int main( int argc, char *argv[] ){char* fname = vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/headsq/quarter");vtkVolume16Reader* v16 =vtkVolume16Reader::New();    v16->SetDataDimensions( 64, 64);    v16->SetDataByteOrderToLittleEndian();    v16->SetImageRange( 1, 93);    v16->SetDataSpacing( 3.2, 3.2, 1.5);    v16->SetFilePrefix("E://VTK//VTKData//Data//headsq//quarter");    //v16->SetFilePrefix(fname);    v16->SetDataMask( 0x7fff);    v16->Update();delete[] fname;vtkOutlineFilter* outline = vtkOutlineFilter::New();    outline->SetInputConnection(v16->GetOutputPort());vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();    outlineMapper->SetInputConnection(outline->GetOutputPort());vtkActor* outlineActor =vtkActor::New();    outlineActor->SetMapper( outlineMapper);vtkRenderer* ren1 = vtkRenderer::New();vtkRenderer* ren2 = vtkRenderer::New();vtkRenderer* ren3 = vtkRenderer::New();vtkRenderer* ren = vtkRenderer::New();vtkRenderWindow* renWin = vtkRenderWindow::New();        renWin->AddRenderer(ren1);    renWin->AddRenderer(ren2);    renWin->AddRenderer(ren3);    renWin->AddRenderer(ren);vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();    iren->SetRenderWindow(renWin);vtkCellPicker* picker = vtkCellPicker::New();    picker->SetTolerance(0.005);vtkProperty* ipwProp = vtkProperty::New();   //assign default props to the ipw's texture plane actor
vtkImagePlaneWidget* planeWidgetX = vtkImagePlaneWidget::New();    planeWidgetX->SetInteractor( iren);    planeWidgetX->SetKeyPressActivationValue('x');    planeWidgetX->SetPicker(picker);    planeWidgetX->RestrictPlaneToVolumeOn();    planeWidgetX->GetPlaneProperty()->SetColor(1,0,0);    planeWidgetX->SetTexturePlaneProperty(ipwProp);    planeWidgetX->TextureInterpolateOff();    planeWidgetX->SetResliceInterpolateToNearestNeighbour();    planeWidgetX->SetInput(v16->GetOutput());    planeWidgetX->SetPlaneOrientationToXAxes();    planeWidgetX->SetSliceIndex(32);    planeWidgetX->GetTexturePlaneProperty()->SetOpacity(1);    planeWidgetX->DisplayTextOn();    planeWidgetX->On();    planeWidgetX->InteractionOn();    vtkImagePlaneWidget* planeWidgetY = vtkImagePlaneWidget::New();    planeWidgetY->SetInteractor( iren);    planeWidgetY->SetKeyPressActivationValue('y');    planeWidgetY->SetPicker(picker);    planeWidgetY->GetPlaneProperty()->SetColor(1,1,0);    planeWidgetY->SetTexturePlaneProperty(ipwProp);    planeWidgetY->TextureInterpolateOn();    planeWidgetY->SetResliceInterpolateToLinear();    planeWidgetY->SetInput(v16->GetOutput());    planeWidgetY->SetPlaneOrientationToYAxes();    planeWidgetY->SetSlicePosition(122.5);    planeWidgetY->GetTexturePlaneProperty()->SetOpacity(1);    planeWidgetY->SetLookupTable( planeWidgetX->GetLookupTable());    planeWidgetY->DisplayTextOn();    planeWidgetY->UpdatePlacement();    planeWidgetY->On();vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New();    planeWidgetZ->SetInteractor( iren);    planeWidgetZ->SetKeyPressActivationValue('z');    planeWidgetZ->SetPicker(picker);    planeWidgetZ->GetPlaneProperty()->SetColor(0,0,1);    planeWidgetZ->SetTexturePlaneProperty(ipwProp);    planeWidgetZ->TextureInterpolateOn();    planeWidgetZ->SetResliceInterpolateToCubic();    planeWidgetZ->SetInput(v16->GetOutput());    planeWidgetZ->SetPlaneOrientationToZAxes();    planeWidgetZ->SetSliceIndex(46);    planeWidgetZ->GetTexturePlaneProperty()->SetOpacity(1);    planeWidgetZ->SetLookupTable( planeWidgetX->GetLookupTable());    planeWidgetZ->DisplayTextOn();    planeWidgetZ->On();   vtkWidgetWindowLevelCallback* cbk = vtkWidgetWindowLevelCallback::New();   cbk->WidgetX = planeWidgetX;   cbk->WidgetY = planeWidgetY;   cbk->WidgetZ = planeWidgetZ;// planeWidgetX->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );   //planeWidgetY->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );   //planeWidgetZ->AddObserver( vtkCommand::EndWindowLevelEvent, cbk );   cbk->Delete();//double wl;// planeWidgetZ->GetWindowLevel(wl);
// Add a 2D image to test the GetReslice method//   vtkImageMapToColors* colorMap1 = vtkImageMapToColors::New();    colorMap1->PassAlphaToOutputOff();    colorMap1->SetActiveComponent(0);    colorMap1->SetOutputFormatToLuminance();    colorMap1->SetInput(planeWidgetX->GetResliceOutput());    colorMap1->SetLookupTable(planeWidgetX->GetLookupTable());   vtkImageActor* imageActor1 = vtkImageActor::New();    imageActor1->PickableOff();    imageActor1->SetInput(colorMap1->GetOutput());       vtkImageMapToColors* colorMap2 = vtkImageMapToColors::New();    colorMap2->PassAlphaToOutputOff();    colorMap2->SetActiveComponent(0);    colorMap2->SetOutputFormatToLuminance();    colorMap2->SetInput(planeWidgetY->GetResliceOutput());    colorMap2->SetLookupTable(planeWidgetX->GetLookupTable());vtkImageActor* imageActor2 = vtkImageActor::New();    imageActor2->PickableOff();    imageActor2->SetInput(colorMap2->GetOutput());vtkImageMapToColors* colorMap3 = vtkImageMapToColors::New();    colorMap3->PassAlphaToOutputOff();    colorMap3->SetActiveComponent(0);    colorMap3->SetOutputFormatToLuminance();    colorMap3->SetInput(planeWidgetZ->GetResliceOutput());    colorMap3->SetLookupTable(planeWidgetX->GetLookupTable());vtkImageActor* imageActor3 = vtkImageActor::New();    imageActor3->PickableOff();    imageActor3->SetInput(colorMap3->GetOutput());   //Add the actorsren->AddActor( outlineActor);ren1->AddActor( imageActor1);ren2->AddActor( imageActor2);ren3->AddActor( imageActor3);ren->SetBackground( 0.1, 0.1, 0.2);ren1->SetBackground( 0.1, 0.2, 0.1);ren2->SetBackground( 0.2, 0.1, 0.2);ren3->SetBackground( 0.2, 0.2, 0.2);renWin->SetSize( 600, 400);ren->SetViewport(0,0.5,0.5,1);ren1->SetViewport(0.5,0.5,1,1);ren2->SetViewport(0,0,0.5,0.5);ren3->SetViewport(0.5,0,1,0.5);// Set the actors' postions//renWin->Render();//iren->SetEventPosition(100,200);//iren->SetKeyCode('r');//iren->InvokeEvent(vtkCommand::CharEvent,NULL);//iren->SetEventPosition( 200,200);//iren->SetKeyCode('r');// iren->InvokeEvent(vtkCommand::CharEvent,NULL);renWin->Render();ren->GetActiveCamera()->Elevation(110);ren->GetActiveCamera()->SetViewUp(0, 0, -1);ren->GetActiveCamera()->Azimuth(45);ren->GetActiveCamera()->Dolly(1.15);ren->ResetCameraClippingRange();iren->Initialize();iren->Start();renWin->Render();// Test SetKeyPressActivationValue for one of the widgets////iren->SetKeyCode('z');//iren->InvokeEvent(vtkCommand::CharEvent,NULL);//iren->SetKeyCode('z');//iren->InvokeEvent(vtkCommand::CharEvent,NULL);// Remove the observers so we can go interactive. Without this the "-I"// testing option fails.int retVal = vtkRegressionTestImage( renWin );if ( retVal == vtkRegressionTester::DO_INTERACTOR){    iren->Start();}   //Clean upgetchar();cbk->Delete();ipwProp->Delete();planeWidgetX->Delete();planeWidgetY->Delete();planeWidgetZ->Delete();colorMap1->Delete();imageActor1->Delete();colorMap2->Delete();imageActor2->Delete();colorMap3->Delete();imageActor3->Delete(); picker->Delete();outlineActor->Delete();outlineMapper->Delete();outline->Delete();iren->Delete();renWin->Delete();ren->Delete();ren1->Delete();ren2->Delete();ren3->Delete();v16->Delete();return !retVal;}

medphysics 发表于 2015-12-5 22:11:16

看着还不错,学习下

medinfo 发表于 2016-5-15 02:32:23

顶贴

13636600011 发表于 2016-5-15 08:27:23

回复看下,!!

devstd 发表于 2016-5-24 10:03:29

页: [1]
查看完整版本: VTK例子20-vtkImagePlaneWidget显示四幅图像