-//----------------------------------------------------------------------------
-// Update => ouput->Update => UpdateData => Execute => ExecuteData
-// (see vtkSource.cxx for last step).
-// This function (redefinition of vtkImageReader::ExecuteData, see
-// VTK/IO/vtkImageReader.cxx) reads a data from a file. The datas
-// extent/axes are assumed to be the same as the file extent/order.
-void vtkGdcmReader::ExecuteData(vtkDataObject *output)
-{
- if (this->InternalFileNameList.empty())
- {
- vtkErrorMacro("A least a valid FileName must be specified.");
- return;
- }
-
- // FIXME : extraneous parsing of header is made when allocating OuputData
- vtkImageData *data = this->AllocateOutputData(output);
- data->SetExtent(this->DataExtent);
- data->GetPointData()->GetScalars()->SetName("DicomImage-Volume");
-
- // Test if output has valid extent
- // Prevent memory errors
- if((this->DataExtent[1]-this->DataExtent[0]>=0) &&
- (this->DataExtent[3]-this->DataExtent[2]>=0) &&
- (this->DataExtent[5]-this->DataExtent[4]>=0))
- {
- // The memory size for a full stack of images of course depends
- // on the number of planes and the size of each image:
- size_t StackNumPixels = this->NumColumns * this->NumLines
- * this->TotalNumberOfPlanes * this->NumComponents;
- size_t stack_size = StackNumPixels * this->PixelSize;
- // Allocate pixel data space itself.
- unsigned char *mem = new unsigned char [stack_size];
-
- // Variables for the UpdateProgress. We shall use 50 steps to signify
- // the advance of the process:
- unsigned long UpdateProgressTarget = (unsigned long) ceil (this->NumLines
- * this->TotalNumberOfPlanes
- / 50.0);
- // The actual advance measure:
- unsigned long UpdateProgressCount = 0;
-
- // Feeling the allocated memory space with each image/volume:
- unsigned char * Dest = mem;
- for (std::list<std::string>::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
-
- // The "size" of the vtkScalars data is expressed in number of points,
- // and is not the memory size representing those points:
- data->GetPointData()->GetScalars()->SetVoidArray(mem, StackNumPixels, 0);
- //don't know why it's here, it's calling one more time ExecuteInformation:
- //this->Modified();
- }
-}
-
-//----------------------------------------------------------------------------
-void vtkGdcmReader::PrintSelf(ostream& os, vtkIndent indent)
-{
- vtkImageReader::PrintSelf(os,indent);
- os << indent << "Filenames : " << endl;
- vtkIndent nextIndent = indent.GetNextIndent();
- for (std::list<std::string>::iterator FileName = FileNameList.begin();
- FileName != FileNameList.end();
- ++FileName)
- {
- os << nextIndent << FileName->c_str() << endl ;
- }
-}