]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOGimmickView.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIOGimmickView.cpp
index d7f04de80ca379fd6097674744548d7bef261b66..9d2b3dcb199d5a61c17dcb10a0bfdcf1b4bde850 100644 (file)
 #include <creaImageIOGimmickView.h>
 #include <creaImageIOSystem.h>
 
+#include "boost/filesystem.hpp"
+
+namespace fs = boost::filesystem;
+
 namespace creaImageIO
 {
+
+  //======================================================================
   // CTor
-  GimmickView::GimmickView(Gimmick* gimmick)
+  GimmickView::GimmickView(Gimmick* gimmick, int threads)
+    : mGimmick(gimmick),
+         mReader(threads)
   {
     GimmickDebugMessage(1,"GimmickView::GimmickView"
                        <<std::endl);
+       // Anciently started the threads ...
+    // Threads now automatically start at first image request
+    //mReader.Start();
+
   }
+  //======================================================================
 
+  //======================================================================
   /// Destructor
   GimmickView::~GimmickView()
   {
     GimmickDebugMessage(1,"GimmickView::~GimmickView"
                        <<std::endl);
   }
-  
-  
+   //======================================================================
+  //======================================================================  
   /// Initializes the view : 
   /// Creates the TreeViews for all the TreeHandler of the Controller
   /// 
   void GimmickView::Initialize()
   {
+         row="";
+         col="";
+         plane="";
+         selectionSize=0;
   }
+  //======================================================================
   
+  //======================================================================
   /// Finalize 
   void GimmickView::Finalize()
   {
   }
+
+  //======================================================================
+
+  //======================================================================
+  /// Create the tree views 
+  void GimmickView::CreateTreeViews()
+  {
+    GimmickMessage(2,"Creating the tree views"<<std::endl);
+    Gimmick::TreeHandlerMapType::const_iterator i;
+    for (i = mGimmick->GetTreeHandlerMap().begin();
+        i!= mGimmick->GetTreeHandlerMap().end();
+        ++i)
+      {
+       this->CreateTreeView(i->second);
+      }
+  }
+  //======================================================================
+
+  //======================================================================
+  /// Updates the TreeView of given name from level l to bottom
+  /// (calls the virtual method TreeView::Update())
+  void GimmickView::UpdateTreeViewLevel(const std::string& t, int l)
+  {
+    TreeViewMapType::iterator i;
+    i = GetTreeViewMap().find(t);
+    if ( i == GetTreeViewMap().end() )
+      {
+       GimmickError("INTERNAL ERROR : GimmickView::UpdateTreeView : '"
+                    <<t<<"' is not in TreeViewMap");
+      }
+    i->second->UpdateLevel(l);    
+  }
+  //======================================================================
+  /// Clears the status and begins a new selection process
+  void GimmickView::ClearStatus()
+  {
+         row="";
+         col="";
+         plane="";
+         selectionSize=0;
+         valid=true;
+  }
+
+
+  class ImageExtent
+  {
+  public:
+    ImageExtent(const std::string& x, const std::string& y, const std::string& z, const std::string& t);
+
+    void Clear() { mExtent[0] = mExtent[1] = mExtent[2] = mExtent[3] = 1; }
+
+    bool IsCompatible( const ImageExtent& );
+
+    void Add ( const ImageExtent& );
+               
+    int Get(int i) { return mExtent[i]; }
+    
+    int GetDimension() { return mDim; }
+
+  private:
+    int mExtent[4];
+    int mDim;
+  };
+
+
+  //======================================================================
+  ///Validates the dimension compliance of the images with the maximum and 
+  ///minimum given, and between their sizes
+  bool GimmickView::ValidateSelected (tree::Node* sel, int min_dim, int max_dim)
+  {
+       GimmickMessage(2,"Validating selected"<<std::endl);
+       std::string mMessage;
+       if(sel==0)
+       {
+               mMessage="Cannot have 0 images selected!";
+               valid=false;
+       }
+       if(valid)
+       {
+       selectionSize++;
+         /*// EED validate all
+         mValidationSignal(valid);
+         return valid;*/
+         
+       int level;
+       
+       
+       if(row.compare("")==0 || col.compare("")==0)
+       {
+               row=(*sel).GetAttribute("D0028_0010");
+               col=(*sel).GetAttribute("D0028_0011");
+               plane=(*sel).GetAttribute("D0028_0012");
+               level=(*sel).GetLevel();
+       }
+       else
+       {
+               if(((*sel).GetAttribute("D0028_0010"))!=row ||
+                       ((*sel).GetAttribute("D0028_0011"))!=col ||
+                       ((*sel).GetAttribute("D0028_0012"))!=plane)
+                       {
+                               mMessage="The selected images are not compatible.";
+                               valid=false;
+                       }
+       }
+               
+       
+       int dim = 0;
+       int rows;
+       int cols;
+       int planes;
+       
+       //Dimention validation
+       //Compatibility with maximum and minimum
+       if(valid)
+         {     
+                   sscanf(row.c_str(),"%d",&rows);
+           sscanf(col.c_str(),"%d",&cols);
+           sscanf(plane.c_str(),"%d",&planes);
+           if(row==""){rows=1;}
+           if(col==""){cols=1;}
+           if(plane==""){planes=1;}
+           
+           std::cout << cols << "x"<<rows<<"x"<<planes << std::endl;
+
+           if (planes>1) dim=3;
+           else if (cols>1) dim=2;
+           else if (rows>1) dim=1;
+           
+           if (dim == 0) 
+             {
+               mMessage="Unknown image dimension : cannot select !";
+               valid= false;
+             }
+           else if (dim>max_dim)
+             {
+               mMessage="Selecting ";
+               mMessage+=dim;
+               mMessage+="D images is not allowed !";
+               valid= false;
+             }
+           if ( dim == max_dim )
+             {
+               mMessage="Cannot add this image to selection : would result in a ";
+               mMessage+=(dim+1);
+               mMessage+="D image!";
+               
+               valid= false;
+             }
+           if ( dim < min_dim )
+             {
+               GimmickMessage(1, "State Check: Dim: "
+                              <<dim
+                              <<" Dim min:"
+                              <<min_dim
+                              <<std::endl);
+               std::stringstream out;
+               out << "Cannot build the selection as it would result in a ";
+               out << dim;
+               out << "D image, and the minimum is ";
+               out << min_dim;
+               out << "D!";
+               mMessage+=out.str();
+               valid= false;
+             }
+         }
+       
+       
+       if(valid)
+         {
+           std::stringstream out;
+           out << dim << "D image " << cols << "x"<< rows << "x"<< planes <<" selected";
+           mMessage = out.str();
+         }
+       }
+       mValidationSignal(valid);
+       SetMessage(mMessage);
+       return valid;
+  }
+
+   //======================================================================
+
+   //======================================================================
+  ///Reads Images (Non Threaded)
+  void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<tree::Node*> im, int dimension)
+  {
+         
+       // Create the output data
+       if (im.size()==1) 
+      {
+                 
+               // Only one image : give it
+               vtkImageData* out = vtkImageData::New();
+               GimmickMessage(1, "State Check: Full Filename: "
+                                               <<im.front()->GetAttribute("FullFileName")
+                                               <<std::endl);
+               out->ShallowCopy(mReader.GetImage(im.front()->GetAttribute("FullFileName")));
+               s.push_back( out );
+      }
+         
+    else if (im.size()>1)
+      {
+       vtkImageData* first = mReader.GetImage( im.front()->GetAttribute("FullFileName"));
+       if (dimension==2) 
+         {     
+           // n2D to 3D
+           vtkImageData* out = vtkImageData::New();
+           out->CopyStructure(first);  
+           out->SetScalarType(first->GetScalarType());
+           int ext[6];
+           first->GetExtent(ext);
+           ext[5] = im.size();
+           out->SetExtent(ext);
+           // LG : TODO : Z Spacing  ?
+           
+           out->AllocateScalars();
+           
+           //first->Print(std::cout);
+           //      out->Print(std::cout);
+           
+           int dim[3];
+           first->GetDimensions(dim);
+           unsigned long imsize = 
+             ( (unsigned long)first->GetScalarPointer(0,1,0)
+               - (unsigned long)first->GetScalarPointer(0,0,0))
+             *dim[1];
+
+           int slice = 0;
+               std::vector<tree::Node*>::iterator it;
+           for (it=im.begin(); it!=im.end(); ++it) 
+             {
+               //std::cout << "copying slice "<<slice <<std::endl;
+                         vtkImageData* cur = mReader.GetImage( (*it)->GetAttribute("FullFileName"));
+               
+               void* src = cur->GetScalarPointer(0,0,0);
+               void* dst = out->GetScalarPointer(0,0,slice);
+               //              std::cout << "src="<<src<<std::endl;
+               //              std::cout << "dst="<<dst<<std::endl;
+               //              std::cout << "siz="<<imsize<<std::endl;
+               memcpy(dst,src,imsize);
+
+               slice++;
+             }
+           s.push_back(out);
+         }
+       else 
+         {
+           // n3D
+                 std::vector<tree::Node*>::iterator it;
+           for (it=im.begin(); it!=im.end(); ++it) 
+             {
+               vtkImageData* out = vtkImageData::New();
+               out->ShallowCopy(mReader.GetImage((*it)->GetAttribute("FullFileName")));
+               s.push_back(out);
+             }
+         }
+      }
+       
+  }
+  //======================================================================
+
+  //======================================================================
+  ///Requests the reading of an image
+  void GimmickView::RequestReading(tree::Node* n, 
+                                  int prio, int selection_index, ImagePointerHolder *p)
+  {
+       mReader.Start();
+    ImageEventType t(n,selection_index, p);
+    mImageEventMap[n->GetAttribute("FullFileName")] = t;    
+    mReader.Request(this,n->GetAttribute("FullFileName"),prio);
+  }
+  //======================================================================
+
+  //======================================================================
+  void GimmickView::
+  OnMultiThreadImageReaderEvent(const std::string& filename,
+                               MultiThreadImageReaderUser::EventType e,
+                               vtkImageData* image)
+  {
+    GimmickDebugMessage(7,
+                       "MultiThreadImageReader event : "<<e<<std::endl);
+       if (e==ImageLoaded)
+       {
+    if (filename.size()==0)
+      {
+                 //What to do in this case?
+                 /*
+               GimmickDebugMessage(5,
+                                       "Pushing unknown image in queue"
+                                       <<std::endl);
+               mImageEventQueue.push_back(ImageEventType(image));*/
+               return;
+      }
+    ImageEventTypeMap::iterator i;
+    i = mImageEventMap.find(filename);
+    if (i!=mImageEventMap.end())
+      {
+               GimmickDebugMessage(5,
+                                       "Putting image of file '"<<filename<<"' on pointer"
+                                       <<std::endl);
+               ImageEventType ie(i->second);
+               ie.image = image;
+               ie.pointerHolder->Set(ie.image);
+               //mImageEventMap.erase(i);
+      }
+       }
+       else if (e==Error)
+       {
+               std::string mess="ERROR: MultiThreadImageReader: Cannot read image in file ";
+               mess+=filename;
+               mess+="\n";
+               GimmickMessage(1,mess);
+               ImageEventTypeMap::iterator i;
+               i = mImageEventMap.find(filename);
+               if (i!=mImageEventMap.end())
+               {
+               ImageEventType ie(i->second);
+               ie.image = image;
+               ie.pointerHolder->Set(GetDefaultImage());
+               //mImageEventMap.erase(i);
+               }
+       }
+
+       else if (e==ImageUnloaded)
+       {
+               std::string mess="Unloaded image in file ";
+               mess+=filename;
+               mess+="\n";
+               GimmickMessage(1,mess);
+                               ImageEventTypeMap::iterator i;
+               i = mImageEventMap.find(filename);
+               if (i!=mImageEventMap.end())
+               {
+               ImageEventType ie(i->second);
+               ie.image = image;
+               ie.pointerHolder->Set(GetDefaultImage());
+               //mImageEventMap.erase(i);
+               }
+
+       }
+  }
+
+  //====================================================================
+
+  //====================================================================
+  void GimmickView::ConnectValidationObserver(ValidationCallbackType callback)
+  {
+    mValidationSignal.connect(callback);
+  }
+         
   
 } // EO namespace creaImageIO