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