+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 <Eric.Boix@creatis.insa-lyon.fr>
* 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 <Eric.Boix@creatis.insa-lyon.fr>
* 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)
// 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.
void vtkGdcmReader::RemoveAllFileName(void)
{
this->FileNameList.clear();
+ this->Modified();
}
/*
char * LocalName = new char[strlen(name) + 1];
strcpy(LocalName, name);
this->FileNameList.push_back(LocalName);
- this->Modified();
delete[] LocalName;
+ this->Modified();
}
/*
*/
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();
}