From: regrain Date: Tue, 30 Aug 2005 14:40:28 +0000 (+0000) Subject: * Rename the NO_SEQ, NO_SHADOW, NO_SHADOWSEQ to X-Git-Tag: Version1.2.bp~168 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=c4fa2e74a4ce56a0a8db54e4a70d404bec9fc8dd;p=gdcm.git * Rename the NO_SEQ, NO_SHADOW, NO_SHADOWSEQ to GDCM_LD_NOSEQ, GDCM_LD_NOSHADOW, GDCM_LD_NOSHADOWSEQ * Now vtkgdcmReader parses only one time each files -- BeNours --- diff --git a/Example/Anonymize.cxx b/Example/Anonymize.cxx index 69a7d8a1..2d99336a 100644 --- a/Example/Anonymize.cxx +++ b/Example/Anonymize.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: Anonymize.cxx,v $ Language: C++ - Date: $Date: 2005/07/21 04:55:50 $ - Version: $Revision: 1.3 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -77,7 +77,7 @@ int main(int argc, char *argv[]) gdcm::File *f; f = new gdcm::File( ); - f->SetLoadMode( 0x00000000 ); + f->SetLoadMode( GDCM_LD_ALL ); f->SetFileName( fileName ); int res = f->Load(); diff --git a/Example/AnonymizeNoLoad.cxx b/Example/AnonymizeNoLoad.cxx index 6ffea195..cf6f22ee 100644 --- a/Example/AnonymizeNoLoad.cxx +++ b/Example/AnonymizeNoLoad.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: AnonymizeNoLoad.cxx,v $ Language: C++ - Date: $Date: 2005/08/28 17:26:31 $ - Version: $Revision: 1.10 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.11 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -75,15 +75,15 @@ int main(int argc, char *argv[]) return 0; } - int loadMode = 0x00000000; + int loadMode = GDCM_LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= NO_SHADOWSEQ; + loadMode |= GDCM_LD_NOSHADOWSEQ; else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= NO_SHADOW; + loadMode |= GDCM_LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= NO_SEQ; + loadMode |= GDCM_LD_NOSEQ; } int rubOutNb; diff --git a/Example/MakeDicomDir.cxx b/Example/MakeDicomDir.cxx index b3465316..3da658b7 100644 --- a/Example/MakeDicomDir.cxx +++ b/Example/MakeDicomDir.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: MakeDicomDir.cxx,v $ Language: C++ - Date: $Date: 2005/08/29 12:29:47 $ - Version: $Revision: 1.12 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.13 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -73,15 +73,15 @@ int main(int argc, char *argv[]) char *dirName; dirName = am->ArgMgrGetString("dirName",(char *)"."); - int loadMode = 0x00000000; + int loadMode = GDCM_LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= NO_SHADOWSEQ; + loadMode |= GDCM_LD_NOSHADOWSEQ; else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= NO_SHADOW; + loadMode |= GDCM_LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= NO_SEQ; + loadMode |= GDCM_LD_NOSEQ; } if (am->ArgMgrDefined("debug")) diff --git a/Example/PatchHeader.cxx b/Example/PatchHeader.cxx index d9d5e339..23dbfd11 100644 --- a/Example/PatchHeader.cxx +++ b/Example/PatchHeader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: PatchHeader.cxx,v $ Language: C++ - Date: $Date: 2005/08/28 17:27:00 $ - Version: $Revision: 1.2 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.3 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -50,16 +50,16 @@ uint16_t bitsstored; uint16_t highbit; uint16_t pixelrepresentation; -bool bsamplesperpixel; -bool bplanarconfiguration; -bool bsize; -bool brows; -bool bcolumns; -bool bplanes; -bool bbitsallocated; -bool bbitsstored; -bool bhighbit; -bool bpixelrepresentation; +int bsamplesperpixel; +int bplanarconfiguration; +int bsize; +int brows; +int bcolumns; +int bplanes; +int bbitsallocated; +int bbitsstored; +int bhighbit; +int bpixelrepresentation; void update() { @@ -207,7 +207,7 @@ int main(int argc, char *argv[]) return 0; } -bsamplesperpixel = am->ArgMgrDefined("samplesperpixel"); + bsamplesperpixel = am->ArgMgrDefined("samplesperpixel"); if ( bsamplesperpixel ) samplesperpixel = am->ArgMgrWantInt("samplesperpixel",usage); @@ -264,15 +264,15 @@ bsamplesperpixel = am->ArgMgrDefined("samplesperpixel"); if (am->ArgMgrDefined("debug")) gdcm::Debug::DebugOn(); - int loadMode = 0x00000000; + int loadMode = GDCM_LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= NO_SHADOWSEQ; + loadMode |= GDCM_LD_NOSHADOWSEQ; else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= NO_SHADOW; + loadMode |= GDCM_LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= NO_SEQ; + loadMode |= GDCM_LD_NOSEQ; } /* if unused Param we give up */ diff --git a/Example/PrintDocument.cxx b/Example/PrintDocument.cxx index fdce422f..e2f9ce6f 100644 --- a/Example/PrintDocument.cxx +++ b/Example/PrintDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: PrintDocument.cxx,v $ Language: C++ - Date: $Date: 2005/07/19 15:19:25 $ - Version: $Revision: 1.17 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.18 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -17,6 +17,7 @@ =========================================================================*/ #include "gdcmFile.h" #include "gdcmDebug.h" +#include "gdcmCommon.h" #include #include //for atoi @@ -54,7 +55,7 @@ int main(int argc, char *argv[]) gdcm::Debug::DebugOn(); if (argc > 4) - e1->SetLoadMode(NO_SEQ | NO_SHADOW); + e1->SetLoadMode(GDCM_LD_NOSEQ | GDCM_LD_NOSHADOW); e1->SetFileName( fileName.c_str() ); e1->Load( ); diff --git a/Example/PrintFile.cxx b/Example/PrintFile.cxx index 1801f17e..3b421623 100644 --- a/Example/PrintFile.cxx +++ b/Example/PrintFile.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: PrintFile.cxx,v $ Language: C++ - Date: $Date: 2005/08/29 12:25:37 $ - Version: $Revision: 1.48 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.49 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -165,15 +165,15 @@ int main(int argc, char *argv[]) if (am->ArgMgrDefined("debug")) gdcm::Debug::DebugOn(); - int loadMode = 0x00000000; + int loadMode = GDCM_LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= NO_SHADOWSEQ; + loadMode |= GDCM_LD_NOSHADOWSEQ; else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= NO_SHADOW; + loadMode |= GDCM_LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= NO_SEQ; + loadMode |= GDCM_LD_NOSEQ; } int level = am->ArgMgrGetInt("level", 2); diff --git a/Example/ReWrite.cxx b/Example/ReWrite.cxx index 37d15073..430f11aa 100644 --- a/Example/ReWrite.cxx +++ b/Example/ReWrite.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: ReWrite.cxx,v $ Language: C++ - Date: $Date: 2005/07/21 04:55:50 $ - Version: $Revision: 1.9 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.10 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -68,15 +68,15 @@ int main(int argc, char *argv[]) char *mode = am->ArgMgrGetString("mode",(char *)"X"); - int loadMode = 0x00000000; + int loadMode = GDCM_LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= NO_SHADOWSEQ; + loadMode |= GDCM_LD_NOSHADOWSEQ; else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= NO_SHADOW; + loadMode |= GDCM_LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= NO_SEQ; + loadMode |= GDCM_LD_NOSEQ; } bool rgb = ( 0 != am->ArgMgrDefined("RGB") ); diff --git a/Example/TestPrintTime.cxx b/Example/TestPrintTime.cxx index 9dbcff5a..68dec9e3 100644 --- a/Example/TestPrintTime.cxx +++ b/Example/TestPrintTime.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestPrintTime.cxx,v $ Language: C++ - Date: $Date: 2005/07/08 12:02:02 $ - Version: $Revision: 1.3 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -59,7 +59,7 @@ int main(int, char *[]) std::cout << "-----------Not Readable " << std::endl; delete e1; e1= new gdcm::File( ); - e1->SetLoadMode( NO_SEQ | NO_SHADOW ); + e1->SetLoadMode( GDCM_LD_NOSEQ | GDCM_LD_NOSHADOW ); r3 = times(&tms3); e1->SetFileName( filename ); e1->Load( ); @@ -120,7 +120,7 @@ int main(int, char *[]) filename += gdcmDataImages[i]; e1= new gdcm::File( ); - e1->SetLoadMode( NO_SEQ | NO_SHADOW ); + e1->SetLoadMode( GDCM_LD_NOSEQ | GDCM_LD_NOSHADOW ); e1->SetFileName( filename ); e1->Load( ); if (!e1->IsReadable()) diff --git a/Example/exColorToRGB.cxx b/Example/exColorToRGB.cxx index 5af2752e..d62cbe97 100644 --- a/Example/exColorToRGB.cxx +++ b/Example/exColorToRGB.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exColorToRGB.cxx,v $ Language: C++ - Date: $Date: 2005/07/19 15:19:25 $ - Version: $Revision: 1.4 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.5 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) std::cout << argv[1] << std::endl; gdcm::File *f = new gdcm::File(); - f->SetLoadMode( 0x00000000); + f->SetLoadMode( GDCM_LD_ALL); f->SetFileName( fileName ); bool res = f->Load(); diff --git a/Example/exGC.cxx b/Example/exGC.cxx index 6cff2a3b..4d5e411f 100644 --- a/Example/exGC.cxx +++ b/Example/exGC.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exGC.cxx,v $ Language: C++ - Date: $Date: 2005/07/19 15:19:25 $ - Version: $Revision: 1.6 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.7 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -76,7 +76,7 @@ int main(int argc, char *argv[]) std::cout << argv[1] << std::endl; gdcm::File *f = new gdcm::File(); - f->SetLoadMode( 0x00000000); + f->SetLoadMode( GDCM_LD_ALL); f->SetFileName( fileName ); bool res = f->Load(); diff --git a/Example/exImageLighten.cxx b/Example/exImageLighten.cxx index 67d5a464..fed6a9d8 100644 --- a/Example/exImageLighten.cxx +++ b/Example/exImageLighten.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exImageLighten.cxx,v $ Language: C++ - Date: $Date: 2005/07/19 15:19:25 $ - Version: $Revision: 1.4 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.5 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -57,7 +57,7 @@ int main(int argc, char *argv[]) std::cout << argv[1] << std::endl; gdcm::File *f = new gdcm::File(); - f->SetLoadMode( 0x00000000); + f->SetLoadMode( GDCM_LD_ALL); f->SetFileName( fileName ); bool res = f->Load(); diff --git a/Example/exOverlaysACR.cxx b/Example/exOverlaysACR.cxx index 257b11aa..01a0492a 100644 --- a/Example/exOverlaysACR.cxx +++ b/Example/exOverlaysACR.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exOverlaysACR.cxx,v $ Language: C++ - Date: $Date: 2005/07/11 14:35:46 $ - Version: $Revision: 1.5 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.6 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -88,7 +88,7 @@ int main(int argc, char *argv[]) f = new gdcm::File( ); - f->SetLoadMode(NO_SEQ | NO_SHADOW); + f->SetLoadMode(GDCM_LD_NOSEQ | GDCM_LD_NOSHADOW); f->SetFileName( fileName ); bool res = f->Load(); diff --git a/Example/exPrintWritePrint.cxx b/Example/exPrintWritePrint.cxx index 26e7ef52..3bb545c3 100644 --- a/Example/exPrintWritePrint.cxx +++ b/Example/exPrintWritePrint.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exPrintWritePrint.cxx,v $ Language: C++ - Date: $Date: 2005/07/08 12:02:02 $ - Version: $Revision: 1.2 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.3 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -59,7 +59,7 @@ int main(int argc, char *argv[]) std::string mode = argv[2]; f = new gdcm::File( ); - f->SetLoadMode( NO_SEQ ); + f->SetLoadMode( GDCM_LD_NOSEQ ); f->SetFileName( fileName ); f->Load( ); diff --git a/Example/exSerieHelper.cxx b/Example/exSerieHelper.cxx index 03a6a80f..41a98abd 100644 --- a/Example/exSerieHelper.cxx +++ b/Example/exSerieHelper.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: exSerieHelper.cxx,v $ Language: C++ - Date: $Date: 2005/08/22 11:21:56 $ - Version: $Revision: 1.2 $ + Date: $Date: 2005/08/30 14:40:28 $ + Version: $Revision: 1.3 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -39,7 +39,7 @@ int main(int argc, char *argv[]) std::cout << "Dir Name :[" << dirName << "]" << std::endl; s = new gdcm::SerieHelper(); - s->SetLoadMode(0x00000000); // Load everything for each File + s->SetLoadMode(GDCM_LD_ALL); // Load everything for each File //s->AddRestriction(tagKey, valueToCheck); // Keep only files where // restriction is true s->SetDirectory(dirName, true); // true : recursive exploration diff --git a/Testing/TestAllPrint.cxx b/Testing/TestAllPrint.cxx index 6755e871..833516ca 100644 --- a/Testing/TestAllPrint.cxx +++ b/Testing/TestAllPrint.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestAllPrint.cxx,v $ Language: C++ - Date: $Date: 2005/07/08 13:39:56 $ - Version: $Revision: 1.2 $ + Date: $Date: 2005/08/30 14:40:30 $ + Version: $Revision: 1.3 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -48,7 +48,7 @@ int TestAllPrint(int, char *[]) std::string filename = gdcmDataImages[i]; gdcm::File file; - file.SetLoadMode( NO_SEQ ); + file.SetLoadMode( GDCM_LD_NOSEQ ); file.SetFileName( filename ); file.Load(); //file.Print( std::cout ); //just for debug diff --git a/Testing/TestAllReadCompareDicom.cxx b/Testing/TestAllReadCompareDicom.cxx index 353c567e..72ee3cc7 100644 --- a/Testing/TestAllReadCompareDicom.cxx +++ b/Testing/TestAllReadCompareDicom.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestAllReadCompareDicom.cxx,v $ Language: C++ - Date: $Date: 2005/07/11 08:50:48 $ - Version: $Revision: 1.45 $ + Date: $Date: 2005/08/30 14:40:30 $ + Version: $Revision: 1.46 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -399,7 +399,7 @@ int InternalTest(std::string const &filename, // new style gdcm::File *f = new gdcm::File(); - f->SetLoadMode ( 0x00000000 ); // Load everything + f->SetLoadMode ( GDCM_LD_ALL ); // Load everything f->SetFileName( filename ); f->Load(); diff --git a/Testing/TestMakeDicomDir.cxx b/Testing/TestMakeDicomDir.cxx index 81c9219c..d42e8741 100644 --- a/Testing/TestMakeDicomDir.cxx +++ b/Testing/TestMakeDicomDir.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestMakeDicomDir.cxx,v $ Language: C++ - Date: $Date: 2005/08/29 12:29:48 $ - Version: $Revision: 1.6 $ + Date: $Date: 2005/08/30 14:40:30 $ + Version: $Revision: 1.7 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -64,9 +64,9 @@ int TestMakeDicomDir(int argc, char *argv[]) // new style (user is allowed no to load Sequences an/or Shadow Groups) dcmdir = new gdcm::DicomDir( ); - // dcmdir->SetLoadMode(NO_SEQ | NO_SHADOW); + // dcmdir->SetLoadMode(GDCM_LD_NOSEQ | GDCM_LD_NOSHADOW); // some images have a wrong length for element 0x0000 of private groups - dcmdir->SetLoadMode(NO_SEQ); + dcmdir->SetLoadMode(GDCM_LD_NOSEQ); dcmdir->SetDirectoryName(dirName); dcmdir->Load( ); diff --git a/Testing/TestSerieHelper.cxx b/Testing/TestSerieHelper.cxx index 76ef8544..291d5c41 100644 --- a/Testing/TestSerieHelper.cxx +++ b/Testing/TestSerieHelper.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestSerieHelper.cxx,v $ Language: C++ - Date: $Date: 2005/07/17 04:25:12 $ - Version: $Revision: 1.6 $ + Date: $Date: 2005/08/30 14:40:30 $ + Version: $Revision: 1.7 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -39,7 +39,7 @@ int TestSerieHelper(int argc, char *argv[]) std::cout << "Dir Name :[" << dirName << "]" << std::endl; s = new gdcm::SerieHelper(); - s->SetLoadMode(0x00000000); // Load everything for each File + s->SetLoadMode(GDCM_LD_ALL); // Load everything for each File //s->AddRestriction(tagKey, valueToCheck); // Keep only files where // restriction is true s->SetDirectory(dirName, true); // true : recursive exploration diff --git a/Testing/TestWriteSimple.cxx b/Testing/TestWriteSimple.cxx index 30355d3c..46f4e85b 100644 --- a/Testing/TestWriteSimple.cxx +++ b/Testing/TestWriteSimple.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: TestWriteSimple.cxx,v $ Language: C++ - Date: $Date: 2005/08/20 09:10:24 $ - Version: $Revision: 1.34 $ + Date: $Date: 2005/08/30 14:40:30 $ + Version: $Revision: 1.35 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -249,8 +249,12 @@ int WriteSimple(Image &img) gdcm::FileHelper *reread = new gdcm::FileHelper( ); reread->SetFileName( fileName.str() ); reread->SetLoadMode(0); // Load everything - // Other possible values are NO_SEQ, NO_SHADOW, - // NO_SEQ|NO_SHADOW, NO_SHADOWSEQ + // Other possible values are + // GDCM_LD_ALL, + // GDCM_LD_NOSEQ, + // GDCM_LD_NOSHADOW, + // GDCM_LD_NOSEQ|GDCM_LD_NOSHADOW, + // GDCM_LD_NOSHADOWSEQ reread->Load(); if( !reread->GetFile()->IsReadable() ) diff --git a/gdcmPython/gdcm.i b/gdcmPython/gdcm.i index bb21af1b..b4d735b5 100644 --- a/gdcmPython/gdcm.i +++ b/gdcmPython/gdcm.i @@ -220,6 +220,11 @@ typedef unsigned long long uint64_t; %constant const char *NOTLOADED = "gdcm::NotLoaded"; %constant const char *UNREAD = "gdcm::UnRead"; +/*%constant unsigned int LD_ALL = 0x00000000; +%constant unsigned int LD_NOSEQ = 0x00000001; +%constant unsigned int LD_NOSHADOW = 0x00000002; +%constant unsigned int LD_NOSHADOWSEQ = 0x00000004;*/ + //////////////////////////////////////////////////////////////////////////// // Warning: Order matters ! %include "gdcmCommon.h" diff --git a/src/gdcmCommon.h b/src/gdcmCommon.h index 3fb05d9f..6b0330cd 100644 --- a/src/gdcmCommon.h +++ b/src/gdcmCommon.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmCommon.h,v $ Language: C++ - Date: $Date: 2005/08/30 08:05:50 $ - Version: $Revision: 1.86 $ + Date: $Date: 2005/08/30 14:40:32 $ + Version: $Revision: 1.87 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -196,6 +196,23 @@ enum CompOperators { GDCM_LESS, GDCM_LESSOREQUAL }; + +// Loading mode +#define GDCM_LD_ALL 0x00000000 +#define GDCM_LD_NOSEQ 0x00000001 +#define GDCM_LD_NOSHADOW 0x00000002 +#define GDCM_LD_NOSHADOWSEQ 0x00000004 + +enum LodModeType +{ + LD_ALL = GDCM_LD_ALL, // Load all + LD_NOSEQ = GDCM_LD_NOSEQ, // Don't load odd groups + LD_NOSHADOW = GDCM_LD_NOSHADOW, // Don't load Sequences + LD_NOSHADOWSEQ = GDCM_LD_NOSHADOWSEQ // Don't load Sequences if they belong + // to an odd group + // (*exclusive* from LD_NOSEQ and LD_NOSHADOW) +}; + /** * \brief structure, for internal use only */ diff --git a/src/gdcmDicomDir.cxx b/src/gdcmDicomDir.cxx index 8be64395..653a4744 100644 --- a/src/gdcmDicomDir.cxx +++ b/src/gdcmDicomDir.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDicomDir.cxx,v $ Language: C++ - Date: $Date: 2005/08/29 12:29:50 $ - Version: $Revision: 1.155 $ + Date: $Date: 2005/08/30 14:40:33 $ + Version: $Revision: 1.156 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -148,7 +148,7 @@ DicomDir::DicomDir(std::string const &fileName, bool parseDir ): // (nothing is cheked in Document constructor, to avoid overhead) ParseDir = parseDir; - SetLoadMode (0x00000000); // concerns only dicom files + SetLoadMode (GDCM_LD_ALL); // concerns only dicom files SetFileName( fileName ); Load( ); } diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 0b344575..51c8cbf8 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2005/08/29 14:02:03 $ - Version: $Revision: 1.271 $ + Date: $Date: 2005/08/30 14:40:33 $ + Version: $Revision: 1.272 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -63,7 +63,7 @@ Document::Document() Group0002Parsed = false; IsDocumentAlreadyLoaded = false; IsDocumentModified = true; - LoadMode = 0x00000000; // default : load everything, later + LoadMode = GDCM_LD_ALL; // default : load everything, later SetFileName(""); } @@ -81,7 +81,7 @@ Document::Document( std::string const &fileName ) SwapCode = 1234; Filetype = ExplicitVR; Group0002Parsed = false; - LoadMode = 0x00000000; // Load everything, later + LoadMode = GDCM_LD_ALL; // Load everything, later // Load will set it to true if sucessfull IsDocumentAlreadyLoaded = false; @@ -1078,7 +1078,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, { if ( newValEntry->GetGroup()%2 != 0 ) // if Shadow Group { - if ( LoadMode & NO_SHADOW ) // if user asked to skip shad.gr + if ( LoadMode & LD_NOSHADOW ) // if user asked to skip shad.gr { std::string strLgrGroup = newValEntry->GetValue(); int lgrGroup; @@ -1126,7 +1126,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, } } - if ( (LoadMode & NO_SHADOWSEQ) && ! delim_mode_intern ) + if ( (LoadMode & LD_NOSHADOWSEQ) && ! delim_mode_intern ) { // User asked to skip SeQuences *only* if they belong to Shadow Group if ( newDocEntry->GetGroup()%2 != 0 ) @@ -1136,7 +1136,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, continue; } } - if ( (LoadMode & NO_SEQ) && ! delim_mode_intern ) + if ( (LoadMode & LD_NOSEQ) && ! delim_mode_intern ) { // User asked to skip *any* SeQuence Fp->seekg( l, std::ios::cur); diff --git a/src/gdcmDocument.h b/src/gdcmDocument.h index b89d15c5..84b7224d 100644 --- a/src/gdcmDocument.h +++ b/src/gdcmDocument.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.h,v $ Language: C++ - Date: $Date: 2005/08/29 13:05:01 $ - Version: $Revision: 1.120 $ + Date: $Date: 2005/08/30 14:40:33 $ + Version: $Revision: 1.121 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -28,11 +28,6 @@ #include #include -#define NO_SEQ 0x00000001 // Don't load odd groups -#define NO_SHADOW 0x00000002 // Don't load Sequences -#define NO_SHADOWSEQ 0x00000004 // Don't load Sequences if they belong - // to an odd group - // (*exclusive* from NO_SEQ and NO_SHADOW) namespace gdcm { class ValEntry; @@ -107,7 +102,7 @@ typedef std::list ListElements; /** * \brief Sets the LoadMode as a boolean string. - * NO_SEQ, NO_SHADOW, NO_SHADOWSEQ + * LD_NOSEQ, LD_NOSHADOW, LD_NOSHADOWSEQ ... (nothing more, right now) * WARNING : before using NO_SHADOW, be sure *all* your files * contain accurate values in the 0x0000 element (if any) diff --git a/src/gdcmFileHelper.cxx b/src/gdcmFileHelper.cxx index db8fb450..1d16fbf8 100644 --- a/src/gdcmFileHelper.cxx +++ b/src/gdcmFileHelper.cxx @@ -4,8 +4,8 @@ Module: $RCSfile: gdcmFileHelper.cxx,v $ Language: C++ - Date: $Date: 2005/08/22 15:38:05 $ - Version: $Revision: 1.54 $ + Date: $Date: 2005/08/30 14:40:33 $ + Version: $Revision: 1.55 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -47,10 +47,10 @@ gdcm::File *f = new gdcm::File(fileName); // user may also decide he doesn't want to load some parts of the header gdcm::File *f = new gdcm::File(); f->SetFileName(fileName); - f->SetLoadMode(NO_SEQ); // or - f->SetLoadMode(NO_SHADOW); // or - f->SetLoadMode(NO_SEQ | NO_SHADOW); // or - f->SetLoadMode(NO_SHADOWSEQ); + f->SetLoadMode(LD_NOSEQ); // or + f->SetLoadMode(LD_NOSHADOW); // or + f->SetLoadMode(LD_NOSEQ | LD_NOSHADOW); // or + f->SetLoadMode(LD_NOSHADOWSEQ); f->Load(); // user can now check some values diff --git a/src/gdcmSerieHelper.h b/src/gdcmSerieHelper.h index 6859f0c2..d791fe13 100644 --- a/src/gdcmSerieHelper.h +++ b/src/gdcmSerieHelper.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmSerieHelper.h,v $ Language: C++ - Date: $Date: 2005/08/30 14:15:34 $ - Version: $Revision: 1.18 $ + Date: $Date: 2005/08/30 14:40:33 $ + Version: $Revision: 1.19 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -77,8 +77,13 @@ public: /** * \brief Sets the LoadMode as a boolean string. +<<<<<<< gdcmSerieHelper.h + * LD_NOSEQ, LD_NOSHADOW, LD_NOSHADOWSEQ + ... (nothing more, right now) +======= * NO_SEQ, NO_SHADOW, NO_SHADOWSEQ * (nothing more, right now) +>>>>>>> 1.17 * WARNING : before using NO_SHADOW, be sure *all* your files * contain accurate values in the 0x0000 element (if any) * of *each* Shadow Group. The parser will fail if the size is wrong ! diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index e46553e7..51597358 100644 --- a/vtk/vtkGdcmReader.cxx +++ b/vtk/vtkGdcmReader.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: vtkGdcmReader.cxx,v $ Language: C++ - Date: $Date: 2005/08/22 12:30:36 $ - Version: $Revision: 1.76 $ + Date: $Date: 2005/08/30 14:40:35 $ + Version: $Revision: 1.77 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -50,79 +50,26 @@ // // to pass a 'Coherent File List' as produced by gdcm::SerieHelper // reader->SetCoherentFileList(l); // reader->Update(); - +// // WARNING TODO CLEANME // Actual limitations of this code // when a Coherent File List from SerieHelper is not used (bad idea :-( // -// /////// Redundant and unnecessary header parsing -// In it's current state this code actually parses three times the Dicom -// header of a file before the corresponding image gets loaded in the -// ad-hoc vtkData ! -// Here is the process: -// 1/ First loading happens in ExecuteInformation which, in order to -// positionate the vtk extents, calls CheckFileCoherence. The purpose -// of CheckFileCoherence is to make sure all the images in the future -// stack are "homogenous" (same size, same representation...). -// This can only be achieved by parsing all the Dicom headers... -// --> to avoid loosing too much time : -// If user is 150% sure *all* the files are coherent, that is to say : -// they may be open, they are gdcm-readable, they have the same sizes, -// they have the same 'pixel' type, they are single frame, -// they have the same color convention ... -// he may use SetCheckFileCoherenceLight() to request a 'light' coherence -// checking -// 2/ ExecuteData is then responsible for the next two loadings - 2 ?!?-: -// 2a/ ExecuteData calls AllocateOutputData that in turn seems to -// (indirectely call) ExecuteInformation which ends up in a second -// header parsing -// This is fixed by adding a test at the beginning of ExecuteInformation -// on the modification of the object instance. If a modification have been -// made (method Modified() ), the MTime value is increased. The fileTime -// is compared to this new value to find a modification in the class -// parameters -// 2b/ the core of ExecuteData then needs gdcm::File (which in turns -// initializes gdcm::File in the constructor) in order to access -// the data-image. -// -// Possible solution: -// maintain a list of gdcm::Files (created by say ExecuteInformation) created -// once and for all accross the life of vtkGdcmFile (it would only load -// new gdcm::File if the user changes the list). ExecuteData would then use -// those gdcm::File and hence avoid calling the constructor: -// - advantage: the header of the files would only be parsed once. -// - drawback: once execute information is called (i.e. on creation of -// a vtkGdcmFile) the gdcm::File structure is loaded in memory. -// The average size of a gdcm::File being of 100Ko, -// if oneloads 10 stacks of images with say 200 images each, -// you end-up with a loss of 200Mo... -// -// /////// Never unallocated memory: -// ExecuteData allocates space for the pixel data [which will get pointed -// by the vtkPointData() through the call -// data->GetPointData()->GetScalars()->SetVoidArray(mem, StackNumPixels, 0);] -// This data is never "freed" neither in the destructor nor when the -// filename list is extended, ExecuteData is called a second (or third) -// time... -// -// - // ////////////////////////////////////////////////////////////// #include "gdcmFileHelper.h" #include "gdcmFile.h" -#include "gdcmDocument.h" // for NO_SEQ #include "vtkGdcmReader.h" #include "gdcmDebug.h" +#include "gdcmCommon.h" -//#include #include #include #include #include -vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.76 $") +vtkCxxRevisionMacro(vtkGdcmReader, "$Revision: 1.77 $") vtkStandardNewMacro(vtkGdcmReader) //----------------------------------------------------------------------------- @@ -130,12 +77,17 @@ vtkStandardNewMacro(vtkGdcmReader) vtkGdcmReader::vtkGdcmReader() { this->LookupTable = NULL; - this->AllowLookupTable = 0; - this->AllowLightChecking = 0; - this->LoadMode = 0; // Load everything (possible values : NO_SEQ, NO_SHADOW, - // NO_SHADOWSEQ) + this->AllowLookupTable = false; + this->AllowLightChecking = false; + this->LoadMode = GDCM_LD_ALL; // Load everything (possible values : + // - LD_NOSEQ, + // - LD_NOSHADOW, + // - LD_NOSHADOWSEQ) this->CoherentFileList = 0; this->UserFunction = 0; + + this->OwnFile=true; + this->Execution=false; } vtkGdcmReader::~vtkGdcmReader() @@ -179,10 +131,7 @@ void vtkGdcmReader::AddFileName(const char* name) { // We need to bypass the const pointer [since list<>.push_bash() only // takes a char* (but not a const char*)] by making a local copy: - char *LocalName = new char[strlen(name) + 1]; - strcpy(LocalName, name); - this->FileNameList.push_back(LocalName); - delete[] LocalName; + this->FileNameList.push_back(name); this->Modified(); } @@ -200,15 +149,6 @@ void vtkGdcmReader::SetFileName(const char *name) this->Modified(); } -/* - * Ask for a 'light' checking -actually : just initializing- - *if you are 150% sure *all* the files are coherent - */ -//void vtkGdcmReader::SetCheckFileCoherenceLight() -//{ -// LightChecking = true; -//} - //----------------------------------------------------------------------------- // Protected /* @@ -216,25 +156,35 @@ void vtkGdcmReader::SetFileName(const char *name) */ void vtkGdcmReader::ExecuteInformation() { + if(this->Execution) + return; + + this->Execution=true; + this->RemoveAllInternalFile(); if(this->MTime>this->fileTime) { + this->TotalNumberOfPlanes = 0; + if ( this->CoherentFileList != 0 ) - this->TotalNumberOfPlanes = this->CheckFileCoherenceAlreadyDone(); - else if ( this->AllowLightChecking ) - this->TotalNumberOfPlanes = this->CheckFileCoherenceLight(); + { + this->UpdateFileInformation(); + } else - this->TotalNumberOfPlanes = this->CheckFileCoherence(); + { + this->BuildFileListFromPattern(); + this->LoadFileInformation(); + } if ( this->TotalNumberOfPlanes == 0) { vtkErrorMacro(<< "File set is not coherent. Exiting..."); return; } - + // if the user has not set the extent, but has set the VOI // set the z axis extent to the VOI z axis if (this->DataExtent[4]==0 && this->DataExtent[5] == 0 && - (this->DataVOI[4] || this->DataVOI[5])) + (this->DataVOI[4] || this->DataVOI[5])) { this->DataExtent[4] = this->DataVOI[4]; this->DataExtent[5] = this->DataVOI[5]; @@ -317,6 +267,12 @@ void vtkGdcmReader::ExecuteInformation() } this->Superclass::ExecuteInformation(); + + this->GetOutput()->SetUpdateExtentToWholeExtent(); + this->BuildData(this->GetOutput()); + + this->Execution=false; + this->RemoveAllInternalFile(); } /* @@ -328,7 +284,10 @@ void vtkGdcmReader::ExecuteInformation() */ void vtkGdcmReader::ExecuteData(vtkDataObject *output) { - if ( CoherentFileList != 0 ) // When a list of names is passed + vtkImageData *data=vtkImageData::SafeDownCast(output); + data->SetExtent(this->DataExtent); + +/* if ( CoherentFileList != 0 ) // When a list of names is passed { if (this->CoherentFileList->empty()) { @@ -341,11 +300,13 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output) vtkErrorMacro(<< "A least a valid FileName must be specified."); return; } +*/ +} - // FIXME : extraneous parsing of header is made when allocating OuputData - // --> ?!? +void vtkGdcmReader::BuildData(vtkDataObject *output) +{ vtkImageData *data = this->AllocateOutputData(output); - data->SetExtent(this->DataExtent); + data->GetPointData()->GetScalars()->SetName("DicomImage-Volume"); // Test if output has valid extent @@ -371,68 +332,18 @@ void vtkGdcmReader::ExecuteData(vtkDataObject *output) // Filling the allocated memory space with each image/volume: + size_t size = this->NumColumns * this->NumLines * this->NumPlanes + * data->GetScalarSize() * this->NumComponents; unsigned char *Dest = (unsigned char *)data->GetScalarPointer(); - - if ( CoherentFileList == 0 ) // When a list of names is passed - { - for (std::list::iterator filename = InternalFileNameList.begin(); - filename != InternalFileNameList.end(); - ++filename) - { - // Images that were tagged as unreadable in CheckFileCoherence() - // are substituted with a black image to let the caller visually - // notice something wrong is going on: - if (*filename != "GDCM_UNREADABLE") - { - // Update progress related for good files is made in LoadImageInMemory - Dest += this->LoadImageInMemory(*filename, Dest, - UpdateProgressTarget, - UpdateProgressCount); - } - else - { - // We insert a black image in the stack for the user to be aware that - // this image/volume couldn't be loaded. We simply skip one image - // size: - Dest += this->NumColumns * this->NumLines * this->PixelSize; - - // Update progress related for bad files: - UpdateProgressCount += this->NumLines; - if (UpdateProgressTarget > 0) - { - if (!(UpdateProgressCount%UpdateProgressTarget)) - { - this->UpdateProgress(UpdateProgressCount/(50.0*UpdateProgressTarget)); - } - } - } // Else, file not loadable - } // Loop on files - - } - else // when a Coherent File List is passed + for (std::vector::iterator it = InternalFileList.begin(); + it != InternalFileList.end(); + ++it) { - for (std::vector::iterator it = CoherentFileList->begin(); - it != CoherentFileList->end(); - ++it) - { - - //std::cout <<"----------------- " << (*it)->GetFileName() << std::endl; - - Dest += this->LoadImageInMemory(*it, Dest, - UpdateProgressTarget, - UpdateProgressCount); - // Update progress related for bad files: - UpdateProgressCount += this->NumLines; - if (UpdateProgressTarget > 0) - { - if (!(UpdateProgressCount%UpdateProgressTarget)) - { - this->UpdateProgress(UpdateProgressCount/(50.0*UpdateProgressTarget)); - } - } - } // Loop on files - - } + this->LoadImageInMemory(*it, Dest, + UpdateProgressTarget, + UpdateProgressCount); + Dest += size; + } } } @@ -448,6 +359,7 @@ void vtkGdcmReader::BuildFileListFromPattern() { this->RemoveAllInternalFileName(); + // Test miscellanous cases if ((! this->FileNameList.empty()) && this->FileName ) { vtkErrorMacro(<< "Both AddFileName and SetFileName schemes were used"); @@ -469,6 +381,7 @@ void vtkGdcmReader::BuildFileListFromPattern() return; } + // Create the InternalFileNameList if (! this->FileNameList.empty() ) { vtkDebugMacro(<< "Using the AddFileName specified files"); @@ -503,60 +416,28 @@ void vtkGdcmReader::BuildFileListFromPattern() } } -/* - * When more than one filename is specified (i.e. we expect loading - * a stack or volume) we need to check that the corresponding images/volumes - * to be loaded are coherent i.e. to make sure: - * - they all share the same X dimensions - * - they all share the same Y dimensions - * - they all share the same ImageType ( 8 bit signed, or unsigned...) +/** + * Load all the files and set it in the InternalFileList + * For each file, the readability and the coherence of image caracteristics + * are tested. If an image doesn't agree the required specifications, it + * isn't considered and no data will be set for the planes corresponding + * to this image * - * Eventually, we emit a warning when all the files do NOT share the - * Z dimension, since we can still build a stack but the - * files are not coherent in Z, which is probably a source a trouble... - * When files are not readable (either the file cannot be opened or - * because gdcm cannot parse it), they are flagged as "GDCM_UNREADABLE". - * This method returns the total number of planar images to be loaded - * (i.e. an image represents one plane, but a volume represents many planes) + * The source of this work is the list of file name generated by the + * BuildFileListFromPattern method */ -int vtkGdcmReader::CheckFileCoherence() +void vtkGdcmReader::LoadFileInformation() { - int ReturnedTotalNumberOfPlanes = 0; // The returned value. - - this->BuildFileListFromPattern(); - if (this->InternalFileNameList.empty()) - { - vtkErrorMacro(<< "FileNames are not set."); - return 0; - } - - bool FoundReferenceFile = false; - int ReferenceNZ = 0; + gdcm::File *file; + bool foundReference=false; + std::string type; - // Loop on the filenames: - // - check for their existence and gdcm "parsability" - // - get the coherence check done: + this->OwnFile=true; for (std::list::iterator filename = InternalFileNameList.begin(); filename != InternalFileNameList.end(); ++filename) { - // The file is always added in the number of planes - // - If file doesn't exist, it will be replaced by a black plane in the - // ExecuteData method - // - If file has more than 1 plane, other planes will be added later to - // to the ReturnedTotalNumberOfPlanes variable counter - ReturnedTotalNumberOfPlanes += 1; - - /////// Stage 0: check for file name: - - // fixme : how can the filename be equal to "GDCM_UNREADABLE" - // right now ?!? - - if(*filename == std::string("GDCM_UNREADABLE")) - continue; - - /////// Stage 1: check for file readability: - // Stage 1.1: check for file existence. + // check for file readability FILE *fp; fp = fopen(filename->c_str(),"rb"); if (!fp) @@ -564,29 +445,32 @@ int vtkGdcmReader::CheckFileCoherence() vtkErrorMacro(<< "Unable to open file " << filename->c_str()); vtkErrorMacro(<< "Removing this file from read files: " << filename->c_str()); - *filename = "GDCM_UNREADABLE"; + file = NULL; + InternalFileList.push_back(file); continue; } fclose(fp); - // Stage 1.2: check for Gdcm parsability + // Read the file + file=new gdcm::File(); + file->SetLoadMode( LoadMode ); + file->SetFileName(filename->c_str() ); + file->Load(); - // to save some parsing time. - gdcm::File GdcmFile; - GdcmFile.SetLoadMode( LoadMode ); - GdcmFile.SetFileName(filename->c_str() ); - GdcmFile.Load( ); - if (!GdcmFile.IsReadable()) + // Test the Dicom file readability + if(!file->IsReadable()) { vtkErrorMacro(<< "Gdcm cannot parse file " << filename->c_str()); vtkErrorMacro(<< "Removing this file from read files: " << filename->c_str()); - *filename = "GDCM_UNREADABLE"; + delete file; + file=NULL; + InternalFileList.push_back(file); continue; } - // Stage 1.3: further gdcm compatibility on PixelType - std::string type = GdcmFile.GetPixelType(); + // Test the Pixel Type recognition + type = file->GetPixelType(); if ( (type != "8U") && (type != "8S") && (type != "16U") && (type != "16S") && (type != "32U") && (type != "32S") ) @@ -595,112 +479,170 @@ int vtkGdcmReader::CheckFileCoherence() << " File type found : " << type.c_str() << " (might be 8U, 8S, 16U, 16S, 32U, 32S) \n" << " Removing this file from read files"); - *filename = "GDCM_UNREADABLE"; + delete file; + file=NULL; + InternalFileList.push_back(file); continue; } - // Stage 2: check coherence of the set of files - int NX = GdcmFile.GetXSize(); - int NY = GdcmFile.GetYSize(); - int NZ = GdcmFile.GetZSize(); - if (FoundReferenceFile) + // Test the image informations + if(!foundReference) { - // Stage 2.1: mandatory coherence stage: - if ( ( NX != this->NumColumns ) - || ( NY != this->NumLines ) - || ( type != this->ImageType ) ) - { - vtkErrorMacro(<< "This file is not coherent with previous ones: " - << filename->c_str()); - vtkErrorMacro(<< "Removing this file from read files: " - << filename->c_str()); - *filename = "GDCM_UNREADABLE"; - continue; - } - - // Stage 2.2: optional coherence stage - if ( NZ != ReferenceNZ ) - { - vtkErrorMacro(<< "File is not coherent in Z with previous ones: " - << filename->c_str()); - } - else - { - vtkDebugMacro(<< "File is coherent with previous ones: " - << filename->c_str()); - } + foundReference = true; + GetFileInformation(file); - // Stage 2.3: when the file is 'multiframe', notify the caller. - if (NZ > 1) - { - vtkErrorMacro(<< "This file is a 'Multiframe' one: " - << filename->c_str()); - } - - // Eventually, this file can be added on the stack. Update the - // full size of the stack - vtkDebugMacro("Number of planes added to the stack: " << NZ); - ReturnedTotalNumberOfPlanes += NZ - 1; // First plane already added - continue; - - } - else - { - // We didn't have a workable reference file yet. - // Set this one as the reference. - FoundReferenceFile = true; vtkDebugMacro(<< "This file taken as coherence reference:" - << filename->c_str()); + << filename->c_str()); vtkDebugMacro(<< "Image dimensions of reference file as read from Gdcm:" - << NX << " " << NY << " " << NZ); - vtkDebugMacro(<< "Number of planes added to the stack: " << NZ); - // Set aside the size of the image - this->NumColumns = NX; - this->NumLines = NY; - ReferenceNZ = NZ; - ReturnedTotalNumberOfPlanes += NZ - 1; // First plane already added - this->ImageType = type; - this->PixelSize = GdcmFile.GetPixelSize(); - - if( GdcmFile.HasLUT() && this->AllowLookupTable ) - { - // I could raise an error is AllowLookupTable is on and HasLUT() off - this->NumComponents = GdcmFile.GetNumberOfScalarComponentsRaw(); - } - else - { - this->NumComponents = GdcmFile.GetNumberOfScalarComponents(); //rgb or mono - } - //Set image spacing - this->DataSpacing[0] = GdcmFile.GetXSpacing(); - this->DataSpacing[1] = GdcmFile.GetYSpacing(); - this->DataSpacing[2] = GdcmFile.GetZSpacing(); + << this->NumColumns << " " << this->NumLines << " " + << this->NumPlanes); + } + else if(!TestFileInformation(file)) + { + delete file; + file=NULL; } - } // End of loop on filename - ///////// The files we CANNOT load are flaged. On debugging purposes - // count the loadable number of files and display their number: - int NumberCoherentFiles = 0; - for (std::list::iterator it = InternalFileNameList.begin(); - it != InternalFileNameList.end(); - ++it) + InternalFileList.push_back(file); + } +} + +/** + * Update the file informations. + * This works exactly like LoadFileInformation, but the source of work + * is the list of coherent files + */ +void vtkGdcmReader::UpdateFileInformation() +{ + this->InternalFileList=*(this->CoherentFileList); + this->OwnFile=false; + + for(gdcmFileList::iterator it=InternalFileList.begin(); + it!=InternalFileList.end(); + ++it) { - if (*it != "GDCM_UNREADABLE") + if( *it != NULL) { - NumberCoherentFiles++; + GetFileInformation(*it); + break; } } - vtkDebugMacro(<< "Number of coherent files: " << NumberCoherentFiles); +} + +/** + * Get the informations from a file. + * These informations are required to specify the output image + * caracteristics + */ +void vtkGdcmReader::GetFileInformation(gdcm::File *file) +{ + // Get the image caracteristics + this->NumColumns = file->GetXSize(); + this->NumLines = file->GetYSize(); + this->NumPlanes = file->GetZSize(); + this->TotalNumberOfPlanes = this->NumPlanes*InternalFileNameList.size(); - if (ReturnedTotalNumberOfPlanes == 0) + this->ImageType = file->GetPixelType(); + this->PixelSize = file->GetPixelSize(); + + this->DataSpacing[0] = file->GetXSpacing(); + this->DataSpacing[1] = file->GetYSpacing(); + this->DataSpacing[2] = file->GetZSpacing(); + + // Get the image data caracteristics + if( file->HasLUT() && this->AllowLookupTable ) { - vtkErrorMacro(<< "No loadable file."); + // I could raise an error is AllowLookupTable is on and HasLUT() off + this->NumComponents = file->GetNumberOfScalarComponentsRaw(); } + else + { + this->NumComponents = file->GetNumberOfScalarComponents(); //rgb or mono + } +} - vtkDebugMacro(<< "Total number of planes on the stack: " - << ReturnedTotalNumberOfPlanes); - - return ReturnedTotalNumberOfPlanes; +/* + * When more than one filename is specified (i.e. we expect loading + * a stack or volume) we need to check that the corresponding images/volumes + * to be loaded are coherent i.e. to make sure: + * - they all share the same X dimensions + * - they all share the same Y dimensions + * - they all share the same ImageType ( 8 bit signed, or unsigned...) + * + * Eventually, we emit a warning when all the files do NOT share the + * Z dimension, since we can still build a stack but the + * files are not coherent in Z, which is probably a source a trouble... + * When files are not readable (either the file cannot be opened or + * because gdcm cannot parse it), they are flagged as "GDCM_UNREADABLE". + * This method returns the total number of planar images to be loaded + * (i.e. an image represents one plane, but a volume represents many planes) + */ +/** + * Test the coherent informations of the file with the reference informations + * used as image caracteristics. The tested informations are : + * - they all share the same X dimensions + * - they all share the same Y dimensions + * - they all share the same Z dimensions + * - they all share the same number of components + * - they all share the same ImageType ( 8 bit signed, or unsigned...) + * + * \return True if the file match, False otherwise + */ +bool vtkGdcmReader::TestFileInformation(gdcm::File *file) +{ + int numColumns = file->GetXSize(); + int numLines = file->GetYSize(); + int numPlanes = file->GetZSize(); + int pixelSize = file->GetPixelSize(); + int numComponents; + + if( file->HasLUT() && this->AllowLookupTable ) + numComponents = file->GetNumberOfScalarComponentsRaw(); + else + numComponents = file->GetNumberOfScalarComponents(); //rgb or mono + + if( numColumns != this->NumColumns ) + { + vtkErrorMacro(<< "File X value doesn't match with the previous ones: " + << file->GetFileName().c_str() + << ". Found " << numColumns << ", must be " + << this->NumColumns); + return false; + } + if( numLines != this->NumLines ) + { + vtkErrorMacro(<< "File y value doesn't match with the previous ones: " + << file->GetFileName().c_str() + << ". Found " << numLines << ", must be " + << this->NumLines); + return false; + } + if( numPlanes != this->NumPlanes ) + { + vtkErrorMacro(<< "File z value doesn't match with the previous ones: " + << file->GetFileName().c_str() + << ". Found " << numPlanes << ", must be " + << this->NumPlanes); + return false; + } + if( numComponents != this->NumComponents ) + { + vtkErrorMacro(<< "File Components count doesn't match with the previous ones: " + << file->GetFileName().c_str() + << ". Found " << numComponents << ", must be " + << this->NumComponents); + return false; + } + if( pixelSize != this->PixelSize ) + { + vtkErrorMacro(<< "File pixel size doesn't match with the previous ones: " + << file->GetFileName().c_str() + << ". Found " << pixelSize << ", must be " + << this->PixelSize); + return false; + } + + return true; } //----------------------------------------------------------------------------- @@ -725,28 +667,41 @@ void vtkGdcmReader::AddInternalFileName(const char *name) } /* - * Loads the contents of the image/volume contained by gdcm::File* f at - * the Dest memory address. Returns the size of the data loaded. + * Remove all file names to the internal list of images to read. */ -size_t vtkGdcmReader::LoadImageInMemory( - gdcm::File *f, - unsigned char *dest, - const unsigned long updateProgressTarget, - unsigned long &updateProgressCount) +void vtkGdcmReader::RemoveAllInternalFile(void) { - // vtkDebugMacro(<< "Copying to memory image [" << f->GetFileName() << "]"); + if(this->OwnFile) + { + for(gdcmFileList::iterator it=InternalFileList.begin(); + it!=InternalFileList.end(); + ++it) + { + delete (*it); + } + } + this->InternalFileList.clear(); +} - return DoTheLoadingJob (f, - dest, - updateProgressTarget, - updateProgressCount); +void vtkGdcmReader::IncrementProgress(const unsigned long updateProgressTarget, + unsigned long &updateProgressCount) +{ + // Update progress related for bad files: + updateProgressCount += this->NumLines; + if (updateProgressTarget > 0) + { + if (!(updateProgressCount%updateProgressTarget)) + { + this->UpdateProgress(updateProgressCount/(50.0*updateProgressTarget)); + } + } } /* * Loads the contents of the image/volume contained by char *fileName at * the dest memory address. Returns the size of the data loaded. */ -size_t vtkGdcmReader::LoadImageInMemory( +/*void vtkGdcmReader::LoadImageInMemory( std::string fileName, unsigned char *dest, const unsigned long updateProgressTarget, @@ -760,24 +715,42 @@ size_t vtkGdcmReader::LoadImageInMemory( f->SetFileName( fileName.c_str() ); f->Load( ); - return DoTheLoadingJob (f, - dest, - updateProgressTarget, - updateProgressCount); + LoadImageInMemory(f,dest, + updateProgressTarget, + updateProgressCount); delete f; -} +}*/ /* - * Service method for LoadImageInMemory -*/ -size_t vtkGdcmReader::DoTheLoadingJob (gdcm::File *f, - unsigned char *dest, - const unsigned long updateProgressTarget, - unsigned long &updateProgressCount) + * Loads the contents of the image/volume contained by gdcm::File* f at + * the Dest memory address. Returns the size of the data loaded. + * \ param f File to consider. NULL if the file must be skiped + * \remarks Assume that if (f != NULL) then its caracteristics match + * with the previous ones + */ +void vtkGdcmReader::LoadImageInMemory( + gdcm::File *f, + unsigned char *dest, + const unsigned long updateProgressTarget, + unsigned long &updateProgressCount) { + if(!f) + return; + gdcm::FileHelper *fileH = new gdcm::FileHelper( f ); fileH->SetUserFunction( UserFunction ); + int numColumns = f->GetXSize(); + int numLines = f->GetYSize(); + int numPlanes = f->GetZSize(); + int numComponents; + + if( f->HasLUT() && this->AllowLookupTable ) + numComponents = f->GetNumberOfScalarComponentsRaw(); + else + numComponents = f->GetNumberOfScalarComponents(); //rgb or mono + + vtkDebugMacro(<< "Copying to memory image [" << f->GetFileName().c_str() << "]"); size_t size; // If the data structure of vtk for image/volume representation @@ -787,10 +760,7 @@ size_t vtkGdcmReader::DoTheLoadingJob (gdcm::File *f, // line comes first (for some axis related reasons?). Hence we need // to load the image line by line, starting from the end. - int numColumns = fileH->GetFile()->GetXSize(); - int numLines = fileH->GetFile()->GetYSize(); - int numPlanes = fileH->GetFile()->GetZSize(); - int lineSize = NumComponents * numColumns * fileH->GetFile()->GetPixelSize(); + int lineSize = NumComponents * numColumns * f->GetPixelSize(); int planeSize = lineSize * numLines; unsigned char *src; @@ -844,118 +814,8 @@ size_t vtkGdcmReader::DoTheLoadingJob (gdcm::File *f, } dst += 2 * planeSize; } - delete fileH; - return size; -} - -// ------------------------------------------------------------------------- - -// We assume the use *does* know all the files whose names -// are in InternalFileNameList exist, may be open, are gdcm-readable -// have the same sizes, have the same 'pixel' type, are single frame -// have the same color convention, ..., anything else ? - -int vtkGdcmReader::CheckFileCoherenceLight() -{ - std::list::iterator filename = InternalFileNameList.begin(); - gdcm::File GdcmFile; - GdcmFile.SetLoadMode( LoadMode ); - GdcmFile.SetFileName(filename->c_str() ); - GdcmFile.Load( ); - - if (!GdcmFile.IsReadable()) - { - vtkErrorMacro(<< "Gdcm cannot parse file " << filename->c_str()); - vtkErrorMacro(<< "you should try vtkGdcmReader::CheckFileCoherence " - << "instead of vtkGdcmReader::CheckFileCoherenceLight"); - return 0; - } - int NX = GdcmFile.GetXSize(); - int NY = GdcmFile.GetYSize(); - // CheckFileCoherenceLight should be called *only* when user knows - // he deals with single frames files. - // Z size is then the number of files. - int NZ = InternalFileNameList.size(); - std::string type = GdcmFile.GetPixelType(); - vtkDebugMacro(<< "The first file is taken as reference: " - << filename->c_str()); - vtkDebugMacro(<< "Image dimensions of reference file as read from Gdcm:" - << NX << " " << NY << " " << NZ); - vtkDebugMacro(<< "Number of planes added to the stack: " << NZ); - // Set aside the size of the image - this->NumColumns = NX; - this->NumLines = NY; - this->ImageType = type; - this->PixelSize = GdcmFile.GetPixelSize(); - - if( GdcmFile.HasLUT() && this->AllowLookupTable ) - { - // I could raise an error is AllowLookupTable is on and HasLUT() off - this->NumComponents = GdcmFile.GetNumberOfScalarComponentsRaw(); - } - else - { - this->NumComponents = GdcmFile.GetNumberOfScalarComponents(); //rgb or mono - } - - //Set image spacing - this->DataSpacing[0] = GdcmFile.GetXSpacing(); - this->DataSpacing[1] = GdcmFile.GetYSpacing(); - this->DataSpacing[2] = GdcmFile.GetZSpacing(); - - return InternalFileNameList.size(); + delete fileH; } -// We assume the use *does* know all the files whose names -// are in InternalFileNameList exist, may be open, are gdcm-readable -// have the same sizes, have the same 'pixel' type, are single frame -// have the same color convention, ..., anything else ? - -int vtkGdcmReader::CheckFileCoherenceAlreadyDone() -{ - if ( CoherentFileList->empty() ) - { - vtkErrorMacro(<< "Coherent File List is empty "); - return 0; - } - - gdcm::File *gdcmFile = (*CoherentFileList)[0]; - - int NX = gdcmFile->GetXSize(); - int NY = gdcmFile->GetYSize(); - // CheckFileCoherenceLight should be called *only* when user knows - // he deals with single frames files. - // Z size is then the number of files. - // --> TODO : loop on the File* to get NZ of each one ! - int NZ = CoherentFileList->size(); - std::string type = gdcmFile->GetPixelType(); - //vtkDebugMacro(<< "The first file is taken as reference: " - // << (*CoherentFileList)[0]->GetFileName() ); - vtkDebugMacro(<< "Image dimensions of reference file as read from Gdcm:" - << NX << " " << NY << " " << NZ); - vtkDebugMacro(<< "Number of planes added to the stack: " << NZ); - // Set aside the size of the image - this->NumColumns = NX; - this->NumLines = NY; - this->ImageType = type; - this->PixelSize = gdcmFile->GetPixelSize(); - - if( gdcmFile->HasLUT() && this->AllowLookupTable ) - { - // I could raise an error is AllowLookupTable is on and HasLUT() off - this->NumComponents = gdcmFile->GetNumberOfScalarComponentsRaw(); - } - else - { - this->NumComponents = gdcmFile->GetNumberOfScalarComponents(); //rgb or mono - } - - //Set image spacing - this->DataSpacing[0] = gdcmFile->GetXSpacing(); - this->DataSpacing[1] = gdcmFile->GetYSpacing(); - this->DataSpacing[2] = gdcmFile->GetZSpacing(); - - return NZ; -} //----------------------------------------------------------------------------- diff --git a/vtk/vtkGdcmReader.h b/vtk/vtkGdcmReader.h index a84f3b7b..bdf3af32 100644 --- a/vtk/vtkGdcmReader.h +++ b/vtk/vtkGdcmReader.h @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: vtkGdcmReader.h,v $ Language: C++ - Date: $Date: 2005/08/22 12:43:11 $ - Version: $Revision: 1.27 $ + Date: $Date: 2005/08/30 14:40:35 $ + Version: $Revision: 1.28 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -49,9 +49,9 @@ public: CoherentFileList = cfl; } //ETX - vtkSetMacro(AllowLightChecking, int); - vtkGetMacro(AllowLightChecking, int); - vtkBooleanMacro(AllowLightChecking, int); + vtkSetMacro(AllowLightChecking, bool); + vtkGetMacro(AllowLightChecking, bool); + vtkBooleanMacro(AllowLightChecking, bool); //BTX void SetUserFunction (VOID_FUNCTION_PUINT8_PFILE_POINTER userFunc ) @@ -62,15 +62,16 @@ public: // If this flag is set and the DICOM reader encounters a dicom file with // lookup table the data will be kept as unsigned chars and a lookuptable // will be exported and accessible through GetLookupTable() - vtkSetMacro(AllowLookupTable, int); - vtkGetMacro(AllowLookupTable, int); - vtkBooleanMacro(AllowLookupTable, int); + vtkSetMacro(AllowLookupTable, bool); + vtkGetMacro(AllowLookupTable, bool); + vtkBooleanMacro(AllowLookupTable, bool); vtkGetObjectMacro(LookupTable, vtkLookupTable); /** * \brief Sets the LoadMode as a boolean string. - * NO_SEQ, NO_SHADOW, NO_SHADOWSEQ... (nothing more, right now) + * gdcm.LD_NOSEQ, gdcm.LD_NOSHADOW, gdcm.LD_NOSHADOWSEQ... + * (nothing more, right now) * WARNING : before using NO_SHADOW, be sure *all* your files * contain accurate values in the 0x0000 element (if any) * of *each* Shadow Group. The parser will fail if the size is wrong ! @@ -86,41 +87,51 @@ protected: virtual void ExecuteInformation(); virtual void ExecuteData(vtkDataObject *output); + + virtual void BuildData(vtkDataObject *output); virtual void BuildFileListFromPattern(); - virtual int CheckFileCoherence(); - virtual int CheckFileCoherenceLight(); - virtual int CheckFileCoherenceAlreadyDone(); + virtual void LoadFileInformation(); + virtual void UpdateFileInformation(); + //BTX + virtual void GetFileInformation(gdcm::File *file); + virtual bool TestFileInformation(gdcm::File *file); + //ETX + private: void RemoveAllInternalFileName(void); - void AddInternalFileName(const char* name); + void AddInternalFileName(const char *name); + void RemoveAllInternalFile(void); //BTX - size_t LoadImageInMemory(std::string fileName, unsigned char *dest, - const unsigned long updateProgressTarget, - unsigned long &updateProgressCount); - - size_t LoadImageInMemory(gdcm::File *f, unsigned char *dest, - const unsigned long updateProgressTarget, - unsigned long &updateProgressCount); - - size_t DoTheLoadingJob (gdcm::File *f, - unsigned char *dest, - const unsigned long updateProgressTarget, - unsigned long &updateProgressCount); + void IncrementProgress(const unsigned long updateProgressTarget, + unsigned long &updateProgressCount); + /*void LoadImageInMemory(std::string fileName, unsigned char *dest, + const unsigned long updateProgressTarget, + unsigned long &updateProgressCount);*/ + + void LoadImageInMemory(gdcm::File *f, unsigned char *dest, + const unsigned long updateProgressTarget, + unsigned long &updateProgressCount); //ETX // Variables + //BTX + typedef std::vector gdcmFileList; + //ETX + vtkLookupTable *LookupTable; vtkTimeStamp fileTime; - int AllowLookupTable; - int AllowLightChecking; + bool AllowLookupTable; + bool AllowLightChecking; //BTX // Number of columns of the image/volume to be loaded int NumColumns; // Number of lines of the image/volume to be loaded int NumLines; + // Number of lines of the image/volume to be loaded + int NumPlanes; // Total number of planes (or images) of the stack to be build. int TotalNumberOfPlanes; // Number of scalar components of the image to be loaded (1=monochrome 3=rgb) @@ -132,6 +143,8 @@ private: // List of filenames to be read in order to build a stack of images // or volume. The order in the list shall be the order of the images. std::list FileNameList; + gdcmFileList *CoherentFileList; + bool OwnFile; // List of filenames created in ExecuteInformation and used in // ExecuteData. @@ -140,7 +153,8 @@ private: // Otherwise, InternalFileNameList correspond to the list of // files patterned std::list InternalFileNameList; - std::vector *CoherentFileList; + gdcmFileList InternalFileList; + bool Execution; //ETX diff --git a/vtk/vtkgdcmSerieViewer.cxx b/vtk/vtkgdcmSerieViewer.cxx index 790ca466..d925c518 100644 --- a/vtk/vtkgdcmSerieViewer.cxx +++ b/vtk/vtkgdcmSerieViewer.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: vtkgdcmSerieViewer.cxx,v $ Language: C++ - Date: $Date: 2005/08/22 12:21:03 $ - Version: $Revision: 1.5 $ + Date: $Date: 2005/08/30 14:40:35 $ + Version: $Revision: 1.6 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -124,24 +124,24 @@ int main(int argc, char *argv[]) char *dirName = am->ArgMgrWantString("dirname",usage); - int loadMode = 0x00000000; + int loadMode = GDCM_LD_ALL; if ( am->ArgMgrDefined("noshadowseq") ) - loadMode |= NO_SHADOWSEQ; + loadMode |= GDCM_LD_NOSHADOWSEQ; else { if ( am->ArgMgrDefined("noshadow") ) - loadMode |= NO_SHADOW; + loadMode |= GDCM_LD_NOSHADOW; if ( am->ArgMgrDefined("noseq") ) - loadMode |= NO_SEQ; + loadMode |= GDCM_LD_NOSEQ; } - bool reverse = am->ArgMgrDefined("reverse"); + int reverse = am->ArgMgrDefined("reverse"); - bool mirror = am->ArgMgrDefined("mirror"); - bool topdown = am->ArgMgrDefined("topdown"); - bool rotate = am->ArgMgrDefined("rotate"); + int mirror = am->ArgMgrDefined("mirror"); + int topdown = am->ArgMgrDefined("topdown"); + int rotate = am->ArgMgrDefined("rotate"); - bool check = am->ArgMgrDefined("check"); + int check = am->ArgMgrDefined("check"); if ( (int)mirror + (int)topdown + (int)rotate > 1) { diff --git a/vtk/vtkgdcmViewer.cxx b/vtk/vtkgdcmViewer.cxx index 47fc46c6..334d0181 100644 --- a/vtk/vtkgdcmViewer.cxx +++ b/vtk/vtkgdcmViewer.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: vtkgdcmViewer.cxx,v $ Language: C++ - Date: $Date: 2005/06/29 16:15:16 $ - Version: $Revision: 1.26 $ + Date: $Date: 2005/08/30 14:40:35 $ + Version: $Revision: 1.27 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -94,7 +94,7 @@ int main(int argc, char *argv[]) reader->AddFileName( argv[i] ); // TODO : allow user to choose Load Mode - reader->SetLoadMode(NO_SHADOWSEQ); + reader->SetLoadMode(GDCM_LD_NOSHADOWSEQ); reader->Update(); //print debug info: diff --git a/vtk/vtkgdcmViewer2.cxx b/vtk/vtkgdcmViewer2.cxx index 6b8a8e42..7ddc82f8 100644 --- a/vtk/vtkgdcmViewer2.cxx +++ b/vtk/vtkgdcmViewer2.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: vtkgdcmViewer2.cxx,v $ Language: C++ - Date: $Date: 2005/06/29 16:15:16 $ - Version: $Revision: 1.3 $ + Date: $Date: 2005/08/30 14:40:35 $ + Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -95,7 +95,7 @@ int main(int argc, char *argv[]) reader->AddFileName( argv[i] ); // TODO : allow user to choose Load Mode - reader->SetLoadMode(NO_SHADOWSEQ); + reader->SetLoadMode(GDCM_LD_NOSHADOWSEQ); reader->Update(); //print debug info: