X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src2%2FcreaImageIOGimmickView.cpp;h=6b3dfbfb2c1b72ef849075486fde73d99e556cdc;hb=32d7f607334548dd53be21fdf6351ccc4b539900;hp=40bd219cd5fbcedc1869a7fe152be09cf2e62b50;hpb=66f2d68a504d06b45b4047bd7a445c11889b9fc0;p=creaImageIO.git diff --git a/src2/creaImageIOGimmickView.cpp b/src2/creaImageIOGimmickView.cpp index 40bd219..6b3dfbf 100644 --- a/src2/creaImageIOGimmickView.cpp +++ b/src2/creaImageIOGimmickView.cpp @@ -1,8 +1,12 @@ #include #include - #include "boost/filesystem.hpp" +#include // JPR +#include // JPR +#include // JPR +#include + namespace fs = boost::filesystem; namespace creaImageIO @@ -14,22 +18,21 @@ namespace creaImageIO 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; + 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; } @@ -58,7 +61,7 @@ namespace creaImageIO //====================================================================== // CTor - GimmickView::GimmickView(Gimmick* gimmick, int threads) + GimmickView::GimmickView(boost::shared_ptr gimmick, int threads) : mGimmick(gimmick), mReader(threads) { @@ -67,7 +70,6 @@ namespace creaImageIO // Anciently started the threads ... // Threads now automatically start at first image request //mReader.Start(); - } //====================================================================== @@ -86,11 +88,10 @@ namespace creaImageIO /// void GimmickView::Initialize() { - mImageExtent=0; mReaderStarted=false; } //====================================================================== - + //====================================================================== /// Finalize void GimmickView::Finalize() @@ -112,6 +113,14 @@ 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]); + + } + //====================================================================== //====================================================================== @@ -126,22 +135,22 @@ namespace creaImageIO GimmickError("INTERNAL ERROR : GimmickView::UpdateTreeView : '" <second->UpdateLevel(l); + i->second->UpdateLevel(l); } + //====================================================================== /// Clears the status and begins a new selection process void GimmickView::ResetExtent() { if(mImageExtent!=0) { - mImageExtent=0; + mImageExtent.reset(); } valid=true; } - //====================================================================== - + //====================================================================== bool ImageExtent::IsCompatible(const ImageExtent& ie) { @@ -156,7 +165,7 @@ namespace creaImageIO } //====================================================================== - + //====================================================================== void ImageExtent::Add(const ImageExtent& ie) { @@ -168,6 +177,19 @@ namespace creaImageIO } } + //====================================================================== + /// No selected image + bool GimmickView::NoValidateSelected () + { + GimmickDebugMessage(2,"Validating selected"< ie=boost::shared_ptr(new ImageExtent((*sel).GetAttribute("D0028_0010"), + (*sel).GetAttribute("D0028_0011"), + (*sel).GetAttribute("D0028_0012"), + "")); if(mImageExtent==0) { mImageExtent=ie; @@ -198,7 +220,7 @@ namespace creaImageIO { std::stringstream out; out << mImageExtent->GetDimension() << "D image " << mImageExtent->Get(0) << "x"<< mImageExtent->Get(1) << "x"<< mImageExtent->Get(2) <<" selected"; - mMessage = out.str(); + mMessage = out.str(); mImageExtent->SetDimension(2); valid=true; } @@ -234,38 +256,187 @@ namespace creaImageIO } 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(); + 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; } - } + } } - - mValidationSignal(valid); + modifyValidationSignal(valid); SetMessage(mMessage); return valid; } -//====================================================================== + //====================================================================== + void GimmickView::modifyValidationSignal(bool ivalid) + { + mValidationSignal(ivalid); + } //====================================================================== ///Reads Images (Non Threaded) - void GimmickView::ReadImagesNotThreaded(std::vector& s,std::vector im, int dimension) - { - +void GimmickView::ReadImagesNotThreaded(std::vector& s, std::vector im, int dimension) +{ + +/* remember! + +#define GIMMICK_NO_IMAGE_SELECTION 0 +#define GIMMICK_2D_IMAGE_SELECTION 2 +#define GIMMICK_3D_IMAGE_SELECTION 3 +#define GIMMICK_4D_IMAGE_SELECTION 4 + +#define NATIVE 0 +#define _2D 2 +#define _3D 3 + +*/ // Create the output data if (im.size()==1) - { - + { + // Only one image : give it + vtkImageData* out = vtkImageData::New(); + GimmickDebugMessage(3, "State Check: Full Filename: " + <ShallowCopy(mReader.GetImage(im.front())); + s.push_back( out ); + } + else if (im.size()>1) // Test inutile ? JPR + { + // Read the FIRST image to get info ... about all the other ones. ?!? // JPR + vtkImageData* first = mReader.GetImage( im.front()); + + if (dimension == 2) + { + // n3D + std::vector::iterator it; + for (it=im.begin(); it!=im.end(); ++it) + { + vtkImageData* out = vtkImageData::New(); + out->ShallowCopy(mReader.GetImage(*it)); + s.push_back(out); + } + } + else if (dimension == 3) + { + // n*2D to 3D :: --> NON ! Ca va tres bien pour du 2D+T (le ZSpacing, on s'en tape) + // // ne convient pas pour du n*2D a  lire comme un 3D + // // Il faut un gdcmSerieHelper ! + vtkImageData* out = vtkImageData::New(); + out->CopyStructure(first); + out->SetScalarType(first->GetScalarType()); + int ext[6]; + //first->GetExtent(ext); // JPR + first->GetWholeExtent(ext); // renvoie egalement 0,0 en Z // JPR + // Normal : + +std::cout <<"in GimmickView::ReadImagesNotThreaded GetWholeExtent ext ="; +for (int jjj=0;jjj<6;jjj++) + std:cout << " [" << jjj << "]=" << ext[jjj]; +std::cout << std::endl; + + if(ext[5] == 0) + { + ext[5] = im.size()-1; + } + else + { + ext[5] = ext[5] * im.size()-1; // to deal with multiframes - JPR + } + out->SetExtent(ext); + + // LG : TODO : Z Spacing ? // Voir + loin // JPR + + out->AllocateScalars(); + + int dim[3]; + first->GetDimensions(dim); + unsigned long imsize = dim[0] * dim[1]; + imsize = imsize * dim[2] ; // deal with multiframes // JPR +//EED 03-11-2009 + imsize = imsize * first->GetScalarSize(); + + int slice = 0; + std::vector::iterator it; + for (it=im.begin(); it!=im.end(); ++it) + { + vtkImageData* cur = mReader.GetImage( (*it)); + // void* src = cur->GetScalarPointer(0,0,0); + // void* dst = out->GetScalarPointer(0,0,slice); + memcpy(out->GetScalarPointer(0,0,slice), cur->GetScalarPointer(0,0,0), imsize); + + slice++; + } + s.push_back(out); + } +/**/ + else // ici, on traite le cas *vraiment* n*2D as 3D // JPR + { + typedef std::vector FileList; + FileList fileVector; + //GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New(); + GDCM_NAME_SPACE::SerieHelper *sh = GDCM_NAME_SPACE::SerieHelper::New(); + std::vector::iterator it; + for (it=im.begin(); it!=im.end(); ++it) + { + //std::cout << "avant Load ---------" << *it << std::endl; + + ///\TODO liberer les GDCM_NAME_SPACE::File a la fin! // JPR + GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New(); + + f->SetFileName(*it); + f->Load(); + if (f->IsReadable()) + fileVector.push_back(f); + else + std::cout << "File [" << *it << "] not GDCM Readable; Skipped!" << std::endl; + } + + /* + for (int i=0; iGetFileName() << std::endl; + } + */ + if (!sh->IsCoherent(&fileVector)) + { + std::cout << "---------fileset is NOT coherent ?!?" << *it << std::endl; + //return; + } + else + { + sh->OrderFileList(&fileVector); + } + /* + for (int i=0; iGetFileName() << std::endl; + } + */ + vtkGdcmReader *reader = vtkGdcmReader::New(); + reader->SetCoherentFileList(&fileVector); + reader->Update(); + s.push_back(reader->GetOutput()); + reader->GetOutput()->Print(std::cout); + } + /**/ + } +} + //====================================================================== + +void GimmickView::ReadImagesNotThreadedInVector(std::vector& s, std::vector im, int dimension) +{ + // Create the output data + if (im.size()==1) + { // Only one image : give it vtkImageData* out = vtkImageData::New(); GimmickDebugMessage(3, "State Check: Full Filename: " @@ -273,82 +444,56 @@ namespace creaImageIO <ShallowCopy(mReader.GetImage(im.front())); s.push_back( out ); - } - - else if (im.size()>1) - { - vtkImageData* first = mReader.GetImage( im.front()); - 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::iterator it; - for (it=im.begin(); it!=im.end(); ++it) - { - //std::cout << "copying slice "<GetScalarPointer(0,0,0); - void* dst = out->GetScalarPointer(0,0,slice); - // std::cout << "src="<ShallowCopy(mReader.GetImage(*it)); + s.push_back(out); + } + } + else + { + // n2D to 3D // NO! + // n *2D + T in a vector : + std::cout << "---------------------------------------- n *2D + T" << std::endl; + std::vector::iterator it; + for (it=im.begin(); it!=im.end(); ++it) + { + std::cout << "---------------------------------------- [" << *it << "]" << std::endl; + //vtkImageData* out = mReader.GetImage( (*it)); + //s.push_back(out); + vtkImageData* out = vtkImageData::New(); + out->ShallowCopy(mReader.GetImage(*it)); + s.push_back(out); + } + } + } +} //====================================================================== //====================================================================== ///Requests the reading of an image void GimmickView::RequestReading(tree::Node* n, - int prio, int selection_index, ImagePointerHolder *p) + int prio, int selection_index, boost::shared_ptr p) { - if(!mReaderStarted) - { - mReader.Start(); - mReaderStarted=true; - } - ImageEventType t(n,selection_index, p); - mImageEventMap[n->GetAttribute("FullFileName")] = t; - mReader.Request(this,n->GetAttribute("FullFileName"),prio); + if(!mReaderStarted) + { + mReader.Start(); + mReaderStarted=true; + } + ImageEventType t(n,selection_index); + t.pointerHolder = p; + mImageEventMap[n->GetAttribute("FullFileName")] = t; + mReader.Request(this,n->GetAttribute("FullFileName"),prio); } //====================================================================== @@ -362,28 +507,31 @@ namespace creaImageIO "MultiThreadImageReader event : "<second); - ie.image = image; - ie.pointerHolder->Set(ie.image); - //mImageEventMap.erase(i); - } + mImageEventQueue.push_back(ImageEventType(image));*/ + 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 '"<second); + ie.image = image; + ie.pointerHolder->Set(ie.image); + //mImageEventMap.erase(i); + } + } } else if (e==Error) { @@ -417,7 +565,6 @@ namespace creaImageIO ie.pointerHolder->Set(GetDefaultImage()); //mImageEventMap.erase(i); } - } } @@ -427,9 +574,7 @@ namespace creaImageIO void GimmickView::ConnectValidationObserver(ValidationCallbackType callback) { mValidationSignal.connect(callback); - } - + } } // EO namespace creaImageIO -