1 /*=========================================================================
3 Module: $RCSfile: bbvtkImagePlanes.cxx,v $
5 Date: $Date: 2009/05/15 14:58:01 $
6 Version: $Revision: 1.24 $
7 =========================================================================*/
9 /* ---------------------------------------------------------------------
11 * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale)
12 * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux
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.
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
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 * ------------------------------------------------------------------------ */
37 #include "bbvtkImagePlanes.h"
38 #include "bbvtkPackage.h"
39 #include "vtkCellPicker.h"
40 #include "vtkProperty.h"
42 #include "vtkMetaImageWriter.h"
43 #include "vtkPNGWriter.h"
45 #include "bbstdCast.h"
46 #include <vtkCommand.h>
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"
56 //#include "vtkRenderer.h"
57 //#include "vtkCamera.h"
59 #include "vtkPlaneWidget.h"
61 #include "bbstdRelay.h"
63 #include "vtkObjectFactory.h"
69 //====================================================================
70 BBTK_BLACK_BOX_TEMPLATE2_IMPLEMENTATION(Cast,
71 bbtk::AtomicBlackBox);
72 //====================================================================
73 //====================================================================
74 // BBTK_BLACK_BOX_TEMPLATE_IMPLEMENTATION(Relay,
75 // bbtk::AtomicBlackBox);
76 //====================================================================
79 using namespace bbstd;
83 typedef vtkImageData::Pointer vtkImageDataPointer;
84 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(vtkImageDataPointer,
85 "vtkImageDataPointer");
92 //====================================================================
93 // Add the specialized adaptors to the package
94 typedef vtkImagePlaneWidget* I;
95 typedef vtkInteractorObserver* O;
97 BBTK_ADD_TEMPLATE2_BLACK_BOX_TO_PACKAGE(vtk,Cast,I,O);
99 BBTK_DEFINE_RELAY_BLACK_BOX(vtkImageDataPointer,vtk,vtkImageDataPointerRelay);
100 BBTK_BLACK_BOX_IMPLEMENTATION(vtkImageDataPointerRelay,bbtk::AtomicBlackBox);
102 BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,vtkImageDataPointerRelay);
103 // BBTK_ADD_TEMPLATE_BLACK_BOX_TO_PACKAGE(vtk,Relay,vtkImageDataPointer);
111 //================================================================
112 class ImagePlanes::VtkCallbackType : public vtkCommand
115 static VtkCallbackType *New()
117 return new VtkCallbackType;
119 //vtkTypeRevisionMacro(VtkCallbackType,vtkCommand);
121 virtual void Execute(vtkObject *caller, unsigned long, void*)
123 mBlackBox->Process();
124 mBlackBox->bbSignalOutputModification();
126 void SetBlackBox(ImagePlanes *BB) { mBlackBox = BB;};
127 // void SetVtkPlaneWidget( vtkImagePlaneWidget *planeWidget );
128 VtkCallbackType() {};
131 // vtkPlaneWidget *planeWidget;
132 ImagePlanes *mBlackBox;
134 //================================================================
136 //vtkCxxRevisionMacro(ImagePlanes::VtkCallbackType, "$Revision: 1.24 $");
138 //================================================================
140 BBTK_ADD_BLACK_BOX_TO_PACKAGE(vtk,ImagePlanes)
141 BBTK_BLACK_BOX_IMPLEMENTATION(ImagePlanes,bbtk::AtomicBlackBox);
145 void ImagePlanes::bbUserSetDefaultValues()
147 bbSetOutputPlaneX(0);
148 bbSetOutputPlaneY(0);
149 bbSetOutputPlaneZ(0);
150 bbSetOutputImageX(0);
151 bbSetOutputImageY(0);
152 bbSetOutputImageZ(0);
154 std::vector<double> vect;
157 bbSetInputWindowLevel (vect);
163 void ImagePlanes::bbUserInitializeProcessing()
166 /// CREATION DES WIDGETS
167 if (bbGetOutputPlaneX() != 0) return;
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);
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);
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());
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());
198 bbSetOutputPlaneX(planeWidgetX);
199 bbSetOutputPlaneY(planeWidgetY);
200 bbSetOutputPlaneZ(planeWidgetZ);
201 bbSetOutputImageX(planeWidgetX->GetResliceOutput());
202 bbSetOutputImageY(planeWidgetY->GetResliceOutput());
203 bbSetOutputImageZ(planeWidgetZ->GetResliceOutput());
205 picker->UnRegister(NULL);
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);
214 //---------------------------------------------------------------------
215 void ImagePlanes::bbUserFinalizeProcessing()
217 if (bbGetOutputPlaneX())
219 bbGetOutputPlaneX()->SetInput(NULL);
220 // if (mVtkCallback) bbGetOutputPlaneX()->RemoveObserver(mVtkCallback);
221 bbGetOutputPlaneX()->Delete();
223 if (bbGetOutputPlaneY())
225 bbGetOutputPlaneY()->SetInput(NULL);
226 // if (mVtkCallback) bbGetOutputPlaneY()->RemoveObserver(mVtkCallback);
227 bbGetOutputPlaneY()->Delete();
229 if (bbGetOutputPlaneZ())
231 bbGetOutputPlaneZ()->SetInput(NULL);
232 // if (mVtkCallback) bbGetOutputPlaneZ()->RemoveObserver(mVtkCallback);
233 bbGetOutputPlaneZ()->Delete();
237 // mVtkCallback->Delete();
241 //---------------------------------------------------------------------
242 void ImagePlanes::Process()
244 if (bbGetInputIn()!=0)
247 if ( bbGetInputStatus("In") != bbtk::UPTODATE )
249 // Input image has changed : reinitialize planes
250 image = bbGetInputIn();
252 int xMin, xMax, yMin, yMax, zMin, zMax;
253 bbGetInputIn()->GetExtent(xMin, xMax, yMin, yMax, zMin, zMax);
255 // Initial values : center of the volume (in real world, not in pixels!)
256 double xSpacing, ySpacing, zSpacing;
257 bbGetInputIn()->GetSpacing(xSpacing, ySpacing, zSpacing);
259 bbGetOutputPlaneX()->SetInput(bbGetInputIn());
260 bbGetOutputPlaneX()->SetPlaneOrientationToXAxes();
261 bbGetOutputPlaneX()->SetSlicePosition((xMax+xMin)/2.*xSpacing);
263 bbGetOutputPlaneY()->SetInput(bbGetInputIn());
264 bbGetOutputPlaneY()->SetPlaneOrientationToYAxes();
265 bbGetOutputPlaneY()->SetSlicePosition((yMax+yMin)/2.*ySpacing);
267 bbGetOutputPlaneZ()->SetInput(bbGetInputIn());
268 bbGetOutputPlaneZ()->SetPlaneOrientationToZAxes();
269 bbGetOutputPlaneZ()->SetSlicePosition((zMax+zMin)/2.*zSpacing);
271 if (bbGetInputWindowLevel()[0]!=0)
273 bbGetOutputPlaneZ()->SetWindowLevel(bbGetInputWindowLevel()[0],
274 bbGetInputWindowLevel()[1]);
278 double *range = image->GetScalarRange();
279 bbGetOutputPlaneZ()->SetWindowLevel(range[1] - range[0],
280 0.5*(range[1]+range[0]));
284 // UPDATE DES SORTIES
285 bbGetOutputPlaneX()->GetResliceOutput()->Update();
286 bbGetOutputPlaneY()->GetResliceOutput()->Update();
287 bbGetOutputPlaneZ()->GetResliceOutput()->Update();
292 //-----------------------------------------------------------------
293 void vtkImageDataPointerRelay::bbUserSetDefaultValues()
297 //-----------------------------------------------------------------
298 void vtkImageDataPointerRelay::bbUserInitializeProcessing()
302 //-----------------------------------------------------------------
303 void vtkImageDataPointerRelay::bbUserFinalizeProcessing()