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