#include "stdafx.h"

#include "vtkActor.h" #include "vtkCamera.h" #include "vtkCommand.h" #include "vtkImageData.h" #include "vtkImagePlaneWidget.h" #include "vtkInteractorEventRecorder.h" #include "vtkKochanekSpline.h" #include "vtkOutlineFilter.h" #include "vtkParametricSpline.h" #include "vtkPlaneSource.h" #include "vtkPointData.h" #include "vtkPolyData.h" #include "vtkPolyDataMapper.h" #include "vtkProbeFilter.h" #include "vtkProperty.h" #include "vtkProperty2D.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkRenderer.h" #include "vtkSplineWidget.h" #include "vtkTextProperty.h" #include "vtkVolume16Reader.h" #include "vtkXYPlotActor.h"

#include "vtkTestUtilities.h" #include "vtkRegressionTestImage.h" #include "vtkDebugLeaks.h"

char TSWeventLog[] = "# StreamVersion 1\n" "CharEvent 133 125 0 0 98 1 i\n" "KeyReleaseEvent 133 125 0 0 98 1 i\n" "MouseMoveEvent 133 125 0 0 0 0 i\n" "RightButtonPressEvent 133 125 0 0 0 0 i\n" "MouseMoveEvent 133 123 0 0 0 0 i\n" "MouseMoveEvent 133 119 0 0 0 0 i\n" "MouseMoveEvent 132 115 0 0 0 0 i\n" "MouseMoveEvent 132 111 0 0 0 0 i\n" "MouseMoveEvent 132 107 0 0 0 0 i\n" "RightButtonReleaseEvent 132 107 0 0 0 0 i\n" "MouseMoveEvent 132 129 0 0 0 0 i\n" "LeftButtonPressEvent 132 129 0 0 0 0 i\n" "MouseMoveEvent 132 130 0 0 0 0 i\n" "MouseMoveEvent 132 135 0 0 0 0 i\n" "MouseMoveEvent 132 143 0 0 0 0 i\n" "MouseMoveEvent 131 152 0 0 0 0 i\n" "MouseMoveEvent 130 159 0 0 0 0 i\n" "MouseMoveEvent 129 165 0 0 0 0 i\n" "MouseMoveEvent 127 170 0 0 0 0 i\n" "MouseMoveEvent 125 176 0 0 0 0 i\n" "MouseMoveEvent 124 181 0 0 0 0 i\n" "MouseMoveEvent 122 183 0 0 0 0 i\n" "LeftButtonReleaseEvent 122 183 0 0 0 0 i\n" "MouseMoveEvent 133 163 0 0 0 0 i\n" "MiddleButtonPressEvent 133 163 0 0 0 0 i\n" "MouseMoveEvent 132 161 0 0 0 0 i\n" "MouseMoveEvent 128 158 0 0 0 0 i\n" "MouseMoveEvent 124 155 0 0 0 0 i\n" "MouseMoveEvent 120 151 0 0 0 0 i\n" "MouseMoveEvent 116 147 0 0 0 0 i\n" "MouseMoveEvent 118 146 0 0 0 0 i\n" "MouseMoveEvent 121 148 0 0 0 0 i\n" "MouseMoveEvent 123 150 0 0 0 0 i\n" "MouseMoveEvent 125 154 0 0 0 0 i\n" "MouseMoveEvent 129 158 0 0 0 0 i\n" "MouseMoveEvent 132 161 0 0 0 0 i\n" "MouseMoveEvent 134 165 0 0 0 0 i\n" "MouseMoveEvent 136 168 0 0 0 0 i\n" "MiddleButtonReleaseEvent 136 168 0 0 0 0 i\n" "MouseMoveEvent 178 186 0 0 0 0 i\n" "KeyPressEvent 178 186 -128 0 0 1 Control_L\n" "MiddleButtonPressEvent 178 186 8 0 0 0 Control_L\n" "MouseMoveEvent 178 185 8 0 0 0 Control_L\n" "MouseMoveEvent 179 183 8 0 0 0 Control_L\n" "MouseMoveEvent 179 181 8 0 0 0 Control_L\n" "MouseMoveEvent 179 179 8 0 0 0 Control_L\n" "MouseMoveEvent 179 177 8 0 0 0 Control_L\n" "MouseMoveEvent 179 175 8 0 0 0 Control_L\n" "MouseMoveEvent 179 173 8 0 0 0 Control_L\n" "MouseMoveEvent 179 171 8 0 0 0 Control_L\n" "MouseMoveEvent 177 169 8 0 0 0 Control_L\n" "MouseMoveEvent 176 167 8 0 0 0 Control_L\n" "MouseMoveEvent 174 165 8 0 0 0 Control_L\n" "MouseMoveEvent 172 164 8 0 0 0 Control_L\n" "MouseMoveEvent 171 163 8 0 0 0 Control_L\n" "MiddleButtonReleaseEvent 171 163 8 0 0 0 Control_L\n" "KeyReleaseEvent 171 163 0 0 0 1 Control_L\n" "MouseMoveEvent 170 167 0 0 0 0 Control_L\n" "MiddleButtonPressEvent 170 167 0 0 0 0 Control_L\n" "MouseMoveEvent 172 167 0 0 0 0 Control_L\n" "MouseMoveEvent 176 167 0 0 0 0 Control_L\n" "MouseMoveEvent 181 167 0 0 0 0 Control_L\n" "MouseMoveEvent 188 167 0 0 0 0 Control_L\n" "MouseMoveEvent 198 165 0 0 0 0 Control_L\n" "MouseMoveEvent 205 163 0 0 0 0 Control_L\n" "MouseMoveEvent 211 161 0 0 0 0 Control_L\n" "MouseMoveEvent 216 160 0 0 0 0 Control_L\n" "MouseMoveEvent 222 158 0 0 0 0 Control_L\n" "MiddleButtonReleaseEvent 222 158 0 0 0 0 Control_L\n" "MouseMoveEvent 230 158 0 0 0 0 Control_L\n" "MiddleButtonPressEvent 230 158 0 0 0 0 Control_L\n" "MouseMoveEvent 229 156 0 0 0 0 Control_L\n" "MouseMoveEvent 228 153 0 0 0 0 Control_L\n" "MouseMoveEvent 226 150 0 0 0 0 Control_\n" "MouseMoveEvent 224 148 0 0 0 0 Control_L\n" "MouseMoveEvent 222 145 0 0 0 0 Control_L\n" "MouseMoveEvent 220 141 0 0 0 0 Control_L\n" "MouseMoveEvent 216 135 0 0 0 0 Control_L\n" "MouseMoveEvent 214 129 0 0 0 0 Control_L\n" "MouseMoveEvent 212 123 0 0 0 0 Control_L\n" "MouseMoveEvent 209 118 0 0 0 0 Control_L\n" "MouseMoveEvent 207 113 0 0 0 0 Control_L\n" "MouseMoveEvent 204 109 0 0 0 0 Control_L\n" "MouseMoveEvent 202 105 0 0 0 0 Control_L\n" "MouseMoveEvent 200 103 0 0 0 0 Control_L\n" "MouseMoveEvent 198 99 0 0 0 0 Control_L\n" "MouseMoveEvent 196 97 0 0 0 0 Control_L\n"  "MouseMoveEvent 194 93 0 0 0 0 Control_L\n" "MiddleButtonReleaseEvent 194 93 0 0 0 0 Control_L\n" "MouseMoveEvent 254 98 0 0 0 0 Control_L\n" "MiddleButtonPressEvent 254 98 0 0 0 0 Control_L\n" "MouseMoveEvent 254 100 0 0 0 0 Control_L\n" "MouseMoveEvent 254 104 0 0 0 0 Control_L\n" "MouseMoveEvent 255 108 0 0 0 0 Control_L\n" "MouseMoveEvent 255 112 0 0 0 0 Control_L\n" "MouseMoveEvent 255 116 0 0 0 0 Control_L\n" "MouseMoveEvent 255 120 0 0 0 0 Control_L\n" "MouseMoveEvent 256 124 0 0 0 0 Control_L\n" "MouseMoveEvent 257 128 0 0 0 0 Control_L\n" "MouseMoveEvent 257 132 0 0 0 0 Control_L\n" "MouseMoveEvent 257 136 0 0 0 0 Control_L\n" "MouseMoveEvent 258 141 0 0 0 0 Control_L\n" "MouseMoveEvent 258 146 0 0 0 0 Control_L\n" "MouseMoveEvent 258 151 0 0 0 0 Control_L\n" "MouseMoveEvent 258 157 0 0 0 0 Control_L\n" "MouseMoveEvent 258 159 0 0 0 0 Control_L\n" "MiddleButtonReleaseEvent 80 206 0 0 0 0 Control_L\n" ;

