#include #include #include #include "boost/filesystem/path.hpp" namespace creaImageIO{ //===================================================================== VtkImageReader::VtkImageReader(vtkImageReader2* r, const std::string& name, const std::string& extensions) : mReader(r), mExtensions(extensions) { if (name.size() == 0) { const char *test =mReader->GetDescriptiveName(); if(test != "") { SetName ( "toto");// mReader->GetDescriptiveName()); } } else { SetName ( name ); } GimmickDebugMessage(5,"Constructing vtkImageReader : "<Delete(); } //===================================================================== //===================================================================== bool VtkImageReader::CanRead(const std::string& filename) { return (mReader->CanReadFile(filename.c_str())!=0); /* if(filename != "") { return (mReader->CanReadFile(filename.c_str())!=0); } else { return false; }*/ } //===================================================================== //===================================================================== vtkImageData* VtkImageReader::ReadImage(const std::string& filename) { vtkImageData* im = 0; try { mReader->SetFileName(filename.c_str()); mReader->Update(); im = vtkImageData::New(); im->ShallowCopy(mReader->GetOutput()); } catch (...) { if (im!=0) im->Delete(); im = 0; } return im; } //===================================================================== //===================================================================== void SplitExtensionsString ( const std::string& str, const std::string& delimiters, std::vector& tokens) { // Skip delimiters at beginning. std::string::size_type lastPos = str.find_first_not_of(delimiters, 0); // Find first delimiter. std::string::size_type pos = str.find_first_of(delimiters, lastPos); while (std::string::npos != pos || std::string::npos != lastPos) { // Found a token, add it to the vector. // SPECIFIC : REMOVE INITIAL DOT (lastPos + 1) tokens.push_back(str.substr(lastPos+1, pos - lastPos)); // Skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // Find next delimiter pos = str.find_first_of(delimiters, lastPos); } } //===================================================================== //===================================================================== void VtkImageReader::PushBackExtensions(std::vector& v) { std::string ext = mExtensions; if (ext.size()==0) ext = mReader->GetFileExtensions (); SplitExtensionsString(ext," ",v); } //===================================================================== //===================================================================== void VtkImageReader::ReadAttributes(const std::string& filename, std::map& attr) { GimmickMessage(2,"Reading attributes from '"<SetFileName(filename.c_str()); mReader->Update(); //OpenFile(); int ext[6]; mReader->GetDataExtent(ext); // Columns char cols[128]; sprintf(cols,"%i",ext[1]-ext[0]); // Rows char rows[128]; sprintf(rows,"%i",ext[3]-ext[2]); // Planes char planes[128]; sprintf(planes,"%i",ext[5]-ext[4]); std::map::iterator i; if ( (i = attr.find("FullFileName")) != attr.end()) { i->second = filename; } if ( (i = attr.find("D0004_1500")) != attr.end()) { boost::filesystem::path full_path(filename); std::string f = full_path.leaf(); i->second = f; } if ( (i = attr.find("D0028_0010")) != attr.end()) { i->second = rows; } if ( (i = attr.find("D0028_0011")) != attr.end()) { i->second = cols; } if ( (i = attr.find("D0028_0012")) != attr.end()) { i->second = planes; } if ( (i = attr.find("FullFileDirectory")) != attr.end()) { std::string::size_type last_pos = filename.find_last_of("//"); i->second = filename.substr(0, last_pos); } GimmickMessage(2,"Attributes map:"<