From b178cc9e1efeff5116c138ac66beaf0235d8c09a Mon Sep 17 00:00:00 2001 From: regrain Date: Tue, 30 Mar 2004 08:20:58 +0000 Subject: [PATCH] * vtk/vtkGdcmReader.[h|cxx] : fix the read of 3 gdcmHeader when making an upate of the object's instance. It's passed to 2 in the unfavorable case : one in the ExecuteInformation, one in the ExecuteData -- BeNours --- ChangeLog | 19 +++-- vtk/vtkGdcmReader.cxx | 177 ++++++++++++++++++++++-------------------- vtk/vtkGdcmReader.h | 13 ++-- 3 files changed, 113 insertions(+), 96 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4b26701c..61e8b554 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,14 +1,19 @@ +2004-03-30 Benoit Regrain + * vtk/vtkGdcmReader.[h|cxx] : fix the read of 3 gdcmHeader when making an + upate of the object's instance. It's passed to 2 in the unfavorable + case : one in the ExecuteInformation, one in the ExecuteData + 2004-03-29 Jean-Pierre Roux - * ENH : Check on file type to be written moved + * ENH : Check on file type to be written moved from gdcmParser::WriteEntry to gdcmParser::WriteEntries - * FIX : gdcmObject::ResetBoundaries now stops properly + * FIX : gdcmObject::ResetBoundaries now stops properly when end-of-list is reached : gdcmVersion modified (as Benoit Regrain asked) 2004-03-29 Eric Boix * src/gdcmParser.cxx: removal of all TAB character. Indentation fixed. - * src/gdcmUtil.cxx: added forgotten iostream include. - * src/gdcmCommon.h: FileType enum entry DICOMDIR removed (since + * src/gdcmUtil.cxx: added forgotten iostream include. + * src/gdcmCommon.h: FileType enum entry DICOMDIR removed (since equivalent to ExplicitVR in existing code). 2004-03-27 Eric Boix @@ -25,16 +30,16 @@ * src/gdcmUtil.[cxx|h] _CreateCleanString renamed to CreateCleanString * Doc/DoxyMainPageUser.txt added. * Doc/Doc/DoxyfileUsers updated to version 1.3.4 of Doxygen. - * src/gdcmCommon.h now defines getcwd for Win32 (moved away from + * src/gdcmCommon.h now defines getcwd for Win32 (moved away from src/gdcmDirList.cxx) 2004-03-24 Jean-Pierre Roux * FIX a lot of little surface modifications to be doxygen 1.3.6 compliant 2004-03-23 Jean-Pierre Roux - * FIX Now gdcmFile::SwapZone doesn't seg faults any longer for + * FIX Now gdcmFile::SwapZone doesn't seg faults any longer for big endian made volumes - * ENH Now gdcmParser constructor and destructor are protected to forbid + * ENH Now gdcmParser constructor and destructor are protected to forbid end user to instanciate class gdcmParser (only gdcmHeader and gdcmDicomDir are meaningfull) diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index 5fb33b22..1e3f9a21 100644 --- a/vtk/vtkGdcmReader.cxx +++ b/vtk/vtkGdcmReader.cxx @@ -18,6 +18,11 @@ // 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 gdcmFile (which in turns // initialises gdcmHeader in the constructor) in order to access // the data-image. @@ -91,6 +96,7 @@ void vtkGdcmReader::PrintSelf(ostream& os, vtkIndent indent) void vtkGdcmReader::RemoveAllFileName(void) { this->FileNameList.clear(); + this->Modified(); } /* @@ -103,8 +109,8 @@ void vtkGdcmReader::AddFileName(const char* name) char * LocalName = new char[strlen(name) + 1]; strcpy(LocalName, name); this->FileNameList.push_back(LocalName); - this->Modified(); delete[] LocalName; + this->Modified(); } /* @@ -127,95 +133,100 @@ void vtkGdcmReader::SetFileName(const char *name) */ void vtkGdcmReader::ExecuteInformation() { - this->TotalNumberOfPlanes = this->CheckFileCoherence(); - if ( this->TotalNumberOfPlanes == 0) + if(this->MTime>this->fileTime) { - vtkErrorMacro("File set is not coherent. Exiting..."); - return; - } + this->TotalNumberOfPlanes = this->CheckFileCoherence(); + 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->DataExtent[4] = this->DataVOI[4]; - this->DataExtent[5] = this->DataVOI[5]; - } - - // When the user has set the VOI, check it's coherence with the file content. - if (this->DataVOI[0] || this->DataVOI[1] || - this->DataVOI[2] || this->DataVOI[3] || - this->DataVOI[4] || this->DataVOI[5]) - { - if ((this->DataVOI[0] < 0) || - (this->DataVOI[1] >= this->NumColumns) || - (this->DataVOI[2] < 0) || - (this->DataVOI[3] >= this->NumLines) || - (this->DataVOI[4] < 0) || - (this->DataVOI[5] >= this->TotalNumberOfPlanes )) + // 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])) { - vtkWarningMacro("The requested VOI is larger than expected extent."); - this->DataVOI[0] = 0; - this->DataVOI[1] = this->NumColumns - 1; - this->DataVOI[2] = 0; - this->DataVOI[3] = this->NumLines - 1; - this->DataVOI[4] = 0; - this->DataVOI[5] = this->TotalNumberOfPlanes - 1; + this->DataExtent[4] = this->DataVOI[4]; + this->DataExtent[5] = this->DataVOI[5]; } - } - // Positionate the Extent. - this->DataExtent[0] = 0; - this->DataExtent[1] = this->NumColumns - 1; - this->DataExtent[2] = 0; - this->DataExtent[3] = this->NumLines - 1; - this->DataExtent[4] = 0; - this->DataExtent[5] = this->TotalNumberOfPlanes - 1; + // When the user has set the VOI, check it's coherence with the file content. + if (this->DataVOI[0] || this->DataVOI[1] || + this->DataVOI[2] || this->DataVOI[3] || + this->DataVOI[4] || this->DataVOI[5]) + { + if ((this->DataVOI[0] < 0) || + (this->DataVOI[1] >= this->NumColumns) || + (this->DataVOI[2] < 0) || + (this->DataVOI[3] >= this->NumLines) || + (this->DataVOI[4] < 0) || + (this->DataVOI[5] >= this->TotalNumberOfPlanes )) + { + vtkWarningMacro("The requested VOI is larger than expected extent."); + this->DataVOI[0] = 0; + this->DataVOI[1] = this->NumColumns - 1; + this->DataVOI[2] = 0; + this->DataVOI[3] = this->NumLines - 1; + this->DataVOI[4] = 0; + this->DataVOI[5] = this->TotalNumberOfPlanes - 1; + } + } + + // Positionate the Extent. + this->DataExtent[0] = 0; + this->DataExtent[1] = this->NumColumns - 1; + this->DataExtent[2] = 0; + this->DataExtent[3] = this->NumLines - 1; + this->DataExtent[4] = 0; + this->DataExtent[5] = this->TotalNumberOfPlanes - 1; - // We don't need to positionate the Endian related stuff (by using - // this->SetDataByteOrderToBigEndian() or SetDataByteOrderToLittleEndian() - // since the reading of the file is done by gdcm. - // But we do need to set up the data type for downstream filters: - if ( ImageType == "8U" ) - { - vtkDebugMacro("8 bits unsigned image"); - this->SetDataScalarTypeToUnsignedChar(); - } - else if ( ImageType == "8S" ) - { - vtkErrorMacro("Cannot handle 8 bit signed files"); - return; - } - else if ( ImageType == "16U" ) - { - vtkDebugMacro("16 bits unsigned image"); - this->SetDataScalarTypeToUnsignedShort(); - } - else if ( ImageType == "16S" ) - { - vtkDebugMacro("16 bits signed image"); - this->SetDataScalarTypeToShort(); - //vtkErrorMacro("Cannot handle 16 bit signed files"); - } - else if ( ImageType == "32U" ) - { - vtkDebugMacro("32 bits unsigned image"); - vtkDebugMacro("WARNING: forced to signed int !"); - this->SetDataScalarTypeToInt(); - } - else if ( ImageType == "32S" ) - { - vtkDebugMacro("32 bits signed image"); - this->SetDataScalarTypeToInt(); - } - else if ( ImageType == "FD" ) - { - vtkDebugMacro("64 bits Double image"); - this->SetDataScalarTypeToDouble(); + // We don't need to positionate the Endian related stuff (by using + // this->SetDataByteOrderToBigEndian() or SetDataByteOrderToLittleEndian() + // since the reading of the file is done by gdcm. + // But we do need to set up the data type for downstream filters: + if ( ImageType == "8U" ) + { + vtkDebugMacro("8 bits unsigned image"); + this->SetDataScalarTypeToUnsignedChar(); + } + else if ( ImageType == "8S" ) + { + vtkErrorMacro("Cannot handle 8 bit signed files"); + return; + } + else if ( ImageType == "16U" ) + { + vtkDebugMacro("16 bits unsigned image"); + this->SetDataScalarTypeToUnsignedShort(); + } + else if ( ImageType == "16S" ) + { + vtkDebugMacro("16 bits signed image"); + this->SetDataScalarTypeToShort(); + //vtkErrorMacro("Cannot handle 16 bit signed files"); + } + else if ( ImageType == "32U" ) + { + vtkDebugMacro("32 bits unsigned image"); + vtkDebugMacro("WARNING: forced to signed int !"); + this->SetDataScalarTypeToInt(); + } + else if ( ImageType == "32S" ) + { + vtkDebugMacro("32 bits signed image"); + this->SetDataScalarTypeToInt(); + } + else if ( ImageType == "FD" ) + { + vtkDebugMacro("64 bits Double image"); + this->SetDataScalarTypeToDouble(); + } + //Set number of scalar components: + this->SetNumberOfScalarComponents(this->NumComponents); + + this->fileTime=this->MTime; } - //Set number of scalar components: - this->SetNumberOfScalarComponents(this->NumComponents); this->Superclass::ExecuteInformation(); } diff --git a/vtk/vtkGdcmReader.h b/vtk/vtkGdcmReader.h index 84f6526d..32fc2fd0 100644 --- a/vtk/vtkGdcmReader.h +++ b/vtk/vtkGdcmReader.h @@ -18,9 +18,9 @@ public: vtkTypeMacro(vtkGdcmReader, vtkImageReader); void PrintSelf(ostream& os, vtkIndent indent); - void RemoveAllFileName(void); - void AddFileName(const char* name); - void SetFileName(const char *name); + virtual void RemoveAllFileName(void); + virtual void AddFileName(const char* name); + virtual void SetFileName(const char *name); vtkGetObjectMacro(LookupTable,vtkLookupTable); protected: @@ -28,9 +28,9 @@ protected: ~vtkGdcmReader(); virtual void ExecuteInformation(); - void ExecuteData(vtkDataObject *output); - void BuildFileListFromPattern(); - int CheckFileCoherence(); + virtual void ExecuteData(vtkDataObject *output); + virtual void BuildFileListFromPattern(); + virtual int CheckFileCoherence(); private: void RemoveAllInternalFileName(void); @@ -44,6 +44,7 @@ private: // Variables vtkLookupTable *LookupTable; + vtkTimeStamp fileTime; //BTX // Number of columns of the image/volume to be loaded -- 2.45.1