]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOGimmickView.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIOGimmickView.cpp
index 9d2b3dcb199d5a61c17dcb10a0bfdcf1b4bde850..01f868ebc0342048e13961f4da10412843a205fb 100644 (file)
@@ -8,6 +8,54 @@ namespace fs = boost::filesystem;
 namespace creaImageIO
 {
 
+       ///Class used to represent the actual state of the image selected and to perform comparisons on its values
+  class ImageExtent
+  {
+  public:
+    ImageExtent(const std::string& x, const std::string& y, const std::string& z, const std::string& t)
+       {
+                sscanf(x.c_str(),"%d",&mExtent[0]);
+                sscanf(y.c_str(),"%d",&mExtent[1]);
+                sscanf(z.c_str(),"%d",&mExtent[2]);
+                sscanf(t.c_str(),"%d",&mExtent[3]);
+                if(x==""){mExtent[0]=1;}
+            if(y==""){mExtent[1]=1;}
+            if(z==""){mExtent[2]=1;}
+                if(t==""){mExtent[3]=1;}
+
+                if (mExtent[3]>1) mDim=4;
+                else if (mExtent[2]>1) mDim=3;
+            else if (mExtent[1]>1) mDim=2;
+            else if (mExtent[0]>1) mDim=1;
+                else mDim=0;
+       }
+       
+
+       ///Clears the extent
+    void Clear() { mExtent[0] = mExtent[1] = mExtent[2] = mExtent[3] = 1; }
+
+       ///Returns true if the two extents are compatible
+    bool IsCompatible( const ImageExtent& );
+
+       ///Adds the extent passed as a parameter to the current extent
+    void Add ( const ImageExtent& );
+               
+       ///Returns the ieth position of the extent
+    int Get(int i) { return mExtent[i]; }
+    
+       ///Returns the dimension of the current image
+    void SetDimension(int dim) { mDim=dim; }
+
+       ///Returns the dimension of the current image
+    int GetDimension() { return mDim; }
+
+  private:
+    int mExtent[4];
+    int mDim;
+  };
+
+  //======================================================================
+
   //======================================================================
   // CTor
   GimmickView::GimmickView(Gimmick* gimmick, int threads)
@@ -19,7 +67,7 @@ namespace creaImageIO
        // Anciently started the threads ...
     // Threads now automatically start at first image request
     //mReader.Start();
-
+       
   }
   //======================================================================
 
@@ -38,10 +86,8 @@ namespace creaImageIO
   /// 
   void GimmickView::Initialize()
   {
-         row="";
-         col="";
-         plane="";
-         selectionSize=0;
+       mImageExtent=0;
+       mReaderStarted=false;
   }
   //======================================================================
   
@@ -66,6 +112,15 @@ namespace creaImageIO
        this->CreateTreeView(i->second);
       }
   }
+
+  /// Create a tree view with a given name
+  void GimmickView::CreateSingleTreeView(std::string &i_name)
+  {
+               this->CreateTreeView(mGimmick->GetTreeHandlerMap()[i_name]);
+     
+  }
+
+
   //======================================================================
 
   //======================================================================
@@ -84,230 +139,214 @@ namespace creaImageIO
   }
   //======================================================================
   /// Clears the status and begins a new selection process
-  void GimmickView::ClearStatus()
+  void GimmickView::ResetExtent()
   {
-         row="";
-         col="";
-         plane="";
-         selectionSize=0;
+         if(mImageExtent!=0)
+         {
+         mImageExtent=0;
+         }
          valid=true;
   }
 
 
-  class ImageExtent
+  //======================================================================
+  
+  //======================================================================
+  bool ImageExtent::IsCompatible(const ImageExtent& ie)
   {
-  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;
-  };
+         bool compatible=true;
+         ImageExtent * extent= (ImageExtent*)&ie;
+         if((*extent).Get(0)!=Get(0)
+                || (*extent).Get(1)!=Get(1))
+         {
+                 compatible=false;
+         }
+         return compatible;
+  }
 
+  //======================================================================
+  
+  //======================================================================
+  void ImageExtent::Add(const ImageExtent& ie)
+  {
+         ImageExtent * extent= (ImageExtent*)&ie;
+         mExtent[2]+=(*extent).Get(2);
+         if(mExtent[2]>1)
+         {
+         SetDimension(3);
+         }
+  }
 
   //======================================================================
   ///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);
+       GimmickDebugMessage(2,"Validating selected"<<std::endl);
        std::string mMessage;
+       
        if(sel==0)
        {
                mMessage="Cannot have 0 images selected!";
                valid=false;
        }
