]> Creatis software - clitk.git/blob - vv/vvSlicerManager.h
improved the FusionSequence visualization mode, by linking to the 2nd sequence (US).
[clitk.git] / vv / vvSlicerManager.h
1
2 /*=========================================================================
3   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
4
5   Authors belong to: 
6   - University of LYON              http://www.universite-lyon.fr/
7   - Léon Bérard cancer center       http://www.centreleonberard.fr
8   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
9
10   This software is distributed WITHOUT ANY WARRANTY; without even
11   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12   PURPOSE.  See the copyright notices for more information.
13
14   It is distributed under dual licence
15
16   - BSD        See included LICENSE.txt file
17   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
18   ===========================================================================**/
19
20 #ifndef VVSLICERMANAGER_H
21 #define VVSLICERMANAGER_H
22
23 // std
24 #include <iostream>
25 #include <vector>
26 #include <string>
27
28 // QT
29 #include <QObject>
30
31 // VTK
32 #include <vtksys/SystemTools.hxx>
33 class vtkImageData;
34 class vtkInteractorStyle;
35 class vtkRenderWindow;
36 class vtkPolyData;
37
38 // VV
39 #include "clitkCommon.h"
40 #include "vvImage.h"
41 #include "vvMesh.h"
42 #include "vvImageReader.h"
43
44 class vvSlicer;
45 class vvInteractorStyleNavigator;
46 class vvImageReader;
47 class vvImageReader;
48 class vvLandmarks;
49
50 //------------------------------------------------------------------------------
51 class vvSlicerManager : public QObject {
52   Q_OBJECT
53
54   public:
55   typedef enum {WORLD_SLICING, VOXELS_SLICING} SlicingPresetType;
56   vvSlicerManager(int numberOfSlicers);
57   ~vvSlicerManager();
58
59   std::string GetLastError() {
60     return mLastError;
61   }
62
63   bool SetImage(std::string filename, vvImageReader::LoadedImageType type, int n=0, unsigned int slice=0);
64   void SetImage(vvImage::Pointer image);
65   bool SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n=0);
66
67   bool SetOverlay(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type);
68   bool SetFusion(std::string filename, int dim, std::string component);
69   bool SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type);
70   ///Set a VF by loading it from the disk
71   bool SetVF(std::string filename);
72   ///Set a VF from memory
73   bool SetVF(vvImage::Pointer vf,std::string filename);
74   ///Add a mesh to the slicers, with optional propagation using a vector field
75   void AddContour(vvMesh::Pointer ,bool propagate=false);
76   ///Toggle temporal superposition of contours
77   void ToggleContourSuperposition();
78
79   std::string GetFileName()      { return mFileName; }
80   std::string GetBaseFileName()  { return mBaseFileName; }
81   int GetBaseFileNameNumber()    { return mBaseFileNameNumber; }
82   std::string GetVFName()        { return mVFName; }
83   std::string GetOverlayName()   { return mOverlayName; }
84   std::string GetFusionName()    { return mFusionName; }
85   std::string GetListOfAbsoluteFilePathInOneString(const std::string &actorType);
86
87   ///Switch between nearest neighbor and linear interpolation
88   void ToggleInterpolation();
89   vvSlicer* GetSlicer(int i);
90   int GetSelectedSlicer() {
91     return mSelectedSlicer;
92   }
93   
94   void UpdateSlicer(int num, bool state);
95   void SetSlicerWindow(int i, vtkRenderWindow* RW);
96   void SetInteractorStyleNavigator(int i,vtkInteractorStyle* style);
97
98   int GetNumberOfSlicers()        { return mSlicers.size(); }
99   vvImage::Pointer GetImage()  { return mImage; }
100   vvImage::Pointer GetVF()     { return mVF; }
101   int GetType()                { return mType; }
102   void SetId(std::string id)   { mId = id; }
103   std::string GetId()  const        { return mId; }
104   int GetDimension() {
105     if (mImage) return mImage->GetNumberOfDimensions();
106     else return -1;
107   }
108
109   void SetFilename(std::string f, int number=0);
110
111   void SetSliceOrientation(int slicer, int orientation);
112   int GetTSlice();
113   void SetTSlice(int slice, bool updateLinkedImages = true);
114   void SetNextTSlice(int originating_slicer);
115   void SetPreviousTSlice(int originating_slicer);
116   void SetTSliceInSlicer(int tslice, int slicer);
117
118   void SetFusionSequenceTSlice(int slice);
119
120   void GenerateDefaultLookupTable();
121   void SetColorWindow(double s);
122   void SetColorLevel(double s);
123   void SetOverlayColorWindow(double s);
124   void SetOverlayColorLevel(double s);
125   void SetLinkOverlayWindowLevel(bool b);
126   void SetLocalColorWindowing(const int slicer, const bool bCtrlKey);
127   void SetOpacity(int i, double factor);
128   void SetColorMap(int colormap);
129   void SetPreset(int preset);
130   void SetOverlayColor(int color) {
131     mOverlayColor = (color/60)*60; //SR: new vvBlendImageActor needs 0 or 255 per component
132   }
133   void SetFusionOpacity(int opacity) {
134     mFusionOpacity = opacity;
135   }
136   void SetFusionThresholdOpacity(int thresOpacity) {
137     mFusionThresOpacity = thresOpacity;
138   }
139   void SetFusionColorMap(int colorMap) {
140     mFusionColorMap = colorMap;
141   }
142   void SetFusionWindow(double window) {
143     mFusionWindow = window;
144   }
145   void SetFusionLevel(double level) {
146     mFusionLevel = level;
147   }
148   void SetFusionShowLegend(int show) {
149     mFusionShowLegend = show;
150   }
151
152
153   //set/get fusionSequence related data
154   void SetFusionSequenceFrameIndex(int sequenceFrameIndex) { mFusionSequenceFrameIndex = sequenceFrameIndex; }
155   void SetFusionSequenceSpatialSyncFlag(bool spatialSync) { mFusionSequenceSpatialSyncFlag = spatialSync; }
156   void SetFusionSequenceLength(unsigned int fusionSequenceNbFrames) { mFusionSequenceNbFrames = fusionSequenceNbFrames; }
157   void SetFusionSequenceMainTransformMatrix(vtkSmartPointer<vtkMatrix4x4> mat) { 
158           mFusionSequenceMainTransform = vtkSmartPointer<vtkMatrix4x4>::New();
159           mFusionSequenceMainTransform->DeepCopy(mat);
160   }
161   void AddFusionSequenceInitialTransformMatrices(vtkSmartPointer<vtkMatrix4x4> mat) { 
162                 vtkSmartPointer<vtkMatrix4x4> tmpMat = vtkSmartPointer<vtkMatrix4x4>::New();
163                 tmpMat->DeepCopy(mat);
164                 mFusionSequenceListInitialTransformMatrices.push_back( tmpMat );
165   }
166   void SetFusionSequenceIndexOfLinkedManager(int index) { mFusionSequenceIndexLinkedManager = index; }
167
168   int GetFusionSequenceIndexOfLinkedManager() { return mFusionSequenceIndexLinkedManager; }
169   int GetFusionSequenceFrameIndex() { return mFusionSequenceFrameIndex; }
170   bool GetFusionSequenceSpatialSyncFlag() { return mFusionSequenceSpatialSyncFlag; }
171   unsigned int GetFusionSequenceNbFrames() { return mFusionSequenceNbFrames; }
172   const vtkSmartPointer<vtkMatrix4x4>& GetFusionSequenceMainTransformMatrix() {return mFusionSequenceMainTransform;}
173   const std::vector< vtkSmartPointer<vtkMatrix4x4> >& GetFusionSequenceInitialTransformMatrices() {return mFusionSequenceListInitialTransformMatrices;}
174   const vtkSmartPointer<vtkMatrix4x4>& GetFusionSequenceInitialTransformMatrixAtFrame(unsigned i) {
175           return mFusionSequenceListInitialTransformMatrices[i];
176   }
177
178   double GetColorWindow() const;
179   double GetColorLevel() const;
180   double GetOverlayColorWindow() const;
181   double GetOverlayColorLevel() const;
182   bool GetLinkOverlayWindowLevel() const;
183   int GetColorMap() {
184     return mColorMap;
185   }
186   int GetPreset() const {
187     return mPreset;
188   }
189   SlicingPresetType GetSlicingPreset() {
190     return mSlicingPreset;
191   }
192   int GetOverlayColor() const {
193     return mOverlayColor;
194   }
195   int GetFusionOpacity() const {
196     return mFusionOpacity;
197   }
198   int GetFusionThresholdOpacity() const {
199     return mFusionThresOpacity;
200   }
201   int GetFusionColorMap() const {
202     return mFusionColorMap;
203   }
204   double GetFusionWindow() const {
205     return mFusionWindow;
206   }
207   double GetFusionLevel() const {
208     return mFusionLevel;
209   }
210
211
212   void SetCursorAndCornerAnnotationVisibility(int s);
213   void UpdateViews(int current, int slicer);
214   void UpdateLinked(int slicer);
215   void UpdateLinkedNavigation(vvSlicer *slicer, bool bPropagate=false);
216   void ResetTransformationToIdentity(const std::string actorType);
217   void Render();
218
219   void AddLink(std::string newId) {
220     mLinkedId.push_back(newId);
221   }
222   void RemoveLink(std::string oldId) {
223     mLinkedId.remove(oldId); 
224   }
225   
226   std::list<std::string> GetLinks() const {
227     return mLinkedId;
228   }
229   
230   bool IsLinked() {
231     return mLinkedId.size() > 0;
232   }
233
234   ///Remove the actor defined by its type and index (example: 3rd contour)
235   void RemoveActor(const std::string& actor_type, int overlay_index);
236   void RemoveActors();
237   void Reload();
238   void ReloadOverlay();
239   void ReloadFusion();
240   void ReloadFusionSequence();
241   void ReloadVF();
242
243   void Activated();
244   void Picked();
245   void UpdateInfoOnCursorPosition(int slicer);
246   void EmitMousePositionUpdated(int slicer);
247   void EmitKeyPressed(std::string keyPress);
248   void UpdateWindowLevel();
249   void UpdateSlice(int slicer);
250   void UpdateTSlice(int slicer);
251   void UpdateSliceRange(int slicer);
252   void SetSlicingPreset(SlicingPresetType preset);
253
254   vvLandmarks *GetLandmarks();
255   void AddLandmark(float x,float y,float z,float t);
256   
257   void NextImage(int slicer);
258   void PrevImage(int slicer);
259   void LeftButtonReleaseEvent(int slicer);
260   void VerticalSliderHasChanged(int slicer, int slice);
261   double GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component=0);
262
263 signals :
264   void currentImageChanged(std::string id);
265   void currentPickedImageChanged(std::string id);
266   void UpdatePosition(int visibility,double x, double y, double z, double X, double Y, double Z, double value);
267   void UpdateVector(int display, double x, double y, double z, double value);
268   void UpdateOverlay(int display, double valueOver, double valueRef);
269   void UpdateFusion(int display, double valueFus);
270   void UpdateFusionSequence(int fusionSequenceFrameIndex, bool fusionSequenceSpatialSyncFlag, unsigned int fusionSequenceNbFrames);
271   void MousePositionUpdatedSignal(int slicer);
272   void KeyPressedSignal(std::string KeyPressed);
273   void UpdateOrientation(int slicer, int orientation);
274   void UpdateSlice(int slicer, int slice);
275   void UpdateTSlice(int slicer, int slice);
276   void UpdateSliceRange(int slice, int min, int max, int tmin, int tmax);
277   void WindowLevelChanged();
278   void UpdateLinkManager(std::string, int slicer, double x, double y, double z, int temps);
279   void UpdateLinkedNavigation(std::string, vvSlicerManager*, vvSlicer*);
280   void LandmarkAdded();
281   void ChangeImageWithIndexOffset(vvSlicerManager *sm, int slicer, int offset);
282   void LeftButtonReleaseSignal(int slicer);
283   void AVerticalSliderHasChanged(int slicer, int slice);
284
285 protected:
286   std::vector< vtkSmartPointer<vvSlicer> > mSlicers;
287   int mSelectedSlicer;
288   vvImageReader::Pointer mReader;
289   vvImageReader::Pointer mOverlayReader;
290   vvImageReader::Pointer mFusionReader;
291   vvImageReader::Pointer mFusionSequenceReader;
292   vvImageReader::Pointer mVectorReader;
293   vvImage::Pointer mImage;
294   vvImage::Pointer mVF;
295   int mColorMap;
296   int mOverlayColor;
297
298   int mFusionOpacity;
299   int mFusionThresOpacity;
300   int mFusionColorMap;
301   double mFusionWindow;
302   double mFusionLevel;
303   bool mFusionShowLegend;
304
305   //fusionSequence related data
306   int mFusionSequenceIndexLinkedManager;
307   int mFusionSequenceFrameIndex;
308   bool mFusionSequenceSpatialSyncFlag;
309   unsigned int mFusionSequenceNbFrames;
310   vtkSmartPointer<vtkMatrix4x4> mFusionSequenceMainTransform;
311   std::vector< vtkSmartPointer<vtkMatrix4x4> > mFusionSequenceListInitialTransformMatrices;
312   
313   int mPreset;
314   SlicingPresetType mSlicingPreset;
315   vvImageReader::LoadedImageType mType;
316   std::string mVFComponent;
317   std::string mOverlayComponent;
318   std::string mFusionComponent;
319   std::string mFileName;
320   std::string mBaseFileName;
321   int mBaseFileNameNumber;
322   std::string mId;
323   std::string mVFName;
324   std::string mOverlayName;
325   std::string mFusionName;
326   std::string mVFId;
327   std::string mLastError;
328   std::list<std::string> mLinkedId;
329
330   vvLandmarks* mLandmarks;
331   
332   std::vector<int> mPreviousSlice;
333   std::vector<int> mPreviousTSlice;
334 };
335
336 #endif