1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
23 #include "vvLandmarks.h"
26 #include "vvMeshActor.h"
28 #include <vtkSmartPointer.h>
29 #include <vtkImageViewer2.h>
30 #include <vtkImageReslice.h>
31 #include <vtkImageMapToColors.h>
36 class vtkPolyDataMapper2D;
38 class vtkClipPolyData;
40 class vvBlendImageActor;
42 class vtkCornerAnnotation;
44 class vtkPolyDataMapper2D;
45 class vtkPolyDataMapper;
51 class vtkAssignAttribute;
52 class vtkScalarBarActor;
54 class vtkImageReslice;
56 class vvSlicer: public vtkImageViewer2
59 static vvSlicer *New();
60 vtkTypeRevisionMacro(vvSlicer,vtkImageViewer2);
61 void PrintSelf(ostream& os, vtkIndent indent);
63 void SetImage(vvImage::Pointer inputImages);
64 vvImage::Pointer GetImage() {
68 void SetOverlay(vvImage::Pointer inputOverlay);
69 vvImage::Pointer GetOverlay() {
72 vtkImageMapToWindowLevelColors* GetOverlayMapper();
73 vvBlendImageActor* GetOverlayActor() ;
74 vtkImageMapToColors* GetFusionMapper() ;
75 vtkImageActor* GetFusionActor() ;
76 vtkActor* GetVFActor() ;
77 vtkCornerAnnotation* GetAnnotation();
79 void SetFusion(vvImage::Pointer inputFusion);
80 vvImage::Pointer GetFusion() {
83 void ShowFusionLegend(bool show) { showFusionLegend = show; }
85 /**Get/Set an actor's visibility ("overlay, fusion, vf, contour...")
86 Overlay index is the index of the overlay by type, eg. if there are
87 5 contours and we want to activate the 3rd one, pass 2 **/
88 bool GetActorVisibility(const std::string& actor_type, int overlay_index);
89 void SetActorVisibility(const std::string& actor_type, int overlay_index,bool vis);
90 void RemoveActor(const std::string& actor_type, int overlay_index);
92 void SetVF(vvImage::Pointer vf);
97 void SetLandmarks(vvLandmarks* landmarks);
98 void SetTSlice(int t);
99 void SetSliceOrientation(int orientation);
100 void AdjustResliceToSliceOrientation(vtkImageReslice *reslice);
102 ///Reimplemented from vtkImageViewer2 to add polydata support
103 void SetSlice(int s);
105 return (unsigned int)mImage->GetVTKImages().size() - 1;
108 void SetOpacity(double s);
109 void SetRenderWindow(int orientation, vtkRenderWindow * rw);
110 void SetDisplayMode(bool i);
111 void FlipHorizontalView();
112 void FlipVerticalView();
113 static double GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int &ix, int &iy, int &iz, int component=0);
115 ///Sets the camera to fit the image in the window
118 void SetVFSubSampling(int sub);
119 int GetVFSubSampling() {
122 void SetVFScale(int scale);
123 void SetVFWidth(int width);
127 void SetVFLog(int log);
132 void SetFileName(std::string filename) {
133 mFileName = filename;
135 std::string GetFileName() {
139 double* GetCursorPosition() {
143 vtkTransform * GetSlicingTransform() { return mSlicingTransform; }
144 vtkTransform * GetConcatenatedTransform() { return mConcatenatedTransform; }
146 void SetCurrentPosition(double x, double y, double z, int t);
147 double* GetCurrentPosition();
149 void UpdateCursorPosition();
150 void SetCursorVisibility(bool s);
152 bool GetCursorVisibility();
153 void SetCursorColor(int r,int g, int b);
155 void SetCornerAnnotationVisibility(bool s);
156 bool GetCornerAnnotationVisibility();
158 void GetExtremasAroundMousePointer(double & min, double & max, vtkImageData *image, vtkTransform *transform);
160 void UpdateLandmarks();
161 void ForceUpdateDisplayExtent();
163 int* GetDisplayExtent();
164 /**Add a polydata to be displayed as a contour over the image
165 ** the contour can be propagated to a time sequence using a motion field */
166 void AddContour(vvMesh::Pointer contours,bool propagate);
167 ///Toggle temporal superposition of contours
168 void ToggleContourSuperposition();
170 virtual void SetColorWindow(double s);
171 virtual void SetColorLevel(double s);
173 double GetOverlayColorWindow();
174 double GetOverlayColorLevel();
175 bool GetLinkOverlayWindowLevel() { return mLinkOverlayWindowLevel; }
177 void SetOverlayColorWindow(double s);
178 void SetOverlayColorLevel(double s);
179 void SetLinkOverlayWindowLevel(bool b) { mLinkOverlayWindowLevel = b; }
182 * When it is enabled, beware of a call to GetExtent.
183 * we must have setted mReducedExtent otherwhise random values
184 * are returned by GetExtent
186 void EnableReducedExtent(bool b);
187 void SetReducedExtent(int * ext);
189 void ClipDisplayedExtent(int extent[6], int refExtent[6]);
190 int GetOrientation();
193 double* GetVFColor() {
196 void SetVFColor(double r, double g, double b);
202 std::string mFileName;
203 vvImage::Pointer mImage;
204 vvImage::Pointer mOverlay;
205 vvImage::Pointer mFusion;
206 vvImage::Pointer mVF;
208 vvLandmarks* mLandmarks;
210 vtkSmartPointer<vtkImageReslice> mImageReslice;
211 vtkSmartPointer<vtkTransform> mSlicingTransform;
212 vtkSmartPointer<vtkTransform> mConcatenatedTransform;
213 vtkSmartPointer<vtkImageReslice> mOverlayReslice;
214 vtkSmartPointer<vtkImageMapToWindowLevelColors> mOverlayMapper;
215 vtkSmartPointer<vvBlendImageActor> mOverlayActor;
216 vtkSmartPointer<vtkImageReslice> mFusionReslice;
217 vtkSmartPointer<vtkImageMapToColors> mFusionMapper;
218 vtkSmartPointer<vtkImageActor> mFusionActor;
219 vtkSmartPointer<vtkCornerAnnotation> ca;
220 vtkSmartPointer<vtkCursor2D> crossCursor;
221 vtkSmartPointer<vtkPolyDataMapper2D> pdm;
222 vtkSmartPointer<vtkActor2D> pdmA;
223 vtkSmartPointer<vvGlyphSource> mArrow;
224 vtkSmartPointer<vtkAssignAttribute> mAAFilter;
225 vtkSmartPointer<vtkExtractVOI> mVOIFilter;
226 vtkSmartPointer<vvGlyph2D> mGlyphFilter;
227 vtkSmartPointer<vtkPolyDataMapper> mVFMapper;
228 vtkSmartPointer<vtkLookupTable> mVFColorLUT;
229 vtkSmartPointer<vtkActor> mVFActor;
230 vtkSmartPointer<vtkGlyph3D> mLandGlyph;
231 vtkSmartPointer<vtkCursor3D> mCross;
232 vtkSmartPointer<vtkClipPolyData> mLandClipper;
233 vtkSmartPointer<vtkPolyDataMapper> mLandMapper;
234 vtkSmartPointer<vtkActor> mLandActor;
235 vtkSmartPointer<vtkBox> mClipBox;
236 vtkSmartPointer<vtkScalarBarActor> legend;
237 std::vector<vvMeshActor*> mSurfaceCutActors;
241 double mCurrentBeforeSlicingTransform[3];
248 bool mUseReducedExtent;
249 int * mReducedExtent;
250 int * mInitialExtent;
251 bool mLinkOverlayWindowLevel;
252 bool showFusionLegend;
255 void UpdateOrientation();
256 void UpdateDisplayExtent();
257 void ConvertImageToImageDisplayExtent(vtkImageData *sourceImage, const int sourceExtent[6],
258 vtkImageData *targetImage, int targetExtent[6]);
259 ///Sets the surfaces to be cut on the image slice: update the vtkCutter
260 void SetContourSlice();