You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
384 lines
13 KiB
384 lines
13 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: TestLineWidget.cxx,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#include "vtkActor.h"
|
|
#include "vtkCommand.h"
|
|
#include "vtkInteractorEventRecorder.h"
|
|
#include "vtkLineWidget.h"
|
|
#include "vtkPLOT3DReader.h"
|
|
#include "vtkPolyData.h"
|
|
#include "vtkPolyDataMapper.h"
|
|
#include "vtkProperty.h"
|
|
#include "vtkRenderWindow.h"
|
|
#include "vtkRenderWindowInteractor.h"
|
|
#include "vtkRenderer.h"
|
|
#include "vtkRibbonFilter.h"
|
|
#include "vtkRungeKutta4.h"
|
|
#include "vtkStreamLine.h"
|
|
#include "vtkStructuredGrid.h"
|
|
#include "vtkStructuredGridOutlineFilter.h"
|
|
|
|
#include "vtkTestUtilities.h"
|
|
#include "vtkRegressionTestImage.h"
|
|
#include "vtkDebugLeaks.h"
|
|
|
|
char TestLineWidgetEventLog[] =
|
|
"# StreamVersion 1\n"
|
|
"CharEvent 185 179 0 0 105 1 i\n"
|
|
"KeyReleaseEvent 185 179 0 0 105 1 i\n"
|
|
"MouseMoveEvent 185 178 0 0 0 0 i\n"
|
|
"MouseMoveEvent 184 178 0 0 0 0 i\n"
|
|
"MouseMoveEvent 183 178 0 0 0 0 i\n"
|
|
"MouseMoveEvent 182 177 0 0 0 0 i\n"
|
|
"MouseMoveEvent 179 174 0 0 0 0 i\n"
|
|
"MouseMoveEvent 178 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 175 171 0 0 0 0 i\n"
|
|
"MouseMoveEvent 173 169 0 0 0 0 i\n"
|
|
"MouseMoveEvent 170 166 0 0 0 0 i\n"
|
|
"MouseMoveEvent 167 165 0 0 0 0 i\n"
|
|
"MouseMoveEvent 161 162 0 0 0 0 i\n"
|
|
"MouseMoveEvent 159 160 0 0 0 0 i\n"
|
|
"MouseMoveEvent 157 159 0 0 0 0 i\n"
|
|
"MouseMoveEvent 156 158 0 0 0 0 i\n"
|
|
"MouseMoveEvent 156 157 0 0 0 0 i\n"
|
|
"MouseMoveEvent 156 156 0 0 0 0 i\n"
|
|
"MouseMoveEvent 156 155 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 155 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 154 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 153 0 0 0 0 i\n"
|
|
"MouseMoveEvent 154 153 0 0 0 0 i\n"
|
|
"MouseMoveEvent 152 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 151 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 150 0 0 0 0 i\n"
|
|
"LeftButtonPressEvent 148 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 146 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 143 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 133 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 132 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 131 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 131 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 130 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 131 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 150 0 0 0 0 i\n"
|
|
"LeftButtonReleaseEvent 136 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 150 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 139 152 0 0 0 0 i\n"
|
|
"RightButtonPressEvent 139 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 153 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 154 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 156 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 157 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 158 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 159 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 159 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 160 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 161 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 160 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 158 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 157 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 155 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 147 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 146 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 144 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 143 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 141 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 140 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 139 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 139 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 137 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 136 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 136 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 136 0 0 0 0 i\n"
|
|
"RightButtonReleaseEvent 135 136 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 136 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 137 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 138 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 137 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 136 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 135 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 134 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 133 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 132 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 131 0 0 0 0 i\n"
|
|
"MouseMoveEvent 134 130 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 130 0 0 0 0 i\n"
|
|
"MouseMoveEvent 135 129 0 0 0 0 i\n"
|
|
"MouseMoveEvent 136 129 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 129 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 128 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 128 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 129 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 130 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 131 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 132 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 131 0 0 0 0 i\n"
|
|
"LeftButtonPressEvent 137 131 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 130 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 128 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 127 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 127 0 0 0 0 i\n"
|
|
"MouseMoveEvent 140 127 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 126 0 0 0 0 i\n"
|
|
"MouseMoveEvent 143 126 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 123 0 0 0 0 i\n"
|
|
"MouseMoveEvent 149 123 0 0 0 0 i\n"
|
|
"MouseMoveEvent 149 122 0 0 0 0 i\n"
|
|
"MouseMoveEvent 150 122 0 0 0 0 i\n"
|
|
"MouseMoveEvent 151 122 0 0 0 0 i\n"
|
|
"MouseMoveEvent 152 122 0 0 0 0 i\n"
|
|
"MouseMoveEvent 153 121 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 121 0 0 0 0 i\n"
|
|
"LeftButtonReleaseEvent 155 121 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 121 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 122 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 123 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 124 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 126 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 127 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 129 0 0 0 0 i\n"
|
|
"MouseMoveEvent 153 132 0 0 0 0 i\n"
|
|
"MouseMoveEvent 153 135 0 0 0 0 i\n"
|
|
"MouseMoveEvent 152 139 0 0 0 0 i\n"
|
|
"MouseMoveEvent 152 140 0 0 0 0 i\n"
|
|
"MouseMoveEvent 151 142 0 0 0 0 i\n"
|
|
"MouseMoveEvent 151 143 0 0 0 0 i\n"
|
|
"MouseMoveEvent 151 145 0 0 0 0 i\n"
|
|
"MouseMoveEvent 150 146 0 0 0 0 i\n"
|
|
"MouseMoveEvent 149 147 0 0 0 0 i\n"
|
|
"MouseMoveEvent 149 149 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 151 0 0 0 0 i\n"
|
|
"MouseMoveEvent 146 152 0 0 0 0 i\n"
|
|
"MouseMoveEvent 143 154 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 155 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 155 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 156 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 157 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 158 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 159 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 160 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 161 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 162 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 162 0 0 0 0 i\n"
|
|
"MouseMoveEvent 140 162 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 162 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 163 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 164 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 165 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 166 0 0 0 0 i\n"
|
|
"MouseMoveEvent 137 167 0 0 0 0 i\n"
|
|
"LeftButtonPressEvent 137 167 0 0 0 0 i\n"
|
|
"MouseMoveEvent 138 167 0 0 0 0 i\n"
|
|
"MouseMoveEvent 139 168 0 0 0 0 i\n"
|
|
"MouseMoveEvent 140 168 0 0 0 0 i\n"
|
|
"MouseMoveEvent 141 168 0 0 0 0 i\n"
|
|
"MouseMoveEvent 142 168 0 0 0 0 i\n"
|
|
"MouseMoveEvent 143 168 0 0 0 0 i\n"
|
|
"MouseMoveEvent 144 169 0 0 0 0 i\n"
|
|
"MouseMoveEvent 145 169 0 0 0 0 i\n"
|
|
"MouseMoveEvent 146 169 0 0 0 0 i\n"
|
|
"MouseMoveEvent 146 170 0 0 0 0 i\n"
|
|
"MouseMoveEvent 146 171 0 0 0 0 i\n"
|
|
"MouseMoveEvent 147 171 0 0 0 0 i\n"
|
|
"MouseMoveEvent 148 171 0 0 0 0 i\n"
|
|
"MouseMoveEvent 149 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 150 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 151 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 152 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 154 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 155 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 156 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 157 172 0 0 0 0 i\n"
|
|
"MouseMoveEvent 158 171 0 0 0 0 i\n"
|
|
"MouseMoveEvent 160 171 0 0 0 0 i\n"
|
|
"MouseMoveEvent 162 170 0 0 0 0 i\n"
|
|
"MouseMoveEvent 163 170 0 0 0 0 i\n"
|
|
"MouseMoveEvent 164 170 0 0 0 0 i\n"
|
|
"MouseMoveEvent 165 170 0 0 0 0 i\n"
|
|
"LeftButtonReleaseEvent 165 170 0 0 0 0 i\n"
|
|
"MouseMoveEvent 165 170 0 0 0 0 i\n"
|
|
;
|
|
|
|
// This does the actual work: updates the probe.
|
|
// Callback for the interaction
|
|
class vtkLWCallback : public vtkCommand
|
|
{
|
|
public:
|
|
static vtkLWCallback *New()
|
|
{ return new vtkLWCallback; }
|
|
virtual void Execute(vtkObject *caller, unsigned long, void*)
|
|
{
|
|
vtkLineWidget *lineWidget = reinterpret_cast<vtkLineWidget*>(caller);
|
|
lineWidget->GetPolyData(this->PolyData);
|
|
this->Actor->VisibilityOn();
|
|
}
|
|
vtkLWCallback():PolyData(0),Actor(0) {}
|
|
vtkPolyData *PolyData;
|
|
vtkActor *Actor;
|
|
};
|
|
|
|
int TestLineWidget( int argc, char *argv[] )
|
|
{
|
|
char* fname =
|
|
vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/combxyz.bin");
|
|
char* fname2 =
|
|
vtkTestUtilities::ExpandDataFileName(argc, argv, "Data/combq.bin");
|
|
|
|
// Start by loading some data.
|
|
//
|
|
vtkPLOT3DReader *pl3d = vtkPLOT3DReader::New();
|
|
pl3d->SetXYZFileName(fname);
|
|
pl3d->SetQFileName(fname2);
|
|
pl3d->SetScalarFunctionNumber(100);
|
|
pl3d->SetVectorFunctionNumber(202);
|
|
pl3d->Update();
|
|
|
|
delete [] fname;
|
|
delete [] fname2;
|
|
|
|
vtkPolyData *seeds = vtkPolyData::New();
|
|
|
|
// Create streamtues
|
|
vtkRungeKutta4 *rk4 = vtkRungeKutta4::New();
|
|
|
|
vtkStreamLine *streamer = vtkStreamLine::New();
|
|
streamer->SetInputConnection(pl3d->GetOutputPort());
|
|
streamer->SetSource(seeds);
|
|
streamer->SetMaximumPropagationTime(100);
|
|
streamer->SetIntegrationStepLength(.2);
|
|
streamer->SetStepLength(.001);
|
|
streamer->SetNumberOfThreads(1);
|
|
streamer->SetIntegrationDirectionToForward();
|
|
streamer->VorticityOn();
|
|
streamer->SetIntegrator(rk4);
|
|
|
|
vtkRibbonFilter *rf = vtkRibbonFilter::New();
|
|
rf->SetInputConnection(streamer->GetOutputPort());
|
|
rf->SetWidth(0.1);
|
|
rf->SetWidthFactor(5);
|
|
|
|
vtkPolyDataMapper *streamMapper = vtkPolyDataMapper::New();
|
|
streamMapper->SetInputConnection(rf->GetOutputPort());
|
|
double tmp[2];
|
|
pl3d->GetOutput()->GetScalarRange(tmp);
|
|
streamMapper->SetScalarRange(tmp[0], tmp[1]);
|
|
|
|
vtkActor *streamline =vtkActor::New();
|
|
streamline->SetMapper(streamMapper);
|
|
streamline->VisibilityOff();
|
|
|
|
// An outline is shown for context.
|
|
vtkStructuredGridOutlineFilter *outline =
|
|
vtkStructuredGridOutlineFilter::New();
|
|
outline->SetInputConnection(pl3d->GetOutputPort());
|
|
|
|
vtkPolyDataMapper *outlineMapper = vtkPolyDataMapper::New();
|
|
outlineMapper->SetInputConnection(outline->GetOutputPort());
|
|
|
|
vtkActor *outlineActor = vtkActor::New();
|
|
outlineActor->SetMapper(outlineMapper);
|
|
|
|
// Create the RenderWindow, Renderer and both Actors
|
|
//
|
|
vtkRenderer *ren1 = vtkRenderer::New();
|
|
vtkRenderWindow *renWin = vtkRenderWindow::New();
|
|
renWin->AddRenderer(ren1);
|
|
|
|
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
|
|
iren->SetRenderWindow(renWin);
|
|
|
|
// The SetInteractor method is how 3D widgets are associated with the render
|
|
// window interactor. Internally, SetInteractor sets up a bunch of callbacks
|
|
// using the Command/Observer mechanism (AddObserver()).
|
|
vtkLWCallback *myCallback = vtkLWCallback::New();
|
|
myCallback->PolyData = seeds;
|
|
myCallback->Actor = streamline;
|
|
|
|
// The plane widget is used probe the dataset.
|
|
//
|
|
vtkLineWidget *lineWidget = vtkLineWidget::New();
|
|
lineWidget->SetInteractor(iren);
|
|
lineWidget->SetInput(pl3d->GetOutput());
|
|
lineWidget->SetAlignToYAxis();
|
|
lineWidget->PlaceWidget();
|
|
lineWidget->GetPolyData(seeds);
|
|
lineWidget->AddObserver(vtkCommand::InteractionEvent,myCallback);
|
|
|
|
ren1->AddActor(streamline);
|
|
ren1->AddActor(outlineActor);
|
|
|
|
// Add the actors to the renderer, set the background and size
|
|
//
|
|
ren1->SetBackground(0.1, 0.2, 0.4);
|
|
renWin->SetSize(300, 300);
|
|
|
|
// record events
|
|
vtkInteractorEventRecorder *recorder = vtkInteractorEventRecorder::New();
|
|
recorder->SetInteractor(iren);
|
|
// recorder->SetFileName("c:/record.log");
|
|
// recorder->Record();
|
|
recorder->ReadFromInputStringOn();
|
|
recorder->SetInputString(TestLineWidgetEventLog);
|
|
|
|
// render the image
|
|
//
|
|
iren->Initialize();
|
|
renWin->Render();
|
|
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();
|
|
}
|
|
|
|
recorder->Off();
|
|
recorder->Delete();
|
|
myCallback->Delete();
|
|
seeds->Delete();
|
|
lineWidget->Delete();
|
|
pl3d->Delete();
|
|
rk4->Delete();
|
|
streamer->Delete();
|
|
rf->Delete();
|
|
streamMapper->Delete();
|
|
streamline->Delete();
|
|
outline->Delete();
|
|
outlineMapper->Delete();
|
|
outlineActor->Delete();
|
|
iren->Delete();
|
|
renWin->Delete();
|
|
ren1->Delete();
|
|
|
|
return !retVal;
|
|
}
|
|
|