]> Creatis software - bbtk.git/blob - packages/vtk/src/bbvtkImagePlanes.cxx
*** empty log message ***
[bbtk.git] / packages / vtk / src / bbvtkImagePlanes.cxx
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbvtkImagePlanes.cxx,v $
4   Language:  C++
5   Date:      $Date: 2009/03/12 09:36:21 $
6   Version:   $Revision: 1.21 $
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.21 $");
137
138
139   //================================================================
140
141    BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,ImagePlanes)
142    BBTK_BLACK_BOX_IMPLEMENTATION(ImagePlanes,bbtk::AtomicBlackBox);
143
144    void ImagePlanes::bbUserConstructor() 
145    { 
146      bbSetOutputPlaneX(0);
147      bbSetOutputPlaneY(0);
148      bbSetOutputPlaneZ(0);
149      bbSetOutputImageX(0);
150      bbSetOutputImageY(0);
151      bbSetOutputImageZ(0);
152      bbSetInputIn(0);
153      std::vector<double> vect;
154      vect.push_back(0);
155      vect.push_back(0);
156      bbSetInputWindowLevel (vect);  
157      mVtkCallback = 0;
158    }
159    
160    void ImagePlanes::bbUserCopyConstructor(bbtk::BlackBox::Pointer) 
161    { 
162      bbSetOutputPlaneX(0);
163      bbSetOutputPlaneY(0);
164      bbSetOutputPlaneZ(0);
165      bbSetOutputImageX(0);
166      bbSetOutputImageY(0);
167      bbSetOutputImageZ(0);
168      mVtkCallback = 0;
169    }
170
171    void ImagePlanes::Init() 
172    {  
173
174      /// CREATION DES WIDGETS
175      if (bbGetOutputPlaneX() != 0) return;
176        
177      // The shared picker enables us to use 3 planes at one time
178      // and gets the picking order right
179      vtkCellPicker* picker = vtkCellPicker::New();
180      picker->SetTolerance(0.005);
181   
182      // The 3 image plane widgets 
183      vtkImagePlaneWidget* planeWidgetX = vtkImagePlaneWidget::New();
184      planeWidgetX->DisplayTextOn();
185      planeWidgetX->SetPicker(picker);
186      planeWidgetX->SetKeyPressActivationValue('x');
187      vtkProperty* prop1 = planeWidgetX->GetPlaneProperty();
188      prop1->SetColor(1, 0, 0);
189
190      vtkImagePlaneWidget* planeWidgetY = vtkImagePlaneWidget::New();
191      planeWidgetY->DisplayTextOn();
192      planeWidgetY->SetPicker(picker);
193      planeWidgetY->SetKeyPressActivationValue('y');
194      vtkProperty* prop2 = planeWidgetY->GetPlaneProperty();
195      prop2->SetColor(1, 1, 0);
196      planeWidgetY->SetLookupTable(planeWidgetX->GetLookupTable());
197
198      vtkImagePlaneWidget* planeWidgetZ = vtkImagePlaneWidget::New();
199      planeWidgetZ->DisplayTextOn();
200      planeWidgetZ->SetPicker(picker);
201      planeWidgetZ->SetKeyPressActivationValue('z');
202      vtkProperty* prop3 = planeWidgetZ->GetPlaneProperty();
203      prop3->SetColor(0, 0, 1);
204      planeWidgetZ->SetLookupTable(planeWidgetX->GetLookupTable());
205
206      bbSetOutputPlaneX(planeWidgetX);
207      bbSetOutputPlaneY(planeWidgetY);
208      bbSetOutputPlaneZ(planeWidgetZ);
209      bbSetOutputImageX(planeWidgetX->GetResliceOutput());
210      bbSetOutputImageY(planeWidgetY->GetResliceOutput());
211      bbSetOutputImageZ(planeWidgetZ->GetResliceOutput());
212
213      picker->UnRegister(NULL);
214      
215      mVtkCallback = VtkCallbackType::New();
216      mVtkCallback->SetBlackBox(this);
217      planeWidgetX->AddObserver(vtkCommand::InteractionEvent,mVtkCallback);
218      planeWidgetY->AddObserver(vtkCommand::InteractionEvent,mVtkCallback);
219      planeWidgetZ->AddObserver(vtkCommand::InteractionEvent,mVtkCallback);  
220    }
221
222 //---------------------------------------------------------------------
223   void ImagePlanes::bbUserDestructor()
224   {
225     if (bbGetOutputPlaneX()) 
226       {
227         bbGetOutputPlaneX()->SetInput(NULL);
228         bbGetOutputPlaneX()->RemoveObserver(mVtkCallback);
229         bbGetOutputPlaneX()->Delete();
230       }
231     if (bbGetOutputPlaneY()) 
232       {
233         bbGetOutputPlaneY()->SetInput(NULL);
234         bbGetOutputPlaneY()->RemoveObserver(mVtkCallback);
235         bbGetOutputPlaneY()->Delete();
236       }
237     if (bbGetOutputPlaneZ()) 
238       {
239         bbGetOutputPlaneZ()->SetInput(NULL);
240         bbGetOutputPlaneZ()->RemoveObserver(mVtkCallback);
241         bbGetOutputPlaneZ()->Delete();
242       }
243     if (mVtkCallback) 
244       {
245         mVtkCallback->Delete();
246       }
247   }
248   
249 //---------------------------------------------------------------------  
250    void ImagePlanes::Process()
251    {
252      if (bbGetInputIn()!=0)
253        {
254          // Create the widgets if not already done
255          Init();
256
257          if ( bbGetInputStatus("In") != bbtk::UPTODATE )
258            {
259              // Input image has changed : reinitialize planes
260              image = bbGetInputIn();
261
262              int xMin, xMax, yMin, yMax, zMin, zMax;
263              bbGetInputIn()->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
264              
265              // Initial values : center of the volume (in real world, not in pixels!)
266              double xSpacing, ySpacing, zSpacing;
267              bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing);
268           
269
270              bbGetOutputPlaneX()->SetInput(bbGetInputIn());
271              bbGetOutputPlaneX()->SetPlaneOrientationToXAxes();  
272              bbGetOutputPlaneX()->SetSlicePosition((xMax+xMin)/2.*xSpacing);
273              
274              bbGetOutputPlaneY()->SetInput(bbGetInputIn());
275              bbGetOutputPlaneY()->SetPlaneOrientationToYAxes();
276              bbGetOutputPlaneY()->SetSlicePosition((yMax+yMin)/2.*ySpacing);
277              
278              bbGetOutputPlaneZ()->SetInput(bbGetInputIn());
279              bbGetOutputPlaneZ()->SetPlaneOrientationToZAxes();
280              bbGetOutputPlaneZ()->SetSlicePosition((zMax+zMin)/2.*zSpacing);
281              
282              if (bbGetInputWindowLevel()[0]!=0)
283                {
284                  bbGetOutputPlaneZ()->SetWindowLevel(bbGetInputWindowLevel()[0],
285                                                      bbGetInputWindowLevel()[1]);
286                }
287              else 
288                {
289                  double *range = image->GetScalarRange();
290                  bbGetOutputPlaneZ()->SetWindowLevel(range[1] - range[0],
291                                                      0.5*(range[1]+range[0]));
292                }
293            }
294          
295          
296          // UPDATE DES SORTIES 
297          bbGetOutputPlaneX()->GetResliceOutput()->Update();
298          bbGetOutputPlaneY()->GetResliceOutput()->Update(); 
299          bbGetOutputPlaneZ()->GetResliceOutput()->Update(); 
300          
301                  
302        }
303    }
304 }//namespace bbtk
305
306 #endif // _USE_VTK_
307