X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vtk%2FvtkGdcmReader.cxx;h=1e3f9a21ee6717a8c62c6e5088f860d87df39774;hb=b178cc9e1efeff5116c138ac66beaf0235d8c09a;hp=89ff5dc0dec821835bfda402993df1448c810520;hpb=72911a1e847536580a21f85f211c0a14cdcf944c;p=gdcm.git diff --git a/vtk/vtkGdcmReader.cxx b/vtk/vtkGdcmReader.cxx index 89ff5dc0..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(); } @@ -581,7 +592,7 @@ size_t vtkGdcmReader::LoadImageInMemory( size_t size; // If the data structure of vtk for image/volume representation - // were straigthforwards the following would suffice: + // were straigthforwards the following would be enough: // GdcmFile.GetImageDataIntoVector((void*)Dest, size); // But vtk chooses to invert the lines of an image, that is the last // line comes first (for some axis related reasons?). Hence we need