#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 ".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_L\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 Contol_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 image plane widget interactionclass 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 interactionclass 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();
* 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 image 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;}