]> Creatis software - gdcm.git/blob - vtk/Bmp2Dcm.cxx
Pàrt Mathieu's fix for vtk 4.2
[gdcm.git] / vtk / Bmp2Dcm.cxx
1 /*=========================================================================\r
2                                                                                 \r
3   Program:   gdcm\r
4   Module:    $RCSfile: Bmp2Dcm.cxx,v $\r
5   Language:  C++\r
6   Date:      $Date: 2007/10/30 16:42:58 $\r
7   Version:   $Revision: 1.3 $\r
8                                                                                 \r
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de\r
10   l'Image). All rights reserved. See Doc/License.txt or\r
11   http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.\r
12                                                                                 \r
13      This software is distributed WITHOUT ANY WARRANTY; without even\r
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
15      PURPOSE.  See the above copyright notices for more information.\r
16                                                                                 \r
17 =========================================================================*/\r
18 \r
19 #include "gdcmArgMgr.h"\r
20 #include "gdcmDirList.h"\r
21 #include "gdcmDebug.h"\r
22 #include "gdcmUtil.h"\r
23 \r
24 #include <vtkImageData.h>\r
25 \r
26 #include <vtkBMPReader.h>\r
27 #include <vtkBMPWriter.h>\r
28 #include "vtkGdcmWriter.h"\r
29 \r
30 #include <vtkImageExtractComponents.h>\r
31 #include <vtkPointData.h>\r
32 #include <vtkDataArray.h>\r
33 \r
34 #include <stdio.h>\r
35 #include <string.h>\r
36 #include <stdlib.h>\r
37 #include <math.h>\r
38 \r
39 //---------------------------------------------------------------------------\r
40 \r
41 int main( int argc, char *argv[] )\r
42 {\r
43    START_USAGE(usage)\r
44    "\n Bmp2Dcm :\n                                                            ",  \r
45    "usage: Bmp2Dcm {filein=inputFileName|dirin=inputDirectoryName}            ",\r
46    "              [studyUID = ] [patName = ] [debug]                          ", \r
47    "                                                                          ",\r
48    " inputFileName : Name of the (single) file user wants to transform        ",\r
49    " inputDirectoryName : user wants to transform *all* the files             ",\r
50    " studyUID   : *aware* user wants to add the serie                         ",\r
51    "                                             to an already existing study ", \r
52    " verbose    : user wants to run the program in 'verbose mode'             ",       \r
53    " debug      : *developper* wants to run the program in 'debug mode'       ",\r
54    \r
55    FINISH_USAGE\r
56 \r
57    // ----- Initialize Arguments Manager ------\r
58   \r
59    GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);\r
60   \r
61    if (am->ArgMgrDefined("usage") || argc == 1) \r
62    {\r
63       am->ArgMgrUsage(usage); // Display 'usage'\r
64       delete am;\r
65       return 0;\r
66    }\r
67 \r
68    if (am->ArgMgrDefined("debug"))\r
69       GDCM_NAME_SPACE::Debug::DebugOn();\r
70 \r
71    bool verbose = ( 0 != am->ArgMgrDefined("verbose") );\r
72 \r
73    const char *fileName = am->ArgMgrGetString("filein");\r
74    const char *dirName  = am->ArgMgrGetString("dirin");\r
75 \r
76    if ( (fileName == 0 && dirName == 0)\r
77         ||\r
78         (fileName != 0 && dirName != 0) )\r
79    {\r
80        std::cout <<std::endl\r
81                  << "Either 'filein=' or 'dirin=' must be present;"\r
82                  << std::endl << "Not both" << std::endl;\r
83        am->ArgMgrUsage(usage); // Display 'usage'\r
84        delete am;\r
85        return 0;\r
86  }\r
87 \r
88    std::string patName  = am->ArgMgrGetString("patname", dirName);\r
89    bool userDefinedStudy = ( 0 != am->ArgMgrDefined("studyUID") );\r
90    const char *studyUID;\r
91    if (userDefinedStudy)\r
92       studyUID  = am->ArgMgrGetString("studyUID");\r
93 \r
94    // not described *on purpose* in the Usage !\r
95    bool userDefinedSerie = ( 0 != am->ArgMgrDefined("serieUID") );\r
96    const char *serieUID;\r
97    if(userDefinedSerie)\r
98       serieUID = am->ArgMgrGetString("serieUID");\r
99 \r
100     /* if unused Param we give up */\r
101    if ( am->ArgMgrPrintUnusedLabels() )\r
102    {\r
103       am->ArgMgrUsage(usage);\r
104       delete am;\r
105       return 0;\r
106    }\r
107 \r
108    delete am;  // ------ we don't need Arguments Manager any longer ------\r
109 \r
110 \r
111    // ----- Begin Processing -----\r
112 \r
113    int *dim;\r
114    std::string nomFich;\r
115 \r
116    if ( fileName != 0 ) // ====== Deal with a single file ======\r
117    {\r
118      vtkBMPReader* Reader = vtkBMPReader::New();\r
119      if ( Reader->CanReadFile(fileName ) == 0) {\r
120          // skip 'non BMP' files\r
121         Reader->Delete();\r
122         if (verbose)\r
123             std::cout << "Sorry, [" << fileName << "] is not a BMP file!" << std::endl;\r
124         return 0;\r
125     }\r
126 \r
127     if (verbose)\r
128        std::cout << "deal with [" <<  fileName << "]" << std::endl;\r
129      //Read BMP file\r
130 \r
131      Reader->SetFileName(fileName);\r
132      Reader->Update();\r
133 \r
134      vtkImageExtractComponents* Red = vtkImageExtractComponents::New();\r
135      Red->SetInput(Reader->GetOutput());\r
136      Red->SetComponents(0);\r
137      Red->Update();\r
138 \r
139      vtkGdcmWriter* Writer = vtkGdcmWriter::New();\r
140      Writer->SetInput(Red->GetOutput());\r
141      nomFich = "";\r
142      nomFich = nomFich+fileName+".acr";   \r
143      Writer->Write();\r
144    \r
145      Reader->Delete();\r
146      Red->Delete();\r
147      Writer->Delete();\r
148    \r
149      }\r
150      else  // ====== Deal with a (single Patient) Directory ======\r
151      { \r
152      \r
153         if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirName) )\r
154         {\r
155           std::cout << "KO : [" << dirName << "] is not a Directory." << std::endl;\r
156           return 0;\r
157         }\r
158         else\r
159         {\r
160           if (verbose)\r
161             std::cout << "OK : [" << dirName << "] is a Directory." << std::endl;\r
162         } \r
163         std::string strStudyUID;\r
164         std::string strSerieUID;\r
165 \r
166         if (userDefinedStudy)\r
167            strSerieUID =  studyUID;\r
168         else\r
169            strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();\r
170    \r
171         if (userDefinedStudy)\r
172           strSerieUID =  serieUID;\r
173         else\r
174            strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();    \r
175 \r
176        if(verbose)\r
177            std::cout << "dirName [" << dirName << "]" << std::endl;\r
178        \r
179         GDCM_NAME_SPACE::DirList dirList(dirName,1); // gets recursively the file list\r
180         GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();\r
181 \r
182         for( GDCM_NAME_SPACE::DirListType::iterator it  = fileList.begin();\r
183                                    it != fileList.end();\r
184                                    ++it )\r
185         {\r
186            if ( GDCM_NAME_SPACE::Util::GetName((*it)).c_str()[0] == '.' ) \r
187            {\r
188               // skip hidden files\r
189               continue;\r
190            }\r
191       \r
192            vtkBMPReader* Reader = vtkBMPReader::New();\r
193   \r
194            if ( Reader->CanReadFile(it->c_str() ) == 0) {\r
195               // skip 'non BMP' files  \r
196                Reader->Delete();\r
197                continue;\r
198             }\r
199    \r
200            if (verbose)\r
201              std::cout << "deal with [" <<  it->c_str() << "]" << std::endl;  \r
202    \r
203            Reader->SetFileName(it->c_str());    \r
204            Reader->Update();\r
205    \r
206            dim=Reader->GetOutput()->GetDimensions();\r
207            vtkImageExtractComponents* Red = vtkImageExtractComponents::New();\r
208            Red->SetInput(Reader->GetOutput());\r
209            Red->SetComponents(0);\r
210            Red->Update();\r
211 \r
212            // At least, created files will look like a Serie from a single Study ...  \r
213            GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New();\r
214            f->InsertEntryString(strStudyUID, 0x0020, 0x000d, "UI");      \r
215            f->InsertEntryString(strSerieUID, 0x0020, 0x000e, "UI");\r
216            f->InsertEntryString(patName,     0x0010, 0x0010, "PN");   // Patient's Name \r
217 \r
218            vtkGdcmWriter* Writer = vtkGdcmWriter::New();\r
219            Writer->SetInput(Red->GetOutput());\r
220            nomFich = "";\r
221            nomFich = nomFich+it->c_str()+".acr";\r
222            Writer->SetFileName(nomFich.c_str());\r
223            Writer->SetGdcmFile(f);\r
224            Writer->Write();\r
225    \r
226            f->Delete(); \r
227         \r
228       }\r
229    }   \r
230    return 0;   \r
231 }\r