-       if(valid)
+       else
        {
-       selectionSize++;
-         /*// EED validate all
-         mValidationSignal(valid);
-         return valid;*/
-         
-       int level;
-       
-       
-       if(row.compare("")==0 || col.compare("")==0)
+       ImageExtent* ie=new ImageExtent((*sel).GetAttribute("D0028_0010"),
+                                                (*sel).GetAttribute("D0028_0011"),
+                                                                        (*sel).GetAttribute("D0028_0012"), 
+                                                                        "");
+       if(mImageExtent==0)
        {
-               row=(*sel).GetAttribute("D0028_0010");
-               col=(*sel).GetAttribute("D0028_0011");
-               plane=(*sel).GetAttribute("D0028_0012");
-               level=(*sel).GetLevel();
+               mImageExtent=ie;
+               if((mImageExtent->Get(min_dim-1)<2)||(mImageExtent->Get(max_dim)>1))
+               {
+                       valid=false;
+               }
+               else
+               {
+                       std::stringstream out;
+                       out << mImageExtent->GetDimension() << "D image " << mImageExtent->Get(0) << "x"<< mImageExtent->Get(1) << "x"<< mImageExtent->Get(2) <<" selected";
+               mMessage = out.str();
+                       mImageExtent->SetDimension(2);
+                       valid=true;
+               }
        }
        else
        {
-               if(((*sel).GetAttribute("D0028_0010"))!=row ||
-                       ((*sel).GetAttribute("D0028_0011"))!=col ||
-                       ((*sel).GetAttribute("D0028_0012"))!=plane)
+               if(mImageExtent->IsCompatible(*ie))
+               {
+                       if(mImageExtent->GetDimension()==max_dim && mImageExtent->Get(max_dim)>2)
+                       {
+                               std::stringstream out;
+                               out<<"Cannot add this image to selection : would result in a "<<mImageExtent->GetDimension()+1<<"D image!";
+                               mMessage=out.str();
+                               valid=false;
+                       }
+                       else if(max_dim<3)
+                       {
+                               std::stringstream out;
+                               out<<"Selecting "<<mImageExtent->GetDimension()<<"D images is not allowed !";
+                               mMessage=out.str();
+                               valid=false;
+                       }
+                       else if(min_dim==3 && (ie->Get(2)+mImageExtent->Get(2))<2)
                        {
-                               mMessage="The selected images are not compatible.";
+                               std::stringstream out;
+                               out << "Cannot build the selection as it would result in a ";
+                               out << mImageExtent->GetDimension();
+                               out << "D image, and the minimum is ";
+                               out << min_dim;
+                               out << "D!";
+                               mMessage=out.str();
                                valid=false;
                        }
+                       else
+                       {
+            mImageExtent->Add(*ie);
+                       std::stringstream out;
+                       out << mImageExtent->GetDimension() << "D image " << mImageExtent->Get(0) << "x"<< mImageExtent->Get(1) << "x"<< mImageExtent->Get(2) <<" selected";
+               mMessage = out.str();
+                       }
+                       
+               }
+               else
+               {
+                       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);
+
+       
+       modifyValidationSignal(valid);
        SetMessage(mMessage);
        return valid;
   }
 
-   //======================================================================
+  //======================================================================
+  void GimmickView::modifyValidationSignal(bool ivalid)
+  {
+         mValidationSignal(ivalid);
+  }
+
 
    //======================================================================
   ///Reads Images (Non Threaded)
-  void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<tree::Node*> im, int dimension)
-  {
+void GimmickView::ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<std::string> 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")
+               GimmickDebugMessage(3, "State Check: Full Filename: "
+                                               <<im.front()
                                                <<std::endl);
-               out->ShallowCopy(mReader.GetImage(im.front()->GetAttribute("FullFileName")));
+               out->ShallowCopy(mReader.GetImage(im.front()));
                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);
-             }
-         }
-      }
-       
-  }
+       {
+               vtkImageData* first = mReader.GetImage( im.front());
+               if (dimension == 2) 
+               {  
+                // n3D
+                 std::vector<std::string>::iterator it;
+                       for (it=im.begin(); it!=im.end(); ++it) 
+                       {
+                               vtkImageData* out = vtkImageData::New();
+                               out->ShallowCopy(mReader.GetImage(*it));
+                               s.push_back(out);
+                       }
+               }         
+               else 
+               {
+                       // n2D to 3D
+                       vtkImageData* out = vtkImageData::New();
+                       out->CopyStructure(first);      
+                       out->SetScalarType(first->GetScalarType());
+                       int ext[6];
+                       first->GetExtent(ext);
+                       ext[5] = im.size()-1;
+                       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 = dim[0] * dim[1];/*
+                               ( (unsigned long)first->GetScalarPointer(0,1,0)
+                       - (unsigned long)first->GetScalarPointer(0,0,0))
+                               *dim[1];*/
+
+                       int slice = 0;
+                       std::vector<std::string>::iterator it;
+                       for (it=im.begin(); it!=im.end(); ++it) 
+                               {
+                       //std::cout << "copying slice "<<slice <<std::endl;
+                                       vtkImageData* cur = mReader.GetImage( (*it));
+
+                       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;
+                       std::cout << slice;
+                       memcpy(dst,src,imsize);
+
+                       slice++;
+                               }       
+                       s.push_back(out);
+                               
+               }
+       }       
+}
   //======================================================================
 
   //======================================================================
@@ -315,7 +354,11 @@ namespace creaImageIO
   void GimmickView::RequestReading(tree::Node* n, 
                                   int prio, int selection_index, ImagePointerHolder *p)
   {
-       mReader.Start();
+         if(!mReaderStarted)
+         {
+               mReader.Start();
+               mReaderStarted=true;
+         }
     ImageEventType t(n,selection_index, p);
     mImageEventMap[n->GetAttribute("FullFileName")] = t;    
     mReader.Request(this,n->GetAttribute("FullFileName"),prio);
@@ -332,28 +375,31 @@ namespace creaImageIO
                        "MultiThreadImageReader event : "<<e<<std::endl);
        if (e==ImageLoaded)
        {
-    if (filename.size()==0)
-      {
+               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);
-      }
+                       return;
+               }
+               ImageEventTypeMap::iterator i;
+//JCP 22-06-2009, test mImageEventMap.size() > 0
+               if(mImageEventMap.size()>0){
+                       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)
        {