// Callback for the p_w_picpath plane widget interaction class vtkIPWCallback : public vtkCommand { public:   static vtkIPWCallback *New()     { return new vtkIPWCallback; }   virtual void Execute(vtkObject *caller, unsigned long, void*)     {       vtkImagePlaneWidget *planeWidget = reinterpret_cast<vtkImagePlaneWidget*>(caller);       if(planeWidget->GetPlaneOrientation() == 3)         {         Spline->SetProjectionPosition(0);         }       else         {         Spline->SetProjectionPosition(planeWidget->GetSlicePosition());         }       Spline->GetPolyData(Poly);     }   vtkIPWCallback():Spline(0),Poly(0){};   vtkSplineWidget* Spline;   vtkPolyData* Poly; };

// Callback for the spline widget interaction class vtkSWCallback : public vtkCommand { public:   static vtkSWCallback *New()     { return new vtkSWCallback; }   virtual void Execute(vtkObject *caller, unsigned long, void*)     {       vtkSplineWidget *spline = reinterpret_cast<vtkSplineWidget*>(caller);       spline->GetPolyData(Poly);     }   vtkSWCallback():Poly(0){};   vtkPolyData* Poly; };

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 5.6/VTKDATA/Data/headsq/quarter");     v16->SetDataMask( 0x7fff);     v16->Update();

 // delete[] fname;

  vtkRenderer* ren1 = vtkRenderer::New();   vtkRenderer* ren2 = vtkRenderer::New();   vtkRenderWindow* renWin = vtkRenderWindow::New();     renWin->SetMultiSamples(0);     renWin->AddRenderer( ren1);     renWin->AddRenderer( ren2);   vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();     iren->SetRenderWindow( renWin);

  vtkOutlineFilter* outline = vtkOutlineFilter::New();     outline->SetInputConnection(v16->GetOutputPort());

  vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();     outlineMapper->SetInputConnection(outline->GetOutputPort());

  vtkActor* outlineActor =  vtkActor::New();     outlineActor->SetMapper(outlineMapper);

  vtkImagePlaneWidget* ipw = vtkImagePlaneWidget::New();     ipw->DisplayTextOn();     ipw->TextureInterpolateOff();     ipw->UserControlledLookupTableOff();     ipw->SetInput(v16->GetOutput());     ipw->KeyPressActivationOn();     ipw->SetKeyPressActivationValue('x');     ipw->SetResliceInterpolateToNearestNeighbour();     ipw->SetInteractor(iren);     ipw->SetPlaneOrientationToXAxes();     ipw->SetSliceIndex(32);     ipw->GetPlaneProperty()->SetColor(1,0,0);

  vtkSplineWidget* spline = vtkSplineWidget::New();     spline->SetInteractor( iren);     spline->SetInput(v16->GetOutput());     spline->SetPriority(1.0);     spline->KeyPressActivationOff();     spline->PlaceWidget();     spline->ProjectToPlaneOn();     spline->SetProjectionNormal(0);     spline->SetProjectionPosition(102.4);  //initial plane oriented position     spline->SetProjectionNormal(3); //allow arbitrary oblique orientations     spline->SetPlaneSource(       static_cast<vtkPlaneSource*>(ipw->GetPolyDataAlgorithm()));

  // Specify the type of spline (change from default vtkCardinalSpline)   vtkKochanekSpline* xspline = vtkKochanekSpline::New();   vtkKochanekSpline* yspline = vtkKochanekSpline::New();   vtkKochanekSpline* zspline = vtkKochanekSpline::New();

  vtkParametricSpline* para = spline->GetParametricSpline();

  para->SetXSpline(xspline);   para->SetYSpline(yspline);   para->SetZSpline(zspline);

  xspline->Delete();   yspline->Delete();   zspline->Delete();

  vtkPolyData* poly = vtkPolyData::New();     spline->GetPolyData(poly);

  vtkProbeFilter* probe = vtkProbeFilter::New();     probe->SetInput(poly);     probe->SetSource(v16->GetOutput());

  vtkIPWCallback* ipwcb = vtkIPWCallback::New();     ipwcb->Spline = spline;     ipwcb->Poly = poly;

  ipw->AddObserver(vtkCommand::InteractionEvent,ipwcb);

  vtkSWCallback* swcb = vtkSWCallback::New();     swcb->Poly = poly;

  spline->AddObserver(vtkCommand::InteractionEvent,swcb);

  vtkImageData* data = v16->GetOutput();   double* range = data->GetPointData()->GetScalars()->GetRange();

  vtkXYPlotActor* profile = vtkXYPlotActor::New();     profile->AddInput(probe->GetOutput());     profile->GetPositionCoordinate()->SetValue( 0.05, 0.05, 0);     profile->GetPosition2Coordinate()->SetValue( 0.95, 0.95, 0);     profile->SetXValuesToNormalizedArcLength();     profile->SetNumberOfXLabels( 6);     profile->SetTitle( "Profile Data ");     profile->SetXTitle( "s");     profile->SetYTitle( "I(s)");     profile->SetXRange( 0, 1);     profile->SetYRange( range[0], range[1]);     profile->GetProperty()->SetColor( 0, 0, 0);     profile->GetProperty()->SetLineWidth( 2);     profile->SetLabelFormat("%g");     vtkTextProperty* tprop = profile->GetTitleTextProperty();     tprop->SetColor(0.02,0.06,0.62);     tprop->SetFontFamilyToArial();     profile->SetAxisTitleTextProperty(tprop);     profile->SetAxisLabelTextProperty(tprop);     profile->SetTitleTextProperty(tprop);

  ren1->SetBackground( 0.1, 0.2, 0.4);   ren1->SetViewport( 0, 0, 0.5, 1);   ren1->AddActor(outlineActor);

  ren2->SetBackground( 1, 1, 1);   ren2->SetViewport( 0.5, 0, 1, 1);   ren2->AddActor2D( profile);

  renWin->SetSize( 600, 300);

  ipw->On();   ipw->SetInteraction(0);   ipw->SetInteraction(1);   spline->On();   spline->SetNumberOfHandles(4);   spline->SetNumberOfHandles(5);   spline->SetResolution(399);

  // Set up an interesting viewpoint   vtkCamera* camera = ren1->GetActiveCamera();   camera->Elevation(110);   camera->SetViewUp(0, 0, -1);   camera->Azimuth(45);   camera->SetFocalPoint(100.8,100.8,69);   camera->SetPosition(560.949, 560.949, -167.853);   ren1->ResetCameraClippingRange();

  // Position the actors //  renWin->Render(); //  iren->SetEventPosition(200,200); //  iren->SetKeyCode('r'); //  iren->InvokeEvent(vtkCommand::CharEvent,NULL); //  ren1->ResetCameraClippingRange(); //  renWin->Render(); //  iren->SetKeyCode('t'); //  iren->InvokeEvent(vtkCommand::CharEvent,NULL);

  // Playback recorded events   vtkInteractorEventRecorder *recorder = vtkInteractorEventRecorder::New();   recorder->SetInteractor(iren);   recorder->ReadFromInputStringOn();   recorder->SetInputString(TSWeventLog);

  // Test On Off mechanism   ipw->SetEnabled(0);   spline->EnabledOff();   ipw->SetEnabled(1);   spline->EnabledOn();

  // Test Set Get handle positions   double pos[3];   int i;   for(i=0;i<spline->GetNumberOfHandles();i++)     {     spline->GetHandlePosition(i,pos);     spline->SetHandlePosition(i,pos);     }

  // Test Closed On Off     spline->ClosedOn();   spline->ClosedOff();

  // Render the p_w_picpath   iren->Initialize();   renWin->Render();   //ren1->ResetCamera();   recorder->Play();

  // Remove the observers so we can go interactive. Without this the "-I"   // testing option fails.   recorder->Off();

  int retVal = vtkRegressionTestImage( renWin );   if ( retVal == vtkRegressionTester::DO_INTERACTOR)     {     iren->Start();     }

  // Clean up   recorder->Off();   recorder->Delete();

  outlineActor->Delete();   outlineMapper->Delete();   outline->Delete();   renWin->Delete();   ren1->Delete();   ren2->Delete();   iren->Delete();

  ipw->RemoveObserver(ipwcb);   ipw->Delete();   ipwcb->Delete();   spline->RemoveObserver(swcb);   spline->Delete();   swcb->Delete();   poly->Delete();   probe->Delete();   profile->Delete();   v16->Delete();

  return !retVal; }

 

本文来源:http://hi.baidu.com/inevernuts/item/5a09c3779c020546ef1e5331