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[0],wl[1]); this->WidgetZ->SetWindowLevel(wl[0],wl[1]); } else if( self == this->WidgetY ) { this->WidgetX->SetWindowLevel(wl[0],wl[1]); this->WidgetZ->SetWindowLevel(wl[0],wl[1]); } else if (self == this->WidgetZ) { this->WidgetX->SetWindowLevel(wl[0],wl[1]); this->WidgetY->SetWindowLevel(wl[0],wl[1]); } } 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[2]; // 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 actors ren->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 up getchar(); 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; } |