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