]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOGimmickView.cpp
Changed validation methods from TreeView to GimmickView (Abstract)
[creaImageIO.git] / src2 / creaImageIOGimmickView.cpp
index 3e958f51b6b53655ed1234faabc17e7d9e5c9f31..49297e9be755c074c127bafa89adf24931ddb479 100644 (file)
@@ -5,11 +5,14 @@ namespace creaImageIO
 {
   //======================================================================
   // CTor
-  GimmickView::GimmickView(Gimmick* gimmick)
-    : mGimmick(gimmick)
+  GimmickView::GimmickView(Gimmick* gimmick, int threads)
+    : mGimmick(gimmick),
+         mReader(threads)
   {
     GimmickDebugMessage(1,"GimmickView::GimmickView"
                        <<std::endl);
+       // Start the threads ...
+    mReader.Start();
   }
   //======================================================================
 
@@ -69,6 +72,198 @@ namespace creaImageIO
     i->second->UpdateLevel(l);    
   }
   //======================================================================
+  ///Validates the dimension compliance of the images with the maximum and 
+  ///minimum given, and between their sizes
+  bool GimmickView::ValidateSelected (std::vector<tree::Node*>& sel, int min_dim, int max_dim)
+  {
+       GimmickMessage(2,"Validating selected"<<std::endl);
+       bool valid=true;
+       int level;
+       std::string mMessage;
+       if(sel.size()>0)
+       {
+               std::vector<tree::Node*>::iterator i;
+               std::string row;
+               std::string col;
+               std::string plane;
+               
+               //Validation between image sizes
+               for (i=sel.begin(); i!=sel.end() && valid; ++i)
+               {
+                       if(i==sel.begin())
+                       {
+                               row=(*i)->GetAttribute("D0028_0010");
+                               col=(*i)->GetAttribute("D0028_0011");
+                               plane=(*i)->GetAttribute("D0028_0012");
+                               level=(*i)->GetLevel();
+                               
+                       }
+                       else
+                       {
+                               if(((*i)->GetAttribute("D0028_0010"))!=row ||
+                                       ((*i)->GetAttribute("D0028_0011"))!=col ||
+                                       ((*i)->GetAttribute("D0028_0012"))!=plane)
+                                       {
+                                               mMessage="The selected images are not compatible.";
+                                               valid=false;
+                                       }
+                       }
+               }
+
+               //Dimention validation
+               //Compatibility with maximum 
+                       if(valid)
+                       {       
+                               
+                               int rows;
+                               int cols;
+                               int planes;
+                               std::string s;
+                               std::istringstream t(s);
+                               s=row;
+                               t >> rows;
+                               if(row==""){rows=1;}
+                               s=col;
+                               t >> cols;
+                               if(col==""){cols=1;}
+                               s=plane;
+                               t >> planes;
+                               if(plane==""){planes=1;}
+
+                               int dim = 0;
+                               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 && sel.size()<2 )
+                               {
+                                       GimmickDebugMessage(2, "State Check: Dim: "
+                                               <<dim
+                                               <<" Dim min:"
+                                               <<min_dim
+                                               <<std::endl);
+                                       mMessage="Cannot build the selection as it would result in a ";
+                                       mMessage+=dim;
+                                       mMessage+="D image, and the minimum is ";
+                                       mMessage+=min_dim;
+                                       mMessage+="D!";
+                                       valid= false;
+                               }
+                       }
+         }
+       else
+       {
+               mMessage="Cannot have 0 images selected";
+               valid=false;
+       }
+       if(valid)
+       {
+               mMessage="Selection OK !";
+       }
+       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);
+             }
+         }
+      }
+       
+  }
+         
   
 } // EO namespace creaImageIO