]> Creatis software - creaImageIO.git/blob - src2/creaImageIOGimmickView.cpp
Changed reading and viewing method by adding ImagePointerHolders
[creaImageIO.git] / src2 / creaImageIOGimmickView.cpp
1 #include <creaImageIOGimmickView.h>
2 #include <creaImageIOSystem.h>
3
4 #include "boost/filesystem.hpp"
5
6 namespace fs = boost::filesystem;
7
8 namespace creaImageIO
9 {
10
11   //======================================================================
12   // CTor
13   GimmickView::GimmickView(Gimmick* gimmick, int threads)
14     : mGimmick(gimmick),
15           mReader(threads)
16   {
17     GimmickDebugMessage(1,"GimmickView::GimmickView"
18                         <<std::endl);
19         // Anciently started the threads ...
20     // Threads now automatically start at first image request
21     //mReader.Start();
22
23   }
24   //======================================================================
25
26   //======================================================================
27   /// Destructor
28   GimmickView::~GimmickView()
29   {
30     GimmickDebugMessage(1,"GimmickView::~GimmickView"
31                         <<std::endl);
32   }
33    //======================================================================
34  
35   //======================================================================  
36   /// Initializes the view : 
37   /// Creates the TreeViews for all the TreeHandler of the Controller
38   /// 
39   void GimmickView::Initialize()
40   {
41   }
42   //======================================================================
43   
44   //======================================================================
45   /// Finalize 
46   void GimmickView::Finalize()
47   {
48   }
49
50   //======================================================================
51
52   //======================================================================
53   /// Create the tree views 
54   void GimmickView::CreateTreeViews()
55   {
56     GimmickMessage(2,"Creating the tree views"<<std::endl);
57     Gimmick::TreeHandlerMapType::const_iterator i;
58     for (i = mGimmick->GetTreeHandlerMap().begin();
59          i!= mGimmick->GetTreeHandlerMap().end();
60          ++i)
61       {
62         this->CreateTreeView(i->second);
63       }
64   }
65   //======================================================================
66
67   //======================================================================
68   /// Updates the TreeView of given name from level l to bottom
69   /// (calls the virtual method TreeView::Update())
70   void GimmickView::UpdateTreeViewLevel(const std::string& t, int l)
71   {
72     TreeViewMapType::iterator i;
73     i = GetTreeViewMap().find(t);
74     if ( i == GetTreeViewMap().end() )
75       {
76         GimmickError("INTERNAL ERROR : GimmickView::UpdateTreeView : '"
77                      <<t<<"' is not in TreeViewMap");
78       }
79     i->second->UpdateLevel(l);    
80   }
81   //======================================================================
82   ///Validates the dimension compliance of the images with the maximum and 
83   ///minimum given, and between their sizes
84   bool GimmickView::ValidateSelected (std::vector<tree::Node*>& sel, int min_dim, int max_dim)
85   {
86         GimmickMessage(2,"Validating selected"<<std::endl);
87           
88         bool valid=true;
89           
90           // EED validate all
91           mValidationSignal(valid);
92           return valid;
93           
94         int level;
95         std::string mMessage;
96         if(sel.size()>0)
97         {
98                 std::vector<tree::Node*>::iterator i;
99                 std::string row;
100                 std::string col;
101                 std::string plane;
102                 
103                 //Validation between image sizes
104                 for (i=sel.begin(); i!=sel.end() && valid; ++i)
105                 {
106                         if(i==sel.begin())
107                         {
108                                 row=(*i)->GetAttribute("D0028_0010");
109                                 col=(*i)->GetAttribute("D0028_0011");
110                                 plane=(*i)->GetAttribute("D0028_0012");
111                                 level=(*i)->GetLevel();
112                                 
113                         }
114                         else
115                         {
116                                 if(((*i)->GetAttribute("D0028_0010"))!=row ||
117                                         ((*i)->GetAttribute("D0028_0011"))!=col ||
118                                         ((*i)->GetAttribute("D0028_0012"))!=plane)
119                                         {
120                                                 mMessage="The selected images are not compatible.";
121                                                 valid=false;
122                                         }
123                         }
124                 }
125
126                 //Dimention validation
127                 //Compatibility with maximum and minimum
128                         if(valid)
129                         {       
130                                 
131                                 int rows;
132                                 int cols;
133                                 int planes;
134                                 std::string s;
135                                 std::istringstream t(s);
136                                 s=row;
137                                 t >> rows;
138                                 if(row==""){rows=1;}
139                                 s=col;
140                                 t >> cols;
141                                 if(col==""){cols=1;}
142                                 s=plane;
143                                 t >> planes;
144                                 if(plane==""){planes=1;}
145
146                                 int dim = 0;
147                                 if (planes>1) dim=3;
148                                 else if (cols>1) dim=2;
149                                 else if (rows>1) dim=1;
150                             
151                                 if (dim == 0) 
152                                 {
153                                         mMessage="Unknown image dimension : cannot select !";
154                                         valid= false;
155                                 }
156                                 else if (dim>max_dim)
157                                 {
158                                         mMessage="Selecting ";
159                                         mMessage+=dim;
160                                         mMessage+="D images is not allowed !";
161                                         valid= false;
162                                 }
163                                 if ( dim == max_dim )
164                                 {
165                                         mMessage="Cannot add this image to selection : would result in a ";
166                                         mMessage+=(dim+1);
167                                         mMessage+="D image!";
168                                         
169                                         valid= false;
170                                 }
171                                 if ( dim < min_dim && sel.size()<2 )
172                                 {
173                                         GimmickDebugMessage(2, "State Check: Dim: "
174                                                 <<dim
175                                                 <<" Dim min:"
176                                                 <<min_dim
177                                                 <<std::endl);
178                                         mMessage="Cannot build the selection as it would result in a ";
179                                         mMessage+=dim;
180                                         mMessage+="D image, and the minimum is ";
181                                         mMessage+=min_dim;
182                                         mMessage+="D!";
183                                         valid= false;
184                                 }
185                         }
186           }
187         else
188         {
189                 mMessage="Cannot have 0 images selected";
190                 valid=false;
191         }
192         if(valid)
193         {
194                 mMessage="Selection OK !";
195         }
196         mValidationSignal(valid);
197         SetMessage(mMessage);
198         return valid;
199   }
200
201    //======================================================================
202
203    //======================================================================
204   ///Reads Images (Non Threaded)
205   void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<tree::Node*> im, int dimension)
206   {
207           
208         // Create the output data
209         if (im.size()==1) 
210       {
211                   
212                 // Only one image : give it
213                 vtkImageData* out = vtkImageData::New();
214                 GimmickMessage(1, "State Check: Full Filename: "
215                                                 <<im.front()->GetAttribute("FullFileName")
216                                                 <<std::endl);
217                 out->ShallowCopy(mReader.GetImage(im.front()->GetAttribute("FullFileName")));
218                 s.push_back( out );
219       }
220           
221     else if (im.size()>1)
222       {
223         vtkImageData* first = mReader.GetImage( im.front()->GetAttribute("FullFileName"));
224         if (dimension==2) 
225           {     
226             // n2D to 3D
227             vtkImageData* out = vtkImageData::New();
228             out->CopyStructure(first);  
229             out->SetScalarType(first->GetScalarType());
230             int ext[6];
231             first->GetExtent(ext);
232             ext[5] = im.size();
233             out->SetExtent(ext);
234             // LG : TODO : Z Spacing  ?
235             
236             out->AllocateScalars();
237             
238             //first->Print(std::cout);
239             //      out->Print(std::cout);
240             
241             int dim[3];
242             first->GetDimensions(dim);
243             unsigned long imsize = 
244               ( (unsigned long)first->GetScalarPointer(0,1,0)
245                 - (unsigned long)first->GetScalarPointer(0,0,0))
246               *dim[1];
247
248             int slice = 0;
249                 std::vector<tree::Node*>::iterator it;
250             for (it=im.begin(); it!=im.end(); ++it) 
251               {
252                 //std::cout << "copying slice "<<slice <<std::endl;
253                           vtkImageData* cur = mReader.GetImage( (*it)->GetAttribute("FullFileName"));
254                 
255                 void* src = cur->GetScalarPointer(0,0,0);
256                 void* dst = out->GetScalarPointer(0,0,slice);
257                 //              std::cout << "src="<<src<<std::endl;
258                 //              std::cout << "dst="<<dst<<std::endl;
259                 //              std::cout << "siz="<<imsize<<std::endl;
260                 memcpy(dst,src,imsize);
261
262                 slice++;
263               }
264             s.push_back(out);
265           }
266         else 
267           {
268             // n3D
269                   std::vector<tree::Node*>::iterator it;
270             for (it=im.begin(); it!=im.end(); ++it) 
271               {
272                 vtkImageData* out = vtkImageData::New();
273                 out->ShallowCopy(mReader.GetImage((*it)->GetAttribute("FullFileName")));
274                 s.push_back(out);
275               }
276           }
277       }
278         
279   }
280   //======================================================================
281
282   //======================================================================
283   ///Requests the reading of an image
284   void GimmickView::RequestReading(tree::Node* n, 
285                                    int prio, int selection_index, ImagePointerHolder *p)
286   {
287         mReader.Start();
288     ImageEventType t(n,selection_index, p);
289     mImageEventMap[n->GetAttribute("FullFileName")] = t;    
290     mReader.Request(this,n->GetAttribute("FullFileName"),prio);
291   }
292   //======================================================================
293
294   //======================================================================
295   void GimmickView::
296   OnMultiThreadImageReaderEvent(const std::string& filename,
297                                 MultiThreadImageReaderUser::EventType e,
298                                 vtkImageData* image)
299   {
300     GimmickDebugMessage(7,
301                         "MultiThreadImageReader event : "<<e<<std::endl);
302         if (e==ImageLoaded)
303         {
304     if (filename.size()==0)
305       {
306                 GimmickDebugMessage(5,
307                                         "Pushing unknown image in queue"
308                                         <<std::endl);
309                 mImageEventQueue.push_back(ImageEventType(image));
310                 return;
311       }
312     ImageEventTypeMap::iterator i;
313     i = mImageEventMap.find(filename);
314     if (i!=mImageEventMap.end())
315       {
316                 GimmickDebugMessage(5,
317                                         "Putting image of file '"<<filename<<"' on pointer"
318                                         <<std::endl);
319                 ImageEventType ie(i->second);
320                 ie.image = image;
321                 ie.pointerHolder->Set(ie.image);
322                 //mImageEventMap.erase(i);
323       }
324         }
325         else if (e==Error)
326         {
327                 std::string mess="ERROR: MultiThreadImageReader: Cannot read image in file ";
328                 mess+=filename;
329                 mess+="\n";
330                 GimmickMessage(1,mess);
331                 ImageEventTypeMap::iterator i;
332                 i = mImageEventMap.find(filename);
333                 if (i!=mImageEventMap.end())
334                 {
335                 ImageEventType ie(i->second);
336                 ie.image = image;
337                 ie.pointerHolder->Set(GetDefaultImage());
338                 //mImageEventMap.erase(i);
339                 }
340         }
341
342         else if (e==ImageUnloaded)
343         {
344                 std::string mess="Unloaded image in file ";
345                 mess+=filename;
346                 mess+="\n";
347                 GimmickMessage(1,mess);
348                                 ImageEventTypeMap::iterator i;
349                 i = mImageEventMap.find(filename);
350                 if (i!=mImageEventMap.end())
351                 {
352                 ImageEventType ie(i->second);
353                 ie.image = image;
354                 ie.pointerHolder->Set(GetDefaultImage());
355                 //mImageEventMap.erase(i);
356                 }
357
358         }
359   }
360
361   //====================================================================
362
363   //====================================================================
364   void GimmickView::ConnectValidationObserver(ValidationCallbackType callback)
365   {
366     mValidationSignal.connect(callback);
367   }
368           
369   
370 } // EO namespace creaImageIO
371
372