]> Creatis software - gdcm.git/commitdiff
* vtk/vtkGdcmReader.[h|cxx] : fix the read of 3 gdcmHeader when making an
authorregrain <regrain>
Tue, 30 Mar 2004 08:20:58 +0000 (08:20 +0000)
committerregrain <regrain>
Tue, 30 Mar 2004 08:20:58 +0000 (08:20 +0000)
       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
vtk/vtkGdcmReader.cxx
vtk/vtkGdcmReader.h

index 4b26701c724d2772cecbe9441b09d23d2d7dea27..61e8b5544bbe7ac6b3409ab6092e3d966a58b282 100644 (file)
--- 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 <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)
 
index 5fb33b226fca53838fb756a767a7a003527c62a8..1e3f9a21ee6717a8c62c6e5088f860d87df39774 100644 (file)
 //  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();
 }
index 84f6526df5284db27068c828762588ca0390083f..32fc2fd0994a53e046328281d048fc35096104b6 100644 (file)
@@ -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