+ if ( CoherentFileList != 0 ) // When a list of names is passed
+ {
+ if (this->CoherentFileList->empty())
+ {
+ vtkErrorMacro(<< "Coherent File List must have at least a valid File*.");
+ return;
+ }
+ }
+ else 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; //not used
+ // Allocate pixel data space itself.
+
+ // 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;
+
+ // Filling the allocated memory space with each image/volume:
+
+ unsigned char *Dest = (unsigned char *)data->GetScalarPointer();
+
+ if ( CoherentFileList == 0 ) // When a list of names is passed
+ {
+ 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
+
+ }
+ else // when a Coherent File List is passed
+ {
+ for (std::vector<gdcm::File* >::iterator it = CoherentFileList->begin();
+ it != CoherentFileList->end();
+ ++it)
+ {
+
+ //std::cout <<"----------------- " << (*it)->GetFileName() << std::endl;
+
+ Dest += this->LoadImageInMemory(*it, Dest,
+ UpdateProgressTarget,
+ UpdateProgressCount);
+ // Update progress related for bad files:
+ UpdateProgressCount += this->NumLines;
+ if (UpdateProgressTarget > 0)
+ {
+ if (!(UpdateProgressCount%UpdateProgressTarget))
+ {
+ this->UpdateProgress(UpdateProgressCount/(50.0*UpdateProgressTarget));
+ }
+ }
+ } // Loop on files
+
+ }
+ }