1 #include <creaImageIODicomImageReader.h>
3 #include <vtkGdcmReader.h>
4 #include <creaImageIOSystem.h>
5 #include "boost/filesystem/path.hpp"
7 #include <creaImageIOTreeAttributeDescriptor.h>
8 #include <vtkStringArray.h>
13 //=====================================================================
14 DicomImageReader::DicomImageReader()
16 mReader = vtkGdcmReader::New();
19 //=====================================================================
21 //=====================================================================
22 DicomImageReader::~DicomImageReader()
26 //=====================================================================
28 //=====================================================================
29 bool DicomImageReader::CanRead(const std::string& filename)
31 // std::cout << "## Reader "<<GetName()
32 //<<" ::CanRead("<<filename<<")"
38 // std::cout << "GDCM_NAME_SPACE = '" << STRINGIFY_SYMBOL(GDCM_NAME_SPACE)
42 GDCM_NAME_SPACE::Document*doc;
43 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
44 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
45 file->SetFileName(filename.c_str());
47 bool ok = file->IsReadable();
50 doc = (GDCM_NAME_SPACE::Document*)file;
51 ok = doc->IsReadable();
56 //=====================================================================
58 //=====================================================================
59 vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
61 // std::cout << "## Reader "<<GetName()
62 //<<" ::Read("<<filename<<")"
68 mReader->SetFileName(filename.c_str());
70 im = vtkImageData::New();
71 im->ShallowCopy(mReader->GetOutput());
75 if (im!=0) im->Delete();
81 //=====================================================================
82 void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
87 //=====================================================================
89 //========================================================================
90 std::string irclean(const std::string& str)
92 if (str == "GDCM::Unfound")
96 if (str[str.size()-1]==' ')
98 return str.substr(0,str.size()-1);
100 if (str[str.size()-1]==0)
102 return str.substr(0,str.size()-1);
107 //========================================================================
109 //=====================================================================
110 void DicomImageReader::ReadAttributes(const std::string& filename,
111 std::map<std::string,std::string>& attr)
113 // std::cout << "DicomImageReader::ReadDicomInfo '"<<filename<<"'"<<std::endl;
114 GimmickMessage(2,"Reading attributes from DICOM file '"
115 <<filename<<"'"<<std::endl);
117 GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
119 GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New();
120 doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
121 doc->SetFileName(filename.c_str());
123 file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
124 file->SetFileName(filename.c_str());
126 if (file->IsReadable() ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
129 std::map<std::string,std::string>::iterator i;
130 for (i=attr.begin();i!=attr.end();++i)
132 if ( i->first == "D0004_1500" )
134 boost::filesystem::path full_path(filename);
135 std::string f = full_path.leaf();
138 else if ( i->first == "FullFileName" )
140 i->second = filename;
142 else if ( i->first == "FullFileDirectory" )
144 std::string::size_type last_pos = filename.find_last_of("//");
145 //find first separator
146 i->second = filename.substr(0, last_pos);
152 tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
153 // GimmickMessage(2,"Key '"<<i->first<<"' : "<<gr<<"|"<<el
155 if ( ( gr!=0 ) && ( el!=0 ) )
157 std::string val = file->GetEntryString(gr,el);
158 i->second = irclean(val);
159 // GimmickMessage(2,"Key '"<<i->first<<"' : "<<gr<<"|"<<el
160 // <<"="<<i->second<<std::endl);
168 //=====================================================================
170 } // namespace creaImageIO