#include #include #include "boost/filesystem.hpp" namespace fs = boost::filesystem; namespace creaImageIO { //====================================================================== // CTor GimmickView::GimmickView(Gimmick* gimmick, int threads) : mGimmick(gimmick), mReader(threads) { GimmickDebugMessage(1,"GimmickView::GimmickView" <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 : '" <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"<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: " <& s,std::vector 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: " <GetAttribute("FullFileName") <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::iterator it; for (it=im.begin(); it!=im.end(); ++it) { //std::cout << "copying slice "<GetAttribute("FullFileName")); void* src = cur->GetScalarPointer(0,0,0); void* dst = out->GetScalarPointer(0,0,slice); // std::cout << "src="<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 : "<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