]> Creatis software - gdcm.git/blob - src/gdcmDicomDir.h
* Add Command and CommandManager to have possible callback
[gdcm.git] / src / gdcmDicomDir.h
1 /*=========================================================================
2   
3   Program:   gdcm
4   Module:    $RCSfile: gdcmDicomDir.h,v $
5   Language:  C++
6   Date:      $Date: 2005/11/28 15:20:32 $
7   Version:   $Revision: 1.71 $
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
19 #ifndef GDCMDICOMDIR_H
20 #define GDCMDICOMDIR_H
21
22 #include "gdcmDocument.h"
23 #include "gdcmDebug.h"
24
25 #include <list>
26 #include <vector>
27
28 namespace gdcm 
29 {
30 //-----------------------------------------------------------------------------
31 class DicomDirPatient;
32 class DicomDirMeta;
33 class DicomDirElement;
34 class DicomDirStudy;
35 class DicomDirSerie;
36 class DicomDirVisit;
37 class DicomDirImage;
38 class SQItem;
39
40 typedef std::list<DicomDirPatient *> ListDicomDirPatient;
41 typedef std::vector<Document *> VectDocument;
42
43 //-----------------------------------------------------------------------------
44 /**
45  * \brief   DicomDir defines an object representing a DICOMDIR in memory
46  *  as a tree-like structure DicomDirPatient 
47  *                            -> DicomDirStudy 
48  *                                -> DicomDirSerie
49  *                                    -> DicomDirImage
50  */
51 class GDCM_EXPORT DicomDir: public Document
52 {
53    gdcmTypeMacro(DicomDir);
54
55 public:
56 /// \brief Constructs a DicomDir with a RefCounter
57    static DicomDir *New() {return new DicomDir();}
58
59    bool Load( );
60    void Print(std::ostream &os = std::cout, std::string const &indent = "" );
61    
62    /// Sets the root Directory name to parse, recursively
63    void SetDirectoryName(std::string const &dirName) 
64         { ParseDir = true; if (Filename != dirName)
65                                Filename = dirName, IsDocumentModified = true; }
66    /// Accessor to \ref Filename
67    virtual void SetFileName(std::string const &fileName) 
68                    { ParseDir = false; if (Filename != fileName)
69                               Filename = fileName, IsDocumentModified = true;}
70    
71    // Informations contained in the parser
72    virtual bool IsReadable();
73
74    // Meta
75    DicomDirMeta *NewMeta();
76    /// Returns a pointer to the DicomDirMeta for this DICOMDIR. 
77    DicomDirMeta *GetMeta() { return MetaElems; }
78
79    // Patients
80    DicomDirPatient *NewPatient();
81    void ClearPatient();
82
83    DicomDirPatient *GetFirstPatient();
84    DicomDirPatient *GetNextPatient();
85
86    // Parsing
87    void ParseDirectory();
88
89    /// GetProgress GetProgress
90    float GetProgress() const { return Progress; }
91    /// AbortProgress AbortProgress
92    void  AbortProgress() { Abort = true; }
93    /// IsAborted IsAborted
94    bool  IsAborted() { return Abort; }
95
96    // Write
97    bool Write(std::string const &fileName);
98
99    bool Anonymize();
100
101    /// Types of the DicomDirObject within the DicomDir
102    typedef enum
103    {
104       GDCM_DICOMDIR_NONE,
105       GDCM_DICOMDIR_META,
106       GDCM_DICOMDIR_PATIENT,
107       GDCM_DICOMDIR_STUDY,
108       GDCM_DICOMDIR_SERIE,
109       GDCM_DICOMDIR_VISIT,
110       GDCM_DICOMDIR_IMAGE
111    } DicomDirType;
112    
113 protected:
114    DicomDir(); 
115    ~DicomDir();
116
117    void CreateDicomDirChainedList(std::string const &path);
118    void CallStartMethod();
119    void CallProgressMethod();
120    void CallEndMethod();
121
122 private:
123    void Initialize();
124    void CreateDicomDir();
125    bool DoTheLoadingJob();
126    bool AddPatientToEnd(DicomDirPatient *dd);
127    bool AddStudyToEnd  (DicomDirStudy *dd);
128    bool AddSerieToEnd  (DicomDirSerie *dd);
129    bool AddVisitToEnd  (DicomDirVisit *dd);
130    bool AddImageToEnd  (DicomDirImage *dd);
131
132    void SetElements(std::string const &path, VectDocument const &list);
133    void SetElement (std::string const &path, DicomDirType type,
134                     Document *header);
135    void MoveSQItem(DocEntrySet *dst, DocEntrySet *src);
136
137    static bool HeaderLessThan(Document *header1, Document *header2);
138    
139 // Variables
140
141    /// Pointer on *the* DicomDirObject 'DicomDirMeta Elements'
142    DicomDirMeta *MetaElems;
143
144    /// Chained list of DicomDirPatient (to be exploited hierarchicaly) 
145    ListDicomDirPatient Patients;
146    ListDicomDirPatient::iterator ItPatient;
147
148    /// value of the ??? for any progress bar
149    float Progress;
150    /// value of the ??? for any progress bar   
151    bool ParseDir;
152
153    mutable bool Abort;
154 };
155 } // end namespace gdcm
156 //-----------------------------------------------------------------------------
157 #endif