]> Creatis software - gdcm.git/blob - src/gdcmDicomDir.h
New features for DicomDir
[gdcm.git] / src / gdcmDicomDir.h
1 /*=========================================================================
2   
3   Program:   gdcm
4   Module:    $RCSfile: gdcmDicomDir.h,v $
5   Language:  C++
6   Date:      $Date: 2005/07/08 10:13:38 $
7   Version:   $Revision: 1.62 $
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
24 #include <list>
25 #include <vector>
26
27 namespace gdcm 
28 {
29 //-----------------------------------------------------------------------------
30 class DicomDirPatient;
31 class DicomDirMeta;
32 class DicomDirElement;
33 class DicomDirStudy;
34 class DicomDirSerie;
35 class DicomDirImage;
36 class SQItem;
37
38 typedef std::list<DicomDirPatient *>   ListDicomDirPatient;
39 typedef std::vector<Document *>  VectDocument;
40
41 //-----------------------------------------------------------------------------
42 /**
43  * \brief   DicomDir defines an object representing a DICOMDIR in memory
44  *  as a tree-like structure DicomDirPatient 
45  *                            -> DicomDirStudy 
46  *                                -> DicomDirSerie
47  *                                    -> DicomDirImage
48  */
49 class GDCM_EXPORT DicomDir: public Document
50 {
51 public:
52    typedef void Method(void*);
53
54    DicomDir( std::string const &filename, bool parseDir = false );
55    DicomDir(); 
56                    
57    ~DicomDir();
58
59    bool Load( std::string const &filename );
60    bool Load( );
61    void Print(std::ostream &os = std::cout, std::string const &indent = "" );
62    
63    /// Sets the root Directory name to parse, recursively
64    void SetDirectoryName(std::string const &dirName) 
65         { ParseDir = true; if (Filename != dirName)
66                                Filename = dirName, IsDocumentModified = true; };
67    /// Accessor to \ref Filename
68    virtual void SetFileName(std::string const &fileName) 
69                    { ParseDir = false; if (Filename != fileName)
70                                Filename = fileName, IsDocumentModified = true; }
71
72    /// DEPRECATED : use SetDirectoryName
73    void SetParseDir(bool parseDir)  { ParseDir = parseDir; };
74    
75    // Informations contained in the parser
76    virtual bool IsReadable();
77
78    // Meta
79    DicomDirMeta *NewMeta();
80    /// Returns a pointer to the DicomDirMeta for this DICOMDIR. 
81    DicomDirMeta *GetMeta() { return MetaElems; };
82
83    // Patients
84    DicomDirPatient *NewPatient();
85    void ClearPatient();
86
87    DicomDirPatient *GetFirstPatient();
88    DicomDirPatient *GetNextPatient();
89
90    // Parsing
91    void ParseDirectory();
92
93    // Note: the DicomDir:: namespace prefix is needed by Swig in the 
94    //       following method declarations. Refer to gdcmPython/gdcm.i
95    //       for the reasons of this unnecessary notation at C++ level.
96    void SetStartMethod(    DicomDir::Method *method,
97                            void *arg = NULL,
98                            DicomDir::Method *argDelete = NULL );
99    void SetProgressMethod( DicomDir::Method *method, 
100                            void *arg = NULL,
101                            DicomDir::Method *argDelete = NULL );
102    void SetEndMethod(      DicomDir::Method *method,
103                            void *arg = NULL, 
104                            DicomDir::Method *argDelete = NULL );
105    void SetStartMethodArgDelete   ( DicomDir::Method *m );
106    void SetProgressMethodArgDelete( DicomDir::Method *m );
107    void SetEndMethodArgDelete     ( DicomDir::Method *m );
108
109    /// GetProgress GetProgress
110    float GetProgress()  { return Progress; };
111    /// AbortProgress AbortProgress
112    void  AbortProgress() { Abort = true; };
113    /// IsAborted IsAborted
114    bool  IsAborted() { return Abort; };
115
116    // Write
117    bool WriteDicomDir(std::string const &fileName);
118
119    bool AnonymizeDicomDir();
120
121    /// Types of the DicomDirObject within the DicomDir
122    typedef enum
123    {
124       GDCM_DICOMDIR_NONE,
125       GDCM_DICOMDIR_META,
126       GDCM_DICOMDIR_PATIENT,
127       GDCM_DICOMDIR_STUDY,
128       GDCM_DICOMDIR_SERIE,
129       GDCM_DICOMDIR_IMAGE
130    } DicomDirType;
131    
132 protected:
133    void CreateDicomDirChainedList(std::string const &path);
134    void CallStartMethod();
135    void CallProgressMethod();
136    void CallEndMethod();
137
138 private:
139    void Initialize();
140    void CreateDicomDir();
141    bool DoTheLoadingJob();
142    bool AddPatientToEnd(DicomDirPatient *dd);
143    bool AddStudyToEnd  (DicomDirStudy *dd);
144    bool AddSerieToEnd  (DicomDirSerie *dd);
145    bool AddImageToEnd  (DicomDirImage *dd);
146
147    void SetElements(std::string const &path, VectDocument const &list);
148    void SetElement (std::string const &path, DicomDirType type,
149                     Document *header);
150    void MoveSQItem(DocEntrySet *dst, DocEntrySet *src);
151
152    static bool HeaderLessThan(Document *header1, Document *header2);
153    
154 // Variables
155
156    /// Pointer on *the* DicomDirObject 'DicomDirMeta Elements'
157    DicomDirMeta *MetaElems;
158
159    /// Chained list of DicomDirPatient (to be exploited hierarchicaly) 
160    ListDicomDirPatient Patients;
161    ListDicomDirPatient::iterator ItPatient;
162
163    /// pointer to the initialisation method for any progress bar   
164    Method *StartMethod;
165    /// pointer to the incrementation method for any progress bar
166    Method *ProgressMethod;
167    /// pointer to the termination method for any progress bar
168    Method *EndMethod;
169    /// pointer to the ??? method for any progress bar   
170    Method *StartMethodArgDelete;
171    /// pointer to the ??? method for any progress bar
172    Method* ProgressMethodArgDelete;
173    /// pointer to the ??? method for any progress bar
174    Method *EndMethodArgDelete;
175    /// pointer to the ??? for any progress bar   
176    void *StartArg;
177    /// pointer to the ??? for any progress bar
178    void *ProgressArg;
179    /// pointer to the ??? for any progress bar   
180    void *EndArg;
181    /// value of the ??? for any progress bar
182    float Progress;
183    /// value of the ??? for any progress bar   
184    bool Abort;
185    bool ParseDir;
186 };
187 } // end namespace gdcm
188 //-----------------------------------------------------------------------------
189 #endif