]> Creatis software - creaImageIO.git/blob - src2/creaImageIODicomImageReader.cpp
0dde6ca0638979dab31be9f925054098d1a3a0f1
[creaImageIO.git] / src2 / creaImageIODicomImageReader.cpp
1 #include <creaImageIODicomImageReader.h>
2 #include <gdcmFile.h> 
3 #include <vtkGdcmReader.h>
4 #include <creaImageIOSystem.h>
5 #include "boost/filesystem/path.hpp"
6
7 #include <creaImageIOTreeAttributeDescriptor.h>
8 #include <vtkStringArray.h>
9 #ifdef _DEBUG
10 #define new DEBUG_NEW
11 #endif
12 namespace creaImageIO
13 {
14
15   //=====================================================================
16   DicomImageReader::DicomImageReader()
17   {
18     mReader = vtkGdcmReader::New();
19     SetName ( "Dicom" );
20   };
21   //=====================================================================
22   
23   //=====================================================================
24   DicomImageReader::~DicomImageReader()
25   {
26     mReader->Delete();
27   }
28   //=====================================================================
29
30   //=====================================================================  
31   bool DicomImageReader::CanRead(const std::string& filename)
32   { 
33     GDCM_NAME_SPACE::Document*doc;
34     GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
35     file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
36     file->SetFileName(filename.c_str());
37     file->Load();
38     bool ok = file->IsReadable();
39         if(!ok)
40         {
41                 doc = (GDCM_NAME_SPACE::Document*)file; 
42                 ok = doc->IsReadable();
43         }
44     file->Delete();
45     return ok;
46   }
47   //=====================================================================
48
49   //=====================================================================
50   vtkImageData* DicomImageReader::ReadImage(const std::string& filename)
51   {
52     vtkImageData* im = 0;
53     try
54       {
55         mReader->SetFileName(filename.c_str());
56         mReader->Update();
57         im = vtkImageData::New();
58         im->ShallowCopy(mReader->GetOutput());
59       }
60     catch (...)
61       {
62         if (im!=0) im->Delete();
63           im = 0;
64       }
65     return im;
66   }
67
68   //=====================================================================
69   void DicomImageReader::PushBackExtensions(std::vector<std::string>& v)
70   {
71     v.push_back("dcm");
72     v.push_back("");
73   }
74   //=====================================================================
75   
76   //========================================================================
77   std::string irclean(const std::string& str)
78   {
79           if(str.size() > 0)
80           {
81                 if (str == "GDCM::Unfound") 
82                   {
83                 return "";
84                   }
85                 if (str[str.size()-1]==' ')
86                   {
87                 return str.substr(0,str.size()-1);
88                   }
89                 if (str[str.size()-1]==0)
90                   {
91                 return str.substr(0,str.size()-1);
92                   }
93           }
94     
95     return str;
96   }
97   //========================================================================
98
99   //=====================================================================
100   void DicomImageReader::ReadAttributes(const std::string& filename, 
101                       std::map<std::string,std::string>& attr)
102   {
103     GimmickMessage(2,"Reading attributes from DICOM file '"
104                    <<filename<<"'"<<std::endl);
105
106     GDCM_NAME_SPACE::File* file = GDCM_NAME_SPACE::File::New();
107
108     GDCM_NAME_SPACE::Document *doc= GDCM_NAME_SPACE::File::New();
109     doc->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
110     doc->SetFileName(filename.c_str());
111     doc->Load();
112     file->SetLoadMode( GDCM_NAME_SPACE::LD_ALL);
113     file->SetFileName(filename.c_str());
114     file->Load();
115     if (file->IsReadable() ||((GDCM_NAME_SPACE::Document*) file)->IsReadable())
116       {
117         std::map<std::string,std::string>::iterator i;
118         for (i=attr.begin();i!=attr.end();++i)
119           {
120             if ( i->first == "D0004_1500" )
121               {
122                 boost::filesystem::path full_path(filename);
123                 std::string f = full_path.leaf();
124                 i->second = f;
125               }
126             else if ( i->first == "FullFileName" )
127               {
128                 i->second = filename;
129               }
130                   else if ( i->first == "FullFileDirectory" )
131               {
132                           std::string::size_type last_pos = filename.find_last_of("//");
133                           //find first separator
134                           i->second = filename.substr(0, last_pos);
135               }
136             else
137               {
138                 uint16_t gr;
139                 uint16_t el;
140                 tree::AttributeDescriptor::GetDicomGroupElementFromKey(i->first,gr,el);
141                 if ( ( gr!=0 ) && ( el!=0 ) )
142                   {
143                     std::string val = file->GetEntryString(gr,el);
144                     i->second = irclean(val);
145                   }
146               }
147           }
148       }
149     file->Delete();
150   }
151
152   //=====================================================================
153   
154 } // namespace creaImageIO
155