]> Creatis software - bbtk.git/blob - packages/vtk/src/bbvtkImagePlanes.cxx
.
[bbtk.git] / packages / vtk / src / bbvtkImagePlanes.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbvtkImagePlanes.cxx,v $
4   Language:  C++
5   Date:      $Date: 2009/05/15 14:58:01 $
6   Version:   $Revision: 1.24 $
7 =========================================================================*/
8
9 /* ---------------------------------------------------------------------
10
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
13 *
14 *  This software is governed by the CeCILL-B license under French law and 
15 *  abiding by the rules of distribution of free software. You can  use, 
16 *  modify and/ or redistribute the software under the terms of the CeCILL-B 
17 *  license as circulated by CEA, CNRS and INRIA at the following URL 
18 *  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
19 *  or in the file LICENSE.txt.
20 *
21 *  As a counterpart to the access to the source code and  rights to copy,
22 *  modify and redistribute granted by the license, users are provided only
23 *  with a limited warranty  and the software's author,  the holder of the
24 *  economic rights,  and the successive licensors  have only  limited
25 *  liability. 
26 *
27 *  The fact that you are presently reading this means that you have had
28 *  knowledge of the CeCILL-B license and that you accept its terms.
29 * ------------------------------------------------------------------------ */                                                                         
30
31 /**
32  *  \file 
33  *  \brief 
34  */
35
36 #ifdef _USE_VTK_
37 #include "bbvtkImagePlanes.h"
38 #include "bbvtkPackage.h"
39 #include "vtkCellPicker.h"
40 #include "vtkProperty.h"
41
42 #include "vtkMetaImageWriter.h"
43 #include "vtkPNGWriter.h"
44
45 #include "bbstdCast.h"
46 #include <vtkCommand.h>
47
48 #include "vtkImageData.h"
49 //#include "vtkOutlineFilter.h"
50 //#include "vtkPolyDataMapper.h"
51 //#include "vtkActor.h"
52 #include "vtkImagePlaneWidget.h"
53 #include "vtkCellPicker.h"
54 //#include "vtkProperty.h"
55
56 //#include "vtkRenderer.h"
57 //#include "vtkCamera.h"
58
59 #include "vtkPlaneWidget.h"
60
61 #include "bbstdRelay.h"
62
63 #include "vtkObjectFactory.h"
64
65
66 namespace bbstd
67 {
68
69   //====================================================================
70   BBTK_BLACK_BOX_TEMPLATE2_IMPLEMENTATION(Cast,
71                                           bbtk::AtomicBlackBox);
72   //====================================================================
73   //====================================================================
74 //  BBTK_BLACK_BOX_TEMPLATE_IMPLEMENTATION(Relay,
75 //                                       bbtk::AtomicBlackBox);
76   //====================================================================
77
78 }
79 using namespace bbstd;
80 /*
81 namespace bbtk
82 {
83         typedef vtkImageData::Pointer vtkImageDataPointer;
84   BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(vtkImageDataPointer,
85                                        "vtkImageDataPointer");
86 }
87 */
88 namespace bbvtk
89 {
90
91
92   //====================================================================
93   // Add the specialized adaptors to the package
94   typedef vtkImagePlaneWidget* I;
95   typedef vtkInteractorObserver* O;
96
97   BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(vtk,Cast,I,O);
98
99   BBTK_DEFINE_RELAY_BLACK_BOX(vtkImageDataPointer,vtk,vtkImageDataPointerRelay);
100   BBTK_BLACK_BOX_IMPLEMENTATION(vtkImageDataPointerRelay,bbtk::AtomicBlackBox);
101
102   BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,vtkImageDataPointerRelay);
103  // BBTK_ADD_TEMPLATE_BLACK_BOX_TO_PACKAGE(vtk,Relay,vtkImageDataPointer);
104   //Pointer);
105
106 }
107
108 namespace bbvtk
109 {
110
111   //================================================================
112  class ImagePlanes::VtkCallbackType : public vtkCommand
113  {
114  public:
115    static VtkCallbackType *New()
116    {
117      return new VtkCallbackType;
118    }
119    //vtkTypeRevisionMacro(VtkCallbackType,vtkCommand);
120
121    virtual void Execute(vtkObject *caller, unsigned long, void*)
122    {
123        mBlackBox->Process();
124        mBlackBox->bbSignalOutputModification();
125    } 
126    void SetBlackBox(ImagePlanes *BB) { mBlackBox = BB;};    
127    //   void SetVtkPlaneWidget( vtkImagePlaneWidget *planeWidget );
128    VtkCallbackType() {};
129
130  private:
131    //   vtkPlaneWidget *planeWidget;
132    ImagePlanes *mBlackBox;
133  };
134   //================================================================
135
136   //vtkCxxRevisionMacro(ImagePlanes::VtkCallbackType, "$Revision: 1.24 $");
137
138   //================================================================
139
140    BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,ImagePlanes)
141    BBTK_BLACK_BOX_IMPLEMENTATION(ImagePlanes,bbtk::AtomicBlackBox);
142
143         
144         
145    void ImagePlanes::bbUserSetDefaultValues() 
146    { 
147      bbSetOutputPlaneX(0);
148      bbSetOutputPlaneY(0);
149      bbSetOutputPlaneZ(0);
150      bbSetOutputImageX(0);
151      bbSetOutputImageY(0);
152      bbSetOutputImageZ(0);
153      bbSetInputIn(0);
154      std::vector<double> vect;
155      vect.push_back(0);
156      vect.push_back(0);
157      bbSetInputWindowLevel (vect);  
158      mVtkCallback = 0;
159    }
160    
161
162         
163    void ImagePlanes::bbUserInitializeProcessing() 
164    {  
165
166      /// CREATION DES WIDGETS
167      if (bbGetOutputPlaneX() != 0) return;
168        
169      // The shared picker enables us to use 3 planes at one time
170      // and gets the picking order right
171      vtkCellPicker* picker = vtkCellPicker::New();
172      picker->SetTolerance(0.005);
173   
174      // The 3 image plane widgets 
175      vtkImagePlaneWidget* planeWidgetX = vtkImagePlaneWidget::New();
176      planeWidgetX->DisplayTextOn();
177      planeWidgetX->SetPicker(picker);
178      planeWidgetX->SetKeyPressActivationValue('x');
179      vtkProperty* prop1 = planeWidgetX->GetPlaneProperty();
180      prop1->SetColor(1, 0, 0);
181
182      vtkImagePlaneWidget* planeWidgetY = vtkImagePlaneWidget::New();
183      planeWidgetY->DisplayTextOn();
184      planeWidgetY->SetPicker(picker);
185      planeWidgetY->SetKeyPressActivationValue('y');
186      vtkProperty* prop2 = planeWidgetY->GetPlaneProperty();
187      prop2->SetColor(1, 1, 0);
188      planeWidgetY->SetLookupTable(planeWidgetX->GetLookupTable());
189
190      vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New();
191      planeWidgetZ->DisplayTextOn();
192      planeWidgetZ->SetPicker(picker);
193      planeWidgetZ->SetKeyPressActivationValue('z');
194      vtkProperty* prop3 = planeWidgetZ->GetPlaneProperty();
195      prop3->SetColor(0, 0, 1);
196      planeWidgetZ->SetLookupTable(planeWidgetX->GetLookupTable());
197
198      bbSetOutputPlaneX(planeWidgetX);
199      bbSetOutputPlaneY(planeWidgetY);
200      bbSetOutputPlaneZ(planeWidgetZ);
201      bbSetOutputImageX(planeWidgetX->GetResliceOutput());
202      bbSetOutputImageY(planeWidgetY->GetResliceOutput());
203      bbSetOutputImageZ(planeWidgetZ->GetResliceOutput());
204
205      picker->UnRegister(NULL);
206      
207      mVtkCallback = VtkCallbackType::New();
208      mVtkCallback->SetBlackBox(this);
209      planeWidgetX->AddObserver(vtkCommand::InteractionEvent,mVtkCallback);
210      planeWidgetY->AddObserver(vtkCommand::InteractionEvent,mVtkCallback);
211      planeWidgetZ->AddObserver(vtkCommand::InteractionEvent,mVtkCallback);  
212    }
213
214 //---------------------------------------------------------------------
215   void ImagePlanes::bbUserFinalizeProcessing()
216   {
217     if (bbGetOutputPlaneX()) 
218       {
219         bbGetOutputPlaneX()->SetInput(NULL);
220         //      if (mVtkCallback) bbGetOutputPlaneX()->RemoveObserver(mVtkCallback);
221         bbGetOutputPlaneX()->Delete();
222       }
223     if (bbGetOutputPlaneY()) 
224       {
225         bbGetOutputPlaneY()->SetInput(NULL);
226         //      if (mVtkCallback) bbGetOutputPlaneY()->RemoveObserver(mVtkCallback);
227         bbGetOutputPlaneY()->Delete();
228       }
229     if (bbGetOutputPlaneZ()) 
230       {
231         bbGetOutputPlaneZ()->SetInput(NULL);
232         //      if (mVtkCallback) bbGetOutputPlaneZ()->RemoveObserver(mVtkCallback);
233         bbGetOutputPlaneZ()->Delete();
234       }
235     if (mVtkCallback) 
236       {
237         //      mVtkCallback->Delete();
238       }
239   }
240   
241 //---------------------------------------------------------------------  
242    void ImagePlanes::Process()
243    {
244      if (bbGetInputIn()!=0)
245        {
246
247          if ( bbGetInputStatus("In") != bbtk::UPTODATE )
248            {
249              // Input image has changed : reinitialize planes
250              image = bbGetInputIn();
251
252              int xMin, xMax, yMin, yMax, zMin, zMax;
253              bbGetInputIn()->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
254              
255              // Initial values : center of the volume (in real world, not in pixels!)
256              double xSpacing, ySpacing, zSpacing;
257              bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing);
258           
259              bbGetOutputPlaneX()->SetInput(bbGetInputIn());
260              bbGetOutputPlaneX()->SetPlaneOrientationToXAxes();  
261              bbGetOutputPlaneX()->SetSlicePosition((xMax+xMin)/2.*xSpacing);
262              
263              bbGetOutputPlaneY()->SetInput(bbGetInputIn());
264              bbGetOutputPlaneY()->SetPlaneOrientationToYAxes();
265              bbGetOutputPlaneY()->SetSlicePosition((yMax+yMin)/2.*ySpacing);
266              
267              bbGetOutputPlaneZ()->SetInput(bbGetInputIn());
268              bbGetOutputPlaneZ()->SetPlaneOrientationToZAxes();
269              bbGetOutputPlaneZ()->SetSlicePosition((zMax+zMin)/2.*zSpacing);
270              
271              if (bbGetInputWindowLevel()[0]!=0)
272                {
273                  bbGetOutputPlaneZ()->SetWindowLevel(bbGetInputWindowLevel()[0],
274                                                      bbGetInputWindowLevel()[1]);
275                }
276              else 
277                {
278                  double *range = image->GetScalarRange();
279                  bbGetOutputPlaneZ()->SetWindowLevel(range[1] - range[0],
280                                                      0.5*(range[1]+range[0]));
281                }
282            }     
283          
284          // UPDATE DES SORTIES 
285          bbGetOutputPlaneX()->GetResliceOutput()->Update();
286          bbGetOutputPlaneY()->GetResliceOutput()->Update(); 
287          bbGetOutputPlaneZ()->GetResliceOutput()->Update();              
288        }
289    }
290         
291         
292         //-----------------------------------------------------------------     
293         void vtkImageDataPointerRelay::bbUserSetDefaultValues()
294         {
295         }
296         
297         //-----------------------------------------------------------------     
298         void vtkImageDataPointerRelay::bbUserInitializeProcessing()
299         {
300         }
301         
302         //-----------------------------------------------------------------     
303         void vtkImageDataPointerRelay::bbUserFinalizeProcessing()
304         {
305         }
306         
307         
308         
309 }//namespace bbtk
310
311 #endif // _USE_VTK_
312