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