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