00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #include "gdcmArgMgr.h"
00020 #include "gdcmDirList.h"
00021 #include "gdcmDebug.h"
00022 #include "gdcmUtil.h"
00023 
00024 #include <vtkImageData.h>
00025 
00026 #include <vtkBMPReader.h>
00027 #include <vtkBMPWriter.h>
00028 #include "vtkGdcmWriter.h"
00029 
00030 #include <vtkImageExtractComponents.h>
00031 #include <vtkPointData.h>
00032 #include <vtkDataArray.h>
00033 
00034 #include <stdio.h>
00035 #include <string.h>
00036 #include <stdlib.h>
00037 #include <math.h>
00038 
00039 
00040 
00041 int main( int argc, char *argv[] )
00042 {
00043    START_USAGE(usage)
00044    "\n Bmp2Dcm :\n                                                            ",  
00045    "usage: Bmp2Dcm {filein=inputFileName|dirin=inputDirectoryName}            ",
00046    "              [studyUID = ] [patName = ] [debug]                          ", 
00047    "                                                                          ",
00048    " inputFileName : Name of the (single) file user wants to transform        ",
00049    " inputDirectoryName : user wants to transform *all* the files             ",
00050    " studyUID   : *aware* user wants to add the serie                         ",
00051    "                                             to an already existing study ", 
00052    " verbose    : user wants to run the program in 'verbose mode'             ",       
00053    " debug      : *developper* wants to run the program in 'debug mode'       ",
00054    
00055    FINISH_USAGE
00056 
00057    
00058   
00059    GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
00060   
00061    if (am->ArgMgrDefined("usage") || argc == 1) 
00062    {
00063       am->ArgMgrUsage(usage); 
00064       delete am;
00065       return 0;
00066    }
00067 
00068    if (am->ArgMgrDefined("debug"))
00069       GDCM_NAME_SPACE::Debug::DebugOn();
00070       
00071    int verbose  = am->ArgMgrDefined("verbose");
00072          
00073    const char *fileName = am->ArgMgrGetString("filein");
00074    const char *dirName  = am->ArgMgrGetString("dirin");
00075 
00076    if ( (fileName == 0 && dirName == 0)
00077         ||
00078         (fileName != 0 && dirName != 0) )
00079    {
00080        std::cout <<std::endl
00081                  << "Either 'filein=' or 'dirin=' must be present;" 
00082                  << std::endl << "Not both" << std::endl;
00083        am->ArgMgrUsage(usage); 
00084        delete am;
00085        return 0;
00086  }
00087  
00088    std::string patName  = am->ArgMgrGetString("patname", dirName);
00089     
00090    bool userDefinedStudy = am->ArgMgrDefined("studyUID");
00091    const char *studyUID;
00092    if (userDefinedStudy)
00093       studyUID  = am->ArgMgrGetString("studyUID");  
00094 
00095    
00096    bool userDefinedSerie = am->ArgMgrDefined("serieUID");   
00097    const char *serieUID;
00098    if(userDefinedSerie)
00099       serieUID = am->ArgMgrGetString("serieUID");
00100        
00101     
00102    if ( am->ArgMgrPrintUnusedLabels() )
00103    {
00104       am->ArgMgrUsage(usage);
00105       delete am;
00106       return 0;
00107    } 
00108  
00109    delete am;  
00110 
00111 
00112    
00113    
00114    int *dim;
00115    std::string nomFich;
00116    
00117    if ( fileName != 0 ) 
00118    { 
00119      vtkBMPReader* Reader = vtkBMPReader::New();
00120      if ( Reader->CanReadFile(fileName ) == 0) {
00121          
00122         Reader->Delete();
00123         if (verbose)
00124             std::cout << "Sorry, [" << fileName << "] is not a BMP file!" << std::endl;
00125         return 0;
00126     }
00127     
00128     if (verbose)
00129        std::cout << "deal with [" <<  fileName << "]" << std::endl;
00130      
00131 
00132      Reader->SetFileName(fileName);
00133      Reader->Update();
00134 
00135      vtkImageExtractComponents* Red = vtkImageExtractComponents::New();
00136      Red->SetInput(Reader->GetOutput());
00137      Red->SetComponents(0);
00138      Red->Update();
00139 
00140      vtkGdcmWriter* Writer = vtkGdcmWriter::New();
00141      Writer->SetInput(Red->GetOutput());
00142      nomFich = "";
00143      nomFich = nomFich+fileName+".acr";   
00144      Writer->Write();
00145    
00146      Reader->Delete();
00147      Red->Delete();
00148      Writer->Delete();
00149    
00150      }
00151      else  
00152      { 
00153      
00154         if ( ! GDCM_NAME_SPACE::DirList::IsDirectory(dirName) )
00155         {
00156           std::cout << "KO : [" << dirName << "] is not a Directory." << std::endl;
00157           return 0;
00158         }
00159         else
00160         {
00161           if (verbose)
00162             std::cout << "OK : [" << dirName << "] is a Directory." << std::endl;
00163         } 
00164         std::string strStudyUID;
00165         std::string strSerieUID;
00166 
00167         if (userDefinedStudy)
00168            strSerieUID =  studyUID;
00169         else
00170            strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();
00171    
00172         if (userDefinedStudy)
00173           strSerieUID =  serieUID;
00174         else
00175            strStudyUID =  GDCM_NAME_SPACE::Util::CreateUniqueUID();    
00176 
00177        if(verbose)
00178            std::cout << "dirName [" << dirName << "]" << std::endl;
00179        
00180         GDCM_NAME_SPACE::DirList dirList(dirName,1); 
00181         GDCM_NAME_SPACE::DirListType fileList = dirList.GetFilenames();
00182 
00183         for( GDCM_NAME_SPACE::DirListType::iterator it  = fileList.begin();
00184                                    it != fileList.end();
00185                                    ++it )
00186         {
00187            if ( GDCM_NAME_SPACE::Util::GetName((*it)).c_str()[0] == '.' ) 
00188            {
00189               
00190               continue;
00191            }
00192       
00193            vtkBMPReader* Reader = vtkBMPReader::New();
00194   
00195            if ( Reader->CanReadFile(it->c_str() ) == 0) {
00196               
00197                Reader->Delete();
00198                continue;
00199             }
00200    
00201            if (verbose)
00202              std::cout << "deal with [" <<  it->c_str() << "]" << std::endl;  
00203    
00204            Reader->SetFileName(it->c_str());    
00205            Reader->Update();
00206    
00207            dim=Reader->GetOutput()->GetDimensions();
00208            vtkImageExtractComponents* Red = vtkImageExtractComponents::New();
00209            Red->SetInput(Reader->GetOutput());
00210            Red->SetComponents(0);
00211            Red->Update();
00212 
00213            
00214            GDCM_NAME_SPACE::File *f = GDCM_NAME_SPACE::File::New();
00215            f->InsertEntryString(strStudyUID, 0x0020, 0x000d, "UI");      
00216            f->InsertEntryString(strSerieUID, 0x0020, 0x000e, "UI");
00217            f->InsertEntryString(patName,     0x0010, 0x0010, "PN");   
00218 
00219            vtkGdcmWriter* Writer = vtkGdcmWriter::New();
00220            Writer->SetInput(Red->GetOutput());
00221            nomFich = "";
00222            nomFich = nomFich+it->c_str()+".acr";
00223            Writer->SetFileName(nomFich.c_str());
00224            Writer->SetGdcmFile(f);
00225            Writer->Write();
00226    
00227            f->Delete(); 
00228         
00229       }
00230    }   
00231    return 0;   
00232 }