creaImageIO_lib
creaImageIOGimmickView.cpp
Go to the documentation of this file.
1 /*
2 # ---------------------------------------------------------------------
3 #
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5 # pour la Santé)
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 #
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
16 #
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
21 # liability.
22 #
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
26 */
27 
28 
29 #include <creaImageIOGimmickView.h>
30 
31 #include "boost/filesystem.hpp"
32 
33 #if defined(USE_GDCM)
34 #include <gdcmGlobal.h>
35 #include <gdcmSerieHelper.h>
36 #include <gdcmFileHelper.h>
37 #include <gdcmUtil.h>
38 #include <vtkGdcmReader.h>
39 #endif
40 
41 /*#if defined(USE_GDCM2)
42 #include <vtkGDCMImageReader.h>
43 #include "gdcmSystem.h"
44 #include "gdcmCryptographicMessageSyntax.h"
45 #include "gdcmUIDGenerator.h"
46 #include "gdcmAnonymizer.h"
47 #include "gdcmGlobal.h"
48 #endif*/
49 #if defined(_WIN32)
50 #pragma warning(disable: 4996)
51 #endif
52 
53 namespace fs = boost::filesystem;
54 namespace creaImageIO
55 {
56 
59  {
60  public:
61  ImageExtent(const std::string& x, const std::string& y, const std::string& z, const std::string& t)
62  {
63  sscanf(x.c_str(),"%d",&mExtent[0]);
64  sscanf(y.c_str(),"%d",&mExtent[1]);
65  sscanf(z.c_str(),"%d",&mExtent[2]);
66  sscanf(t.c_str(),"%d",&mExtent[3]);
67  if(x==""){mExtent[0]=1;}
68  if(y==""){mExtent[1]=1;}
69  if(z==""){mExtent[2]=1;}
70  if(t==""){mExtent[3]=1;}
71 
72  if (mExtent[3]>1) mDim=4;
73  else if (mExtent[2]>1) mDim=3;
74  else if (mExtent[1]>1) mDim=2;
75  else if (mExtent[0]>1) mDim=1;
76  else mDim=0;
77  }
78 
79 
81  void Clear() { mExtent[0] = mExtent[1] = mExtent[2] = mExtent[3] = 1; }
82 
84  bool IsCompatible( const ImageExtent& );
85 
87  void Add ( const ImageExtent& );
88 
90  int Get(int i) { return mExtent[i]; }
91 
93  void SetDimension(int dim) { mDim=dim; }
94 
96  int GetDimension() { return mDim; }
97 
98  private:
99  int mExtent[4];
100  int mDim;
101  };
102 
103  //======================================================================
104 
105  //======================================================================
106  // CTor
107  GimmickView::GimmickView(boost::shared_ptr<Gimmick> gimmick, int threads)
108  : mGimmick(gimmick),
109  mReader(threads)
110  {
111  GimmickDebugMessage(1,"GimmickView::GimmickView"
112  <<std::endl);
113  // Anciently started the threads ...
114  // Threads now automatically start at first image request
115  //mReader.Start();
116 
117  }
118  //======================================================================
119 
120  //======================================================================
123  {
124  GimmickDebugMessage(1,"GimmickView::~GimmickView"
125  <<std::endl);
126  }
127  //======================================================================
128 
129  //======================================================================
134  {
135  mReaderStarted=false;
136  }
137  //======================================================================
138 
139  //======================================================================
142  {
143  }
144 
145  //======================================================================
146 
147  //======================================================================
150  {
151  GimmickMessage(2,"Creating the tree views"<<std::endl);
152  Gimmick::TreeHandlerMapType::const_iterator i;
153  for (i = mGimmick->GetTreeHandlerMap().begin();
154  i!= mGimmick->GetTreeHandlerMap().end();
155  ++i)
156  {
157  this->CreateTreeView(i->second);
158  }
159  }
160 
162  void GimmickView::CreateSingleTreeView(std::string &i_name)
163  {
164  this->CreateTreeView(mGimmick->GetTreeHandlerMap()[i_name]);
165 
166  }
167 
168 
169  //======================================================================
170 
171  //======================================================================
174  void GimmickView::UpdateTreeViewLevel(const std::string& t, int l)
175  {
176  TreeViewMapType::iterator i;
177  i = GetTreeViewMap().find(t);
178  if ( i == GetTreeViewMap().end() )
179  {
180  GimmickError("INTERNAL ERROR : GimmickView::UpdateTreeView : '"
181  <<t<<"' is not in TreeViewMap");
182  }
183  i->second->UpdateLevel(l);
184  }
185 
186  //======================================================================
189  {
190  if(mImageExtent!=0)
191  {
192  mImageExtent.reset();
193  }
194  valid=true;
195  }
196 
197  //======================================================================
198 
199  //======================================================================
201  {
202  bool compatible=true;
203  ImageExtent * extent= (ImageExtent*)&ie;
204  if((*extent).Get(0)!=Get(0)
205  || (*extent).Get(1)!=Get(1))
206  {
207  compatible=false;
208  }
209  return compatible;
210  }
211 
212  //======================================================================
213 
214  //======================================================================
216  {
217  ImageExtent * extent= (ImageExtent*)&ie;
218  mExtent[2]+=(*extent).Get(2);
219  if(mExtent[2]>1)
220  {
221  SetDimension(3);
222  }
223  }
224 
225  //======================================================================
228  {
229  GimmickDebugMessage(2,"Validating selected"<<std::endl);
230  std::string mMessage;
231  mMessage="Cannot have 0 images selected!";
232  valid=false;
234  SetMessage(mMessage);
235  return valid;
236  }
237 
238  //======================================================================
241  bool GimmickView::ValidateSelected (tree::Node* sel, int min_dim, int max_dim)
242  {
243  GimmickDebugMessage(2,"Validating selected"<<std::endl);
244  std::string mMessage;
245 
246  if(sel==0)
247  {
248  mMessage="Cannot have 0 images selected!";
249  valid=false;
250  }
251  else
252  {
253  boost::shared_ptr<ImageExtent> ie=boost::shared_ptr<ImageExtent>(new ImageExtent((*sel).GetAttribute("D0028_0010"),
254  (*sel).GetAttribute("D0028_0011"),
255  (*sel).GetAttribute("D0028_0012"),
256  ""));
257 
258  if(mImageExtent==0)
259  {
260  mImageExtent=ie;
261  if((mImageExtent->Get(min_dim-1)<2)||(mImageExtent->Get(max_dim)>1))
262  {
263  valid=false;
264  }
265  else
266  {
267  std::stringstream out;
268  out << mImageExtent->GetDimension() << "D image " << mImageExtent->Get(0) << "x"<< mImageExtent->Get(1) << "x"<< mImageExtent->Get(2) <<" selected";
269  mMessage = out.str();
270  mImageExtent->SetDimension(2);
271  valid=true;
272  }
273  }
274  else
275  {
276  if(mImageExtent->IsCompatible(*ie))
277  {
278  if(mImageExtent->GetDimension()==max_dim && mImageExtent->Get(max_dim)>2)
279  {
280  std::stringstream out;
281  out<<"Cannot add this image to selection : would result in a "<<mImageExtent->GetDimension()+1<<"D image!";
282  mMessage=out.str();
283  valid=false;
284  }
285  else if(max_dim<3)
286  {
287  std::stringstream out;
288  out<<"Selecting "<<mImageExtent->GetDimension()<<"D images is not allowed !";
289  mMessage=out.str();
290  valid=false;
291  }
292  else if(min_dim==3 && (ie->Get(2)+mImageExtent->Get(2))<2)
293  {
294  std::stringstream out;
295  out << "Cannot build the selection as it would result in a ";
296  out << mImageExtent->GetDimension();
297  out << "D image, and the minimum is ";
298  out << min_dim;
299  out << "D!";
300  mMessage=out.str();
301  valid=false;
302  }
303  else
304  {
305  mImageExtent->Add(*ie);
306  std::stringstream out;
307  out << mImageExtent->GetDimension() << "D image " << mImageExtent->Get(0) << "x"<< mImageExtent->Get(1) << "x"<< mImageExtent->Get(2) <<" selected";
308  mMessage = out.str();
309  }
310  }
311  else
312  {
313  mMessage="The selected images are not compatible.";
314  valid=false;
315  }
316  }
317  }
318 
320  SetMessage(mMessage);
321  return valid;
322  }
323 
324  //======================================================================
326  {
327 
328  mValidationSignal(ivalid);
329  }
330 
332  {
333  mReader.Stop();
334  }
335 
336  //======================================================================
338 void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s, std::vector<std::string> im, int dimension)
339 {
340  stopReader();
341 /* remember!
342 
343 #define GIMMICK_NO_IMAGE_SELECTION 0
344 #define GIMMICK_2D_IMAGE_SELECTION 2
345 #define GIMMICK_3D_IMAGE_SELECTION 3
346 #define GIMMICK_4D_IMAGE_SELECTION 4
347 
348 #define NATIVE 0
349 #define _2D 2
350 #define _3D 3
351 
352 */
353  // Create the output data
354  if (im.size()==1)
355  {
356  vtkImageData * out=vtkImageData::New();
357  out->ShallowCopy(mReader.GetImage(im.front()));
358  s.push_back(out);
359  }
360  else if (im.size()>1) // Test inutile ? JPR
361  {
362  vtkImageData* first = mReader.GetImage( im.front());
363  if (dimension == 2)
364  {
365  // n3D
366  std::vector<std::string>::iterator it;
367  for (it=im.begin(); it!=im.end(); ++it)
368  {
369  vtkImageData* out = vtkImageData::New();
370  out->ShallowCopy(mReader.GetImage(*it));
371  s.push_back(out);
372  }
373  }
374  else
375  {
376  // n*2D to 3D
377  vtkImageData* out = vtkImageData::New();
378 // out->CopyStructure(first);
379  out->SetScalarType(first->GetScalarType());
380  out->SetNumberOfScalarComponents(first->GetNumberOfScalarComponents());
381  int ext[6];
382  //first->GetExtent(ext); // JPR
383  first->GetWholeExtent(ext); // renvoie egalement 0,0 en Z // JPR
384 
385  if(ext[5] == 0)
386  {
387  ext[5] = (int)im.size()-1;
388  }
389  else
390  {
391  ext[5] = ext[5] * (int)im.size()-1; // to deal with multiframes - JPR
392  }
393  out->SetExtent(ext);
394 
395  // LG : TODO : Z Spacing ?
396 
397  int dim[3];
398  first->GetDimensions(dim);
399 
400  out->SetDimensions(dim[0], dim[1], (int)im.size() );
401  out->AllocateScalars();
402  out->Update();
403 
404  unsigned long imsize = dim[0] * dim[1];
405  imsize = imsize * dim[2] ; // deal with multiframes // JPR
406 
407 
408 //EED 03-11-2009
409  // differents formats char , short, etc...
410  // differents components 1..3 ex. jpg ->RGB 3
411  imsize = imsize * first->GetScalarSize() * first->GetNumberOfScalarComponents();
412 
413 
414  // Order the file name vector
415 
416  double spc[3];
417  first->GetSpacing(spc);
418 
419  // OrderTheFileNameVector is not here anymore.
420  // Try orderFilesWithZSpacing from OutputModel FCY
421  // spc[2]=OrderTheFileNameVector(im);
422  spc[2] =1;
423 
424  out->SetSpacing(spc);
425 
426  int slice = 0;
427  std::vector<std::string>::iterator it;
428 
429  for (it=im.begin(); it!=im.end(); ++it)
430  {
431  vtkImageData* cur = mReader.GetImage( (*it) );
432  memcpy(out->GetScalarPointer(0,0,slice), cur->GetScalarPointer(0,0,0), imsize);
433  slice++;
434  }
435  s.push_back(out);
436 
437  } // dimension == 3
438 
439  } // size >1
440 
441 }
442  //======================================================================
443 
444 
445 
447  // Test if the image is a multiple or single frame.
448  // For the moment only with the creation of vtkImageDta.
449  // TO DO with image size and dim!!!
451  bool GimmickView::isSingle(const std::string i_file)
452  {
453  bool bres = true;
454  vtkImageData* first = mReader.GetImage( i_file);
455  int dim[3];
456  first->GetDimensions(dim);
457  if (dim[2] > 1)
458  {
459  bres = false;
460  }
461  else
462  {
463  }
464  return bres;
465  }
466 
468  // get Attributes values for a file
470 
471  void GimmickView::getAttributes(const std::string i_file, std::map<std::string, std::string> &o_infos, OutputAttr i_attr)
472  {
473  if(i_attr.inside.size() >0)
474  {
475  mGimmick->GetAttributes(i_file,o_infos,i_attr);
476  }
477  if(i_attr.outside.size()>0)
478  {
479  mReader.getAttributes(i_file,o_infos, i_attr.outside);
480  }
481  }
482 
484  // create an output structure with n entries = n output
486  void GimmickView::readImages1(std::vector<OutStrGimmick>& o_output, std::vector<std::string> im,
487  OutputAttr i_attr)
488  {
489  std::vector<std::string>::iterator it;
490  for (it=im.begin(); it!=im.end(); ++it)
491  {
492  OutStrGimmick out;
493  out.img = vtkImageData::New();
494  out.img->ShallowCopy(mReader.GetImage(*it));
495  if(i_attr.mult)
496  getAttributes((*it),out.infos,i_attr);
497  o_output.push_back(out);
498  }
499  // If we want only one output information structure, we set it outside the loop
500  if(!i_attr.mult)
501  {
502  getAttributes(im.front(), o_output.front().infos, i_attr);
503  }
504 
505  }
506 
508  // create an output structure with n entries = 1 output
510  void GimmickView::readImages3(std::vector<OutStrGimmick>& o_output, std::vector<std::string> im,
511  OutputAttr i_attr, double i_zspc)
512  {
513  OutStrGimmick out;
514  vtkImageData* first = mReader.GetImage( im.front());
515  out.img = vtkImageData::New();
516  out.img->SetScalarType(first->GetScalarType());
517  out.img->SetNumberOfScalarComponents(first->GetNumberOfScalarComponents());
518  int ext[6];
519  first->GetWholeExtent(ext); // send also 0,0 in Z
520  if(ext[5] == 0)
521  {
522  ext[5] = (int)im.size()-1;
523  }
524  else
525  {
526  ext[5] = ext[5] * (int)im.size()-1; // to deal with multiframes
527  }
528  out.img->SetExtent(ext);
529  int dim[3];
530  double spac[3];
531  first->GetDimensions(dim);
532  first->GetSpacing(spac);
533  out.img->SetSpacing(spac);
534  out.img->SetDimensions(dim[0], dim[1], (int)im.size() );
535  out.img->AllocateScalars();
536  out.img->Update();
537  unsigned long imsize = dim[0] * dim[1];
538  imsize = imsize * dim[2] ; // deal with multiframes here
539  // differents formats char , short, etc...
540  // differents components 1..3 ex. jpg ->RGB 3
541  imsize = imsize * first->GetScalarSize() * first->GetNumberOfScalarComponents();
542  // Order the file name vector already did with the OutputModel!!!
544  int slice = 0;
545  std::vector<std::string>::iterator it;
546  for (it=im.begin(); it!=im.end(); ++it)
547  {
548  vtkImageData* cur = mReader.GetImage( (*it) );
549  memcpy(out.img->GetScalarPointer(0,0,slice), cur->GetScalarPointer(0,0,0), imsize);
550  slice++;
551  }
552  getAttributes(im.front(),out.infos, i_attr);
553  o_output.push_back(out);
554  }
555 
556 
557  // TO DO NO VERY SURE : NEED TO BE TESTED
559  // create an output structure with n entries (T size) = T output (n size)
561  void GimmickView::readImages2(std::vector<OutStrGimmick>& o_output, std::vector<std::string> im,
562  OutputAttr i_attr, double i_zspc)
563  {
564  vtkImageData* first = mReader.GetImage( im.front());
565  int dim[3];
566  double spac[3];
567  first->GetDimensions(dim);
568  first->GetSpacing(spac);
569  // differents formats char , short, etc...
570  // differents components 1..3 ex. jpg ->RGB 3
571  unsigned long imsize = dim[0] * dim[1];
572  imsize = imsize * first->GetScalarSize() * first->GetNumberOfScalarComponents();
573 
574  // Order the file name vector already did with the OutputModel!!!
575  std::vector<std::string>::iterator it;
576  std::vector<OutStrGimmick>::iterator it_out = o_output.begin();
577 
578  for (it=im.begin(); it!=im.end(); ++it)//, it_out ++)
579  {
580  vtkImageData* cur = mReader.GetImage( (*it) );
581  for (int slice= 0 ; slice <dim[2]; slice++)
582  {
583  OutStrGimmick out;
584  out.img = vtkImageData::New();
585  out.img->SetScalarType(first->GetScalarType());
586  out.img->SetSpacing(spac);
587  out.img->SetNumberOfScalarComponents(first->GetNumberOfScalarComponents());
588  int ext[6];
589  first->GetWholeExtent(ext); // send also 0,0 in Z
590  ext[5] = 0;
591  out.img->SetExtent(ext);
592 
593  out.img->SetDimensions(dim[0], dim[1], 1 );
594  out.img->AllocateScalars();
595  out.img->Update();
596  memcpy(out.img->GetScalarPointer(0,0,0), cur->GetScalarPointer(0,0,slice), imsize);
597  o_output.push_back(out);
598  }
599  // if(i_attr.mult)
600  // getAttributes((*it),(*it_out).infos,i_attr);
601  }
602  if(!i_attr.mult)
603  {
604  getAttributes(im.front(), o_output.front().infos,i_attr);
605  }
606 
607  }
608 
610  // create an output structure with n entries (T size) = T + n output
612  void GimmickView::readImages4(std::vector<OutStrGimmick>& o_output, std::vector<std::string> im,
613  OutputAttr i_attr)
614  {
615  std::vector<std::string>::iterator it;
616  std::vector<OutStrGimmick>::iterator it_out = o_output.begin();
617  vtkImageData* first = mReader.GetImage( im.front());
618  int dim[3];
619  first->GetDimensions(dim);
620 
621  for (int slice= 0 ; slice <dim[2]; slice++)
622  {
623  OutStrGimmick out;
624  out.img = vtkImageData::New();
625  out.img->SetScalarType(first->GetScalarType());
626  out.img->SetNumberOfScalarComponents(first->GetNumberOfScalarComponents());
627 
628  int ext[6];
629  double spac[6];
630  first->GetWholeExtent(ext); // send also 0,0 in Z
631  ext[5] = 0;
632  out.img->SetExtent(ext);
633  first->GetSpacing(spac);
634  out.img->SetSpacing(spac);
635  out.img->SetDimensions(dim[0], dim[1], (int)im.size() );
636  out.img->AllocateScalars();
637  out.img->Update();
638  unsigned long imsize = dim[0] * dim[1];
639  imsize = imsize * first->GetScalarSize() * first->GetNumberOfScalarComponents();
640  int index = 0;
641 
642  for (it=im.begin(); it!=im.end(); ++it, index ++)
643  {
644  vtkImageData* cur = mReader.GetImage( (*it) );
645  memcpy(out.img->GetScalarPointer(0,0,index), cur->GetScalarPointer(0,0,slice), imsize);
646  o_output.push_back(out);
647  }
648  }
649  if(!i_attr.mult) // No sense to take informations in all images
650  {
651  getAttributes(im.front(), o_output.front().infos,i_attr);
652  }
653 
654  }
655 
656 
658 // Global function to read Images and create wished output (informations, multiple, type and size of output...)
659 // In function of type (file, vector) and size, the correct readImages function is selected
661  void GimmickView::readImages(std::vector<OutStrGimmick>& o_output, std::vector<std::string> im,
662  OutputAttr i_attr, int i_dim, double i_zspc)
663  {
664  int size = (int)im.size();
665  if ( size == 0)
666  {
667  return;
668  }
669  else if (size == 1)
670  {
671  // Simplest case
672  // Only one image : give it
673  // But take in count multiframe possibility
674  if ( isSingle(im.front()) || i_dim != 1)
675  {
676  readImages1(o_output,im, i_attr);
677  }
678  else
679  {
680  readImages2(o_output,im, i_attr,i_zspc);
681  }
682 
683  }
684  else
685  {
686  // multiple or single frame
687  if ( isSingle(im.front()) )
688  {
689  //we deal with 2D images
690  if(i_dim == 1)
691  {
692  // 2D to 3D
693  readImages3(o_output,im, i_attr,i_zspc);
694  }
695  else
696  {
697  readImages1(o_output,im, i_attr);
698  }
699  }
700  else
701  {
702  // we deal with multiple frames n x (2D x T)
703  // Differents outputs are avaialable
704  if(i_dim == 1)
705  {
706  // put all in one output
707  readImages3(o_output,im, i_attr,i_zspc);
708 
709  }
710  else if( i_dim == 2)
711  {
712  // put in a vector of n x T (2D)
713  readImages2(o_output,im, i_attr,i_zspc);
714  }
715  else if( i_dim == 3)
716  {
717  // put in a vector of n (2D x T)
718  // No transformations.
719  readImages1(o_output,im, i_attr);
720  }
721  else
722  {
723  // put in a vector of T (2D x n)
724  readImages4(o_output,im, i_attr);
725  }
726  }
727  }
728  }
729 
730 
731 
732 void GimmickView::ReadImagesNotThreadedInVector(std::vector<vtkImageData*>& s, std::vector<std::string> im, int dimension)
733 {
734  // Create the output data
735  if (im.size()==1)
736  {
737  // Only one image : give it
738  vtkImageData* out = vtkImageData::New();
739  GimmickDebugMessage(3, "State Check: Full Filename: "
740  <<im.front()
741  <<std::endl);
742  out->ShallowCopy(mReader.GetImage(im.front()));
743  s.push_back( out );
744  }
745  else if (im.size()>1) // Test inutile ? JPR
746  {
748  vtkImageData* first = mReader.GetImage( im.front());
749  if (dimension == 2)
750  {
751  // n3D
752  std::vector<std::string>::iterator it;
753  for (it=im.begin(); it!=im.end(); ++it)
754  {
755  vtkImageData* out = vtkImageData::New();
756  out->ShallowCopy(mReader.GetImage(*it));
757  s.push_back(out);
758  }
759  }
760  else
761  {
762  // n2D to 3D // NO!
763  // n *2D + T in a vector :
764 
765  std::vector<std::string>::iterator it;
766  for (it=im.begin(); it!=im.end(); ++it)
767  {
768  vtkImageData* out = mReader.GetImage( (*it));
769  s.push_back(out);
770  }
771  }
772  }
773 }
774  //======================================================================
775 
776  //======================================================================
779  int prio, int selection_index, boost::shared_ptr<ImagePointerHolder> p)
780  {
781  if(!mReaderStarted)
782  {
783  mReader.Start();
784  mReaderStarted=true;
785  }
786  ImageEventType t(n,selection_index);
787  t.pointerHolder = p;
788  mImageEventMap[n->GetAttribute("FullFileName")] = t;
789  mReader.Request(this,n->GetAttribute("FullFileName"),prio);
790  }
791  //======================================================================
792 
793  //======================================================================
794  void GimmickView::
795  OnMultiThreadImageReaderEvent(const std::string& filename,
797  vtkImageData* image)
798  {
800  "MultiThreadImageReader event : "<<e<<std::endl);
801  if (e==ImageLoaded)
802  {
803  if (filename.size()==0)
804  {
805  //What to do in this case?
806  /*
807  GimmickDebugMessage(5,
808  "Pushing unknown image in queue"
809  <<std::endl);
810  mImageEventQueue.push_back(ImageEventType(image));*/
811  return;
812  }
813  ImageEventTypeMap::iterator i;
814 //JCP 22-06-2009, test mImageEventMap.size() > 0
815  if(mImageEventMap.size()>0){
816  i = mImageEventMap.find(filename);
817  if (i!=mImageEventMap.end())
818  {
820  "Putting image of file '"<<filename<<"' on pointer"
821  <<std::endl);
822  ImageEventType ie(i->second);
823  ie.image = image;
824  ie.pointerHolder->Set(ie.image);
825  //mImageEventMap.erase(i);
826  }
827  }
828  }
829  else if (e==Error)
830  {
831  std::string mess="ERROR: MultiThreadImageReader: Cannot read image in file ";
832  mess+=filename;
833  mess+="\n";
834  GimmickMessage(1,mess);
835  ImageEventTypeMap::iterator i;
836  i = mImageEventMap.find(filename);
837  if (i!=mImageEventMap.end())
838  {
839  ImageEventType ie(i->second);
840  ie.image = image;
841  ie.pointerHolder->Set(GetDefaultImage());
842  //mImageEventMap.erase(i);
843  }
844  }
845 
846  else if (e==ImageUnloaded)
847  {
848  std::string mess="Unloaded image in file ";
849  mess+=filename;
850  mess+="\n";
851  GimmickMessage(1,mess);
852  ImageEventTypeMap::iterator i;
853  i = mImageEventMap.find(filename);
854  if (i!=mImageEventMap.end())
855  {
856  ImageEventType ie(i->second);
857  ie.image = image;
858  ie.pointerHolder->Set(GetDefaultImage());
859  //mImageEventMap.erase(i);
860  }
861  }
862  }
863 
864  //====================================================================
865 
866  //====================================================================
868  {
869  mValidationSignal.connect(callback);
870  }
871 
872 
873 #if defined(USE_GDCM)
874 
875 void GimmickView::Anonymize(std::vector<std::string> i_filenames, int type)
876 {
877  bool res = true;
878  std::vector<GDCM_NAME_SPACE::FileHelper *> filesH;
879  std::vector<std::string> suid;
880  std::map<std::string, std::string> msuid;
881  std::string tempuid = GDCM_NAME_SPACE::Util::CreateUniqueUID();
882  int i = 1;
883  std::vector<std::string>::iterator it = i_filenames.begin();
884  for(; it != i_filenames.end(); it++)
885  {
886 
887  GDCM_NAME_SPACE::File *file;
888  file = GDCM_NAME_SPACE::File::New( );
889  file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL );
890  file->SetFileName( (*it).c_str() );
891  res = file->Load();
892  if ( !res )
893  {
894  std::cerr << "Sorry, " << (*it).c_str() <<" not a gdcm-readable "
895  << "DICOM / ACR File" <<std::endl;
896  file ->Delete();
897  //return 0;
898  }
899  std::cout << " ... is readable " << std::endl;
900 
901  // We need a gdcm::FileHelper, since we want to load the pixels
902  GDCM_NAME_SPACE::FileHelper *fh = GDCM_NAME_SPACE::FileHelper::New(file);
903 
904  uint8_t *imageData = fh->GetImageData();
905 
906  // Institution name
907  file->AddAnonymizeElement(0x0008, 0x0080, "*");
908  // Patient's name
909  file->AddAnonymizeElement(0x0010, 0x0010, "*");
910  // Patient's ID
911  file->AddAnonymizeElement( 0x0010, 0x0020,"1515" );
912  // Study Instance UID
913  file->AddAnonymizeElement(0x0020, 0x000d, tempuid );
914  // Telephone
915  file->AddAnonymizeElement(0x0010, 0x2154, "3615" );
916 
917  // Aware user will add here more fields to anonymize here
918 
919  // The gdcm::File is modified in memory
920 
921  file->AnonymizeFile();
922 
923 
924  i++;
925  fh->SetContentType(GDCM_NAME_SPACE::UNMODIFIED_PIXELS_IMAGE);
926 
927  fh->WriteDcmExplVR(file->GetFileName() +".ano1" );
928  std::cout << i <<" End Anonymize" << std::cout;
929  file->ClearAnonymizeList();
930  file->Delete();
931  fh->Delete();
932  }
933 }
934 #endif
935 #if defined(USE_GDCM2)
936 void GimmickView::Anonymize(std::vector<std::string> i_filenames, int type)
937 {
938 }
939 #endif
940 
941 //void GimmickView::Anonymize(std::vector<std::string> i_filenames, int type)
942 //{
943 //
944 // gdcm::FileMetaInformation::SetSourceApplicationEntityTitle( "gdcmanon" );
945 // gdcm::Global& g = gdcm::Global::GetInstance();
946 // //if( !resourcespath )
947 // // {
948 // // const char *xmlpathenv = getenv("GDCM_RESOURCES_PATH");
949 // // if( xmlpathenv )
950 // // {
951 // // // Make sure to look for XML dict in user explicitly specified dir first:
952 // // xmlpath = xmlpathenv;
953 // // resourcespath = 1;
954 // // }
955 // // }
956 // // if( resourcespath )
957 // // {
958 // // // xmlpath is set either by the cmd line option or the env var
959 // // if( !g.Prepend( xmlpath.c_str() ) )
960 // // {
961 // // std::cerr << "Specified Resources Path is not valid: " << xmlpath << std::endl;
962 // // return 1;
963 // // }
964 // // }
965 // // All set, then load the XML files:
966 // if( !g.LoadResourcesFiles() )
967 // {
968 // return ;
969 // }
970 // const gdcm::Defs &defs = g.GetDefs(); (void)defs;
971 // if( !rootuid )
972 // {
973 // // only read the env var if no explicit cmd line option
974 // // maybe there is an env var defined... let's check
975 // const char *rootuid_env = getenv("GDCM_ROOT_UID");
976 // if( rootuid_env )
977 // {
978 // rootuid = 1;
979 // root = rootuid_env;
980 // }
981 // }
982 // if( rootuid )
983 // {
984 // // root is set either by the cmd line option or the env var
985 // if( !gdcm::UIDGenerator::IsValid( root.c_str() ) )
986 // {
987 // std::cerr << "specified Root UID is not valid: " << root << std::endl;
988 // return 1;
989 // }
990 // gdcm::UIDGenerator::SetRoot( root.c_str() );
991 // }
992 //
993 // if(type == 0)
994 // {
995 // // Get private key/certificate
996 // gdcm::CryptographicMessageSyntax cms;
997 // if( !dumb_mode )
998 // {
999 // if( !GetRSAKeys(cms, rsa_path.c_str(), cert_path.c_str() ) )
1000 // {
1001 // return 1;
1002 // }
1003 // cms.SetCipherType( ciphertype );
1004 // }
1005 //
1006 // // Setup gdcm::Anonymizer
1007 // gdcm::Anonymizer anon;
1008 // if( !dumb_mode )
1009 // anon.SetCryptographicMessageSyntax( &cms );
1010 //
1011 // if( dumb_mode )
1012 // {
1013 // for(unsigned int i = 0; i < nfiles; ++i)
1014 // {
1015 // const char *in = filenames[i].c_str();
1016 // const char *out = outfilenames[i].c_str();
1017 // if( !AnonymizeOneFileDumb(anon, in, out, empty_tags, remove_tags, replace_tags_value) )
1018 // {
1019 // //std::cerr << "Could not anonymize: " << in << std::endl;
1020 // return 1;
1021 // }
1022 // }
1023 // }
1024 // //else
1025 // // {
1026 // // for(unsigned int i = 0; i < nfiles; ++i)
1027 // // {
1028 // // const char *in = filenames[i].c_str();
1029 // // const char *out = outfilenames[i].c_str();
1030 // // if( !AnonymizeOneFile(anon, in, out) )
1031 // // {
1032 // // //std::cerr << "Could not anonymize: " << in << std::endl;
1033 // // return 1;
1034 // // }
1035 // // }
1036 // // }
1037 // }
1038 //}
1039 //
1040 } // EO namespace creaImageIO