6
* Code adapted from vtkINRIA3D
7
=========================================================================
10
Module: $Id: GinkgoImageCommand.cpp 1297 2010-02-16 12:30:41Z carlos $
12
Author: $Author: filus $
13
Date: $Date: 2008-06-06 18:10:57 +0200 (vie, 06 jun 2008) $
14
Version: $Revision: 880 $
16
Copyright (c) 2007 INRIA - Asclepios Project. All rights reserved.
17
See Copyright.txt for details.
19
This software is distributed WITHOUT ANY WARRANTY; without even
20
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
21
PURPOSE. See the above copyright notices for more information.
23
=========================================================================*/
28
# pragma warning (disable : 4018)
32
#include "../interactor/ginkgointeractorstyleimage2d.h"
33
#include <vtkginkgoimageviewer.h>
35
#include <vtkAbstractPropPicker.h>
36
#include <vtkRenderer.h>
37
#include <vtkRenderWindow.h>
38
#include <vtkRenderWindowInteractor.h>
39
#include <vtkImageData.h>
42
#include "ginkgoimagecommand.h"
45
GinkgoImageCommand::GinkgoImageCommand() :
46
View(NULL), InitialWindow(0), InitialLevel(0),
47
WindowEventStatus(false)
52
GinkgoImageCommand::Execute(vtkObject* caller,
56
if (this->View->GetInput() == NULL){
60
if (event == vtkCommand::KeyPressEvent)
63
vtkRenderWindowInteractor *rwi = this->View->GetRenderWindow()->GetInteractor();
64
char key = rwi->GetKeyCode();
66
if ( key=='i' || key=='I')
69
//mode = this->View->GetInterpolationMode();
70
//this->View->SetInterpolationMode((++mode)%2);
71
//this->View->Render();
78
if (event == vtkCommand::StartWindowLevelEvent) {
79
this->StartWindowing();
82
if (event == vtkCommand::EndWindowLevelEvent) {
86
if (event == vtkCommand::WindowLevelEvent) {
87
this->Windowing(GinkgoInteractorStyleImage2D::SafeDownCast(caller));
90
if (event == vtkCommand::ResetWindowLevelEvent) {
91
//this->View->SyncResetWindowLevel();
92
//std::cout << "GinkgoImageCommand::ResetWindowLevelEvent()" << std::endl;
93
this->View->ResetToDefaultWindowLevel();
94
this->View->SyncSetWindow ( this->View->GetWindow() );
95
this->View->SyncSetLevel ( this->View->GetLevel() );
99
if (event == GinkgoImageCommand::ResetPositionEvent) {
100
//std::cout << "GinkgoImageCommand::ResetPositionEvent()" << std::endl;
101
//this->View->SyncResetCurrentPoint();
102
//this->View->Render();
105
if (event == GinkgoImageCommand::ZoomEvent) {
106
//std::cout << "GinkgoImageCommand::ZoomEvent()" << std::endl;
107
this->Zoom(GinkgoInteractorStyleImage2D::SafeDownCast(caller));
110
if (event == GinkgoImageCommand::ResetZoomEvent) {
111
//std::cout << "GinkgoImageCommand::ResetZoomEvent()" << std::endl;
112
//this->View->SyncResetZoom();
113
//this->View->Render();
116
if (event == vtkCommand::StartPickEvent) {
117
this->StartPicking(vtkInteractorStyleImage::SafeDownCast(caller));
120
if (event == vtkCommand::EndPickEvent) {
121
this->EndPicking(/*static_cast<vtkInteractorStyleImage *>(caller)*/);
124
if (event == GinkgoImageCommand::StartMeasureEvent) {
125
//std::cout<<"StartMeasureEvent\n";
128
if (event == GinkgoImageCommand::MeasureEvent) {
129
//std::cout<<"MeasureEvent\n";
132
if (event == GinkgoImageCommand::EndMeasureEvent) {
133
//std::cout<<"EndMeasureEvent\n";
136
if (event == GinkgoImageCommand::StartZSliceMoveEvent) {
139
if (event == GinkgoImageCommand::ZSliceMoveEvent) {
140
this->ChangeZSlice(GinkgoInteractorStyleImage2D::SafeDownCast(caller));
143
if (event == GinkgoImageCommand::EndZSliceMoveEvent) {
146
if (event == GinkgoImageCommand::FullPageEvent) {
153
GinkgoImageCommand::StartWindowing()
155
this->InitialWindow = this->View->GetColorWindow();
156
this->InitialLevel = this->View->GetColorLevel();
160
GinkgoImageCommand::Windowing(GinkgoInteractorStyleImage2D* p_isi)
168
double window = this->InitialWindow;
169
double level = this->InitialLevel;
173
double dx = p_isi->GetWindowStep();
174
double dy = p_isi->GetLevelStep();
176
// Scale by current values
177
if (fabs(window) > EPS)
183
dx = dx * (window < 0 ? -EPS : EPS);
186
if (fabs(level) > EPS)
192
dy = dy * (level < 0 ? -EPS : EPS);
195
// Abs so that direction does not flip
205
// Compute new window level
206
double newWindow = dx + window;
207
double newLevel = level - dy;
209
// Stay away from zero and really
210
if (fabs(newWindow) < EPS)
212
newWindow = EPS * (newWindow < 0 ? -1 : 1);
215
if (fabs(newLevel) < EPS)
217
newLevel = EPS * (newLevel < 0 ? -1 : 1);
220
this->View->SyncSetWindow(newWindow);
221
this->View->SyncSetLevel(newLevel);
222
this->View->Modified();
226
GinkgoImageCommand::EndWindowing()
231
GinkgoImageCommand::StartPicking(vtkInteractorStyleImage* p_isi)
233
vtkRenderWindowInteractor *rwi = p_isi->GetInteractor();
234
vtkAssemblyPath *path=NULL;
235
p_isi->FindPokedRenderer(rwi->GetEventPosition()[0],
236
rwi->GetEventPosition()[1]);
237
rwi->GetPicker()->Pick(rwi->GetEventPosition()[0],
238
rwi->GetEventPosition()[1], 0.0,
239
p_isi->GetCurrentRenderer());
240
vtkAbstractPropPicker *picker;
241
if ( (picker=vtkAbstractPropPicker::SafeDownCast(rwi->GetPicker())) )
243
path = picker->GetPath();
248
double* world = picker->GetPickPosition();
250
double pos[3] = {0.0, 0.0, 0.0};
251
//this->View->GetCurrentPoint(pos);
253
//double* imBounds = this->View->GetImage()->GetBounds();
255
switch(this->View->GetOrientation())
257
case vtkGinkgoImageViewer::SAGITTAL_ID:
259
pos [1] = world[0];//*1.0;
260
pos [2] = world[1];//*1.0;
264
case vtkGinkgoImageViewer::CORONAL_ID:
266
if( this->View->GetConventions() == vtkGinkgoImageViewer::RADIOLOGIC )
268
pos [0] = world[0];//*-1.0;
272
pos [0] = world[0]*-1.0;
278
case vtkGinkgoImageViewer::AXIAL_ID:
280
if( this->View->GetConventions() == vtkGinkgoImageViewer::RADIOLOGIC )
286
pos [0] = world[0]*-1.0;
288
pos [1] = world[1]*-1.0;
293
// Treat extrem positions
294
int range[3][2] = {{0, 0}, {0, 0}, {0, 0}};
295
this->View->GetSliceRange(vtkGinkgoImageViewer::X, range[0]);
296
this->View->GetSliceRange(vtkGinkgoImageViewer::Y, range[1]);
297
this->View->GetSliceRange(vtkGinkgoImageViewer::Z, range[2]);
299
for (unsigned int i=0; i<3; i++)
301
if (pos[i] < range[i][0]) {
302
pos[i] = range[i][0] + 0.0005;
304
if (pos[i] > range[i][1]) {
305
pos[i] = range[i][1] - 0.0005;
310
//this->View->SyncSetCurrentPoint(pos);
311
//this->View->Modified();
317
GinkgoImageCommand::EndPicking()
322
GinkgoImageCommand::ChangeZSlice(GinkgoInteractorStyleImage2D* /*p_isi*/)
331
int p_nbSlices = p_isi->GetZSliceStep();
333
int current_slice = 0;
334
int dest_slice = current_slice + p_nbSlices;
335
//int min_slice = this->View->GetWholeZMin();
336
//int max_slice = this->View->GetWholeZMax();
339
this->View->GetPositionForSlice ( dest_slice, this->View->GetOrientation(), pos);
340
//this->View->SyncSetPosition (pos);
342
if ((dest_slice > min_slice) && (dest_slice < max_slice)) {
343
this->View->GetPositionForSlice ( dest_slice, this->View->GetOrientation(), pos);
344
//this->View->SyncSetSlice(this->View->GetOrientation(), dest_slice);
346
if ((dest_slice >= max_slice) && (current_slice != max_slice)) {
347
this->View->GetPositionForSlice ( max_slice, this->View->GetOrientation(), pos);
348
//this->View->SyncSetSlice(this->View->GetOrientation(), max_slice);
350
if ((dest_slice <= min_slice) && (current_slice != min_slice)) {
351
this->View->GetPositionForSlice ( min_slice, this->View->GetOrientation(), pos);
352
//this->View->SyncSetSlice(this->View->GetOrientation(), min_slice);
355
//this->View->Modified();
361
GinkgoImageCommand::SetView(vtkGinkgoImageViewer *p_view)
369
GinkgoImageCommand::Zoom (vtkInteractorStyleImage* p_isi)
376
vtkRenderWindowInteractor *rwi = p_isi->GetInteractor();
378
// vtkAssemblyPath *path=NULL;
379
p_isi->FindPokedRenderer(rwi->GetEventPosition()[0],
380
rwi->GetEventPosition()[1]);
382
double *center = p_isi->GetCurrentRenderer()->GetCenter();
383
int dy = rwi->GetEventPosition()[1] - rwi->GetLastEventPosition()[1];
385
double factor = 10.0 * (double)(dy) / (double)(center[1]);
387
//this->View->SyncSetZoom ( pow((double)1.1, factor) );
388
this->View->SyncSetZoom ( pow((double)1.1, factor)*this->View->GetZoom() );
389
this->View->Modified();