X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOGimmickView.cpp;h=f7e894d089fd802314cd83573999f8884a6682a8;hb=d29be141890963fdc3236a28c81cd9dce0e19f69;hp=6084c7d7ff3d097ba932bbdbc78803fdbc6860fb;hpb=6cac83c30fb8c3cd89c41685078eccff6e952a50;p=creaImageIO.git diff --git a/src2/creaImageIOGimmickView.cpp b/src2/creaImageIOGimmickView.cpp index 6084c7d..f7e894d 100644 --- a/src2/creaImageIOGimmickView.cpp +++ b/src2/creaImageIOGimmickView.cpp @@ -1,8 +1,61 @@ #include #include +#include "boost/filesystem.hpp" + +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) @@ -11,9 +64,10 @@ namespace creaImageIO { GimmickDebugMessage(1,"GimmickView::GimmickView" <GetTreeHandlerMap().end(); ++i) { - this->CreateTreeView(i->second); + this->CreateTreeView(i->second, mGimmick->GetTimestampDatabase()); } } + + /// Create a tree view with a given name + void GimmickView::CreateSingleTreeView(std::string &i_name) + { + this->CreateTreeView(mGimmick->GetTreeHandlerMap()[i_name], + mGimmick->GetTimestampDatabase()); + + } + + //====================================================================== //====================================================================== @@ -72,124 +138,143 @@ namespace creaImageIO } i->second->UpdateLevel(l); } + //====================================================================== + /// Clears the status and begins a new selection process + void GimmickView::ResetExtent() + { + if(mImageExtent!=0) + { + mImageExtent=0; + } + valid=true; + } + + + //====================================================================== + + //====================================================================== + bool ImageExtent::IsCompatible(const ImageExtent& ie) + { + 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 (std::vector& sel, int min_dim, int max_dim) + bool GimmickView::ValidateSelected (tree::Node* sel, int min_dim, int max_dim) { - GimmickMessage(2,"Validating selected"<0) + + if(sel==0) { - std::vector::iterator i; - std::string row; - std::string col; - std::string plane; - - //Validation between image sizes - for (i=sel.begin(); i!=sel.end() && valid; ++i) + mMessage="Cannot have 0 images selected!"; + valid=false; + } + else + { + ImageExtent* ie=new ImageExtent((*sel).GetAttribute("D0028_0010"), + (*sel).GetAttribute("D0028_0011"), + (*sel).GetAttribute("D0028_0012"), + ""); + if(mImageExtent==0) + { + 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(mImageExtent->IsCompatible(*ie)) { - if(i==sel.begin()) + if(mImageExtent->GetDimension()==max_dim && mImageExtent->Get(max_dim)>2) + { + std::stringstream out; + out<<"Cannot add this image to selection : would result in a "<GetDimension()+1<<"D image!"; + mMessage=out.str(); + valid=false; + } + else if(max_dim<3) { - row=(*i)->GetAttribute("D0028_0010"); - col=(*i)->GetAttribute("D0028_0011"); - plane=(*i)->GetAttribute("D0028_0012"); - level=(*i)->GetLevel(); - + std::stringstream out; + out<<"Selecting "<GetDimension()<<"D images is not allowed !"; + mMessage=out.str(); + valid=false; + } + else if(min_dim==3 && (ie->Get(2)+mImageExtent->Get(2))<2) + { + 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 { - 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; - } + 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; } - - //Dimention validation - //Compatibility with maximum and minimum - 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: " - <& s,std::vector im, int dimension) + void GimmickView::ReadImagesNotThreaded(std::vector& s,std::vector im, int dimension) { // Create the output data @@ -198,16 +283,16 @@ namespace creaImageIO // Only one image : give it vtkImageData* out = vtkImageData::New(); - GimmickMessage(1, "State Check: Full Filename: " - <GetAttribute("FullFileName") + GimmickDebugMessage(3, "State Check: Full Filename: " + <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")); + vtkImageData* first = mReader.GetImage( im.front()); if (dimension==2) { // n2D to 3D @@ -233,11 +318,11 @@ namespace creaImageIO *dim[1]; int slice = 0; - std::vector::iterator it; - for (it=im.begin(); it!=im.end(); ++it) + std::vector::iterator it; + for (it=im.begin(); it!=im.end(); ++it) { //std::cout << "copying slice "<GetAttribute("FullFileName")); + vtkImageData* cur = mReader.GetImage( (*it)); void* src = cur->GetScalarPointer(0,0,0); void* dst = out->GetScalarPointer(0,0,slice); @@ -253,19 +338,33 @@ namespace creaImageIO else { // n3D - std::vector::iterator it; + std::vector::iterator it; for (it=im.begin(); it!=im.end(); ++it) { vtkImageData* out = vtkImageData::New(); - out->ShallowCopy(mReader.GetImage((*it)->GetAttribute("FullFileName"))); + 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) + { + if(!mReaderStarted) + { + mReader.Start(); + mReaderStarted=true; + } + ImageEventType t(n,selection_index, p); + mImageEventMap[n->GetAttribute("FullFileName")] = t; + mReader.Request(this,n->GetAttribute("FullFileName"),prio); + } //====================================================================== //====================================================================== @@ -274,17 +373,75 @@ namespace creaImageIO MultiThreadImageReaderUser::EventType e, vtkImageData* image) { + GimmickDebugMessage(7, + "MultiThreadImageReader event : "<::iterator i; - i = mImageFileNameToNode.find(filename); - if (i!=mImageFileNameToNode.end()) + ImageEventTypeMap::iterator i; + i = mImageEventMap.find(filename); + if (i!=mImageEventMap.end()) { - mImageEventQueue.push_back(ImageEventType(i->second,image)); + GimmickDebugMessage(5, + "Putting image of file '"<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); }