]> Creatis software - gdcm.git/blob - Example/PrintDicomDir.cxx
Modify the parsing process, not to use (now unexposed) internal mechanisms
[gdcm.git] / Example / PrintDicomDir.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   gdcm
4   Module:    $RCSfile: PrintDicomDir.cxx,v $
5   Language:  C++
6   Date:      $Date: 2005/01/17 11:01:55 $
7   Version:   $Revision: 1.14 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 #include "gdcmDocument.h"
19 #include "gdcmDicomDir.h"
20 #include "gdcmValEntry.h"
21 #include "gdcmDicomDirPatient.h"
22 #include "gdcmDicomDirStudy.h"
23 #include "gdcmDicomDirSerie.h"
24 #include "gdcmDicomDirImage.h"
25 #include "gdcmTS.h"
26 #include "gdcmDebug.h"
27
28 #include <fstream>
29 #include <iostream>
30
31 int main(int argc, char* argv[])
32 {  
33    gdcm::DicomDir *e1;
34    gdcm::TSKey v;
35
36    gdcm::DicomDirPatient *pa;
37    gdcm::DicomDirStudy *st;
38    gdcm::DicomDirSerie *se;
39    gdcm::DicomDirImage *im;
40   
41    std::string fileName; 
42    if (argc > 1) 
43       fileName = argv[1];    
44    else 
45    {
46       fileName = GDCM_DATA_ROOT;
47       fileName += "/DICOMDIR";
48    }
49
50    if (argc > 3)
51       gdcm::Debug::SetDebugOn();
52
53    e1 = new gdcm::DicomDir( fileName );
54
55    e1->SetPrintLevel(2);
56    int detailLevel;
57    if (argc > 2)
58       detailLevel = atoi(argv[2]);   
59    else
60       detailLevel = 3;
61
62    // Test if the DicomDir is readable
63    if( !e1->IsReadable() )
64    {
65       std::cout<<"          DicomDir '"<<fileName
66                <<"' is not readable"<<std::endl
67                <<"          ...Failed"<<std::endl;
68
69       delete e1;
70       return 1;
71    }
72
73    // Test if the DicomDir contains any Patient
74    e1->InitTraversal();
75    pa = e1->GetNextEntry();
76    if ( pa  == 0)
77    {
78       std::cout<<"          DicomDir '"<<fileName
79                <<" has no patient"<<std::endl
80                <<"          ...Failed"<<std::endl;
81
82       delete e1;
83       return 1;
84    }
85
86 // Structure use Examples 
87
88    switch (detailLevel)
89   { 
90   case 1:
91      std::cout << std::endl << std::endl  
92        << " =  PATIENT List ==========================================" 
93        << std::endl<< std::endl;
94
95       e1->InitTraversal();
96       pa = e1->GetNextEntry();
97       while (pa) 
98       {
99          std::cout << pa->GetEntry(0x0010, 0x0010) << std::endl; // Patient's Name   
100          pa = e1->GetNextEntry();    
101       }
102       break;
103
104    case 2:    
105       std::cout << std::endl << std::endl  
106         << " = PATIENT/STUDY List =======================================" 
107         << std::endl<< std::endl;
108
109       e1->InitTraversal();
110       pa = e1->GetNextEntry();
111       while ( pa ) // on degouline la liste de PATIENT
112       {  
113          std::cout << pa->GetEntry(0x0010, 0x0010) << std::endl; // Patient's Name 
114          pa->InitTraversal();
115          st = pa->GetNextEntry();
116          while ( st ) { // on degouline les STUDY de ce patient
117             std::cout << "--- "<< st->GetEntry(0x0008, 0x1030) << std::endl; // Study Description
118             st = pa->GetNextEntry();
119          }
120          pa = e1->GetNextEntry();    
121       }   
122       break;
123
124    case 3: 
125       std::cout << std::endl << std::endl  
126         << " =  PATIENT/STUDY/SERIE List ==================================" 
127         << std::endl<< std::endl;
128
129       e1->InitTraversal();
130       pa = e1->GetNextEntry(); 
131       while ( pa )   // on degouline la liste de PATIENT
132       {
133        // Patient's Name, Patient ID 
134          std::cout << "Pat.Name:[" << pa->GetEntry(0x0010, 0x0010) <<"]"; // Patient's Name
135          std::cout << " Pat.ID:[";
136          std::cout << pa->GetEntry(0x0010, 0x0020) << "]" << std::endl; // Patient ID
137          pa->InitTraversal();
138          st = pa->GetNextEntry();
139          while ( st ) { // on degouline les STUDY de ce patient
140             std::cout << "--- Stud.descr:["    << st->GetEntry(0x0008, 0x1030) << "]";// Study Description 
141             std::cout << " Stud.ID:["          << st->GetEntry(0x0020, 0x0010);       // Study ID
142             std::cout << "]" << std::endl;
143             st->InitTraversal();
144             se = st->GetNextEntry();
145             while ( se ) { // on degouline les SERIES de cette study
146                std::cout << "--- --- Ser.Descr:["<< se->GetEntry(0x0008, 0x103e)<< "]";  // Series Description
147                std::cout << " Ser.nb:["         <<  se->GetEntry(0x0020, 0x0011);        // Series number
148                std::cout << "] Mod.:["          <<  se->GetEntry(0x0008, 0x0060) << "]"; // Modality
149                std::cout << std::endl;    
150                se = st->GetNextEntry();   
151             }
152             st = pa->GetNextEntry();
153          }
154          pa = e1->GetNextEntry();    
155       } 
156       break;
157
158    case 4:  
159       std::cout << std::endl << std::endl  
160            << " = PATIENT/STUDY/SERIE/IMAGE List ============================" 
161            << std::endl<< std::endl;
162  
163       e1->InitTraversal();
164       pa = e1->GetNextEntry(); 
165       while ( pa ) {  // on degouline la liste de PATIENT
166          std::cout << pa->GetEntry(0x0010, 0x0010) << std::endl; // Patient's Name
167          pa->InitTraversal();
168          st = pa->GetNextEntry();
169          while ( st ) { // on degouline les STUDY de ce patient
170             std::cout << "--- "<< st->GetEntry(0x0008, 0x1030) << std::endl;    // Study Description
171             std::cout << " Stud.ID:["          << st->GetEntry(0x0020, 0x0010); // Study ID
172             st->InitTraversal();
173             se = st->GetNextEntry();
174             while ( se ) { // on degouline les SERIES de cette study
175                std::cout << "--- --- "<< se->GetEntry(0x0008, 0x103e) << std::endl;      // Serie Description
176                std::cout << " Ser.nb:["         <<  se->GetEntry(0x0020, 0x0011);        // Series number
177                std::cout << "] Mod.:["          <<  se->GetEntry(0x0008, 0x0060) << "]"; // Modality
178                se->InitTraversal();
179                im = se->GetNextEntry();
180                while ( im ) { // on degouline les Images de cette serie
181                   std::cout << "--- --- --- "<< im->GetEntry(0x0004, 0x1500) << std::endl; // File name
182                   im = se->GetNextEntry();   
183                }
184                se = st->GetNextEntry();   
185            }
186             st = pa->GetNextEntry();
187         }     
188         pa = e1->GetNextEntry();    
189       }
190       break;
191
192    case 5:
193       std::cout << std::endl << std::endl  
194            << " = DICOMDIR full content ==========================================" 
195            << std::endl<< std::endl;
196       e1->Print();
197       break;
198
199    }  // end switch
200
201
202  /*
203    // Previous code.
204    // Kept as an example. Please don't remove
205  
206    gdcm::ListDicomDirPatient::const_iterator  itPatient;
207    gdcm::ListDicomDirStudy::const_iterator    itStudy;
208    gdcm::ListDicomDirSerie::const_iterator    itSerie;
209    gdcm::ListDicomDirImage::const_iterator    itImage;
210    cout << std::endl << std::endl
211         << " = Liste des PATIENT/STUDY/SERIE/IMAGE ===================================" 
212         << std::endl<< std::endl;
213  
214    itPatient = e1->GetDicomDirPatients().begin();
215    while ( itPatient != e1->GetDicomDirPatients().end() ) {  // on degouline la liste de PATIENT
216       std::cout << (*itPatient)->GetEntry(0x0010, 0x0010) << std::endl; // Patient's Name
217       itStudy = ((*itPatient)->GetDicomDirStudies()).begin();
218       while (itStudy != (*itPatient)->GetDicomDirStudies().end() ) { // on degouline les STUDY de ce patient
219          std::cout << "--- "<< (*itStudy)->GetEntry(0x0008, 0x1030) << std::endl; // Study Description
220          itSerie = ((*itStudy)->GetDicomDirSeries()).begin();
221          while (itSerie != (*itStudy)->GetDicomDirSeries().end() ) { // on degouline les SERIES de cette study
222             std::cout << "--- --- "<< (*itSerie)->GetEntry(0x0008, 0x103e) << std::endl; // Serie Description
223             itImage = ((*itSerie)->GetDicomDirImages()).begin();
224             while (itImage != (*itSerie)->GetDicomDirImages().end() ) { // on degouline les IMAGES de cette serie
225                std::cout << "--- --- --- "<< (*itImage)->GetEntry(0x0004, 0x1500) << std::endl; // File name
226                ++itImage;   
227             }
228             ++itSerie;   
229          }
230          ++itStudy;
231       }  
232       itPatient ++;    
233    }   
234  */  
235
236
237    if(e1->IsReadable())
238       std::cout <<std::endl<<fileName<<" is Readable"<<std::endl;
239    else
240       std::cout <<std::endl<<fileName<<" is NOT Readable"<<std::endl;
241    std::cout<<std::flush;
242    delete e1;
243
244    return(0);
245 }