[vtkusers] Need example on Custom Reader where Data extent is different than update extent
Mike Jackson
imikejackson at gmail.com
Mon Feb 11 11:43:32 EST 2008
I am trying to write a custom reader (for paraview integration) and I
think I am having a misunderstanding with some of the vtk
terminology. Here is the basics for the reader.
The data contained in the data file is just a stack of images, each
of which is 7334 x 8446. There are about 100 to 200 slices. trying to
load all that data into memory is going to be a problem on "normal"
desktop pc so I am trying to load a subvolume. The problem I am
running into is that the RequestData method is being called 6 times
in a row. I already checked that the Modified times are not changing
and I am not calling any of my "Set_()" methods during the RequestData
() method.
So say I want a sub volume of 1296 x 968 x 2 pixels. This
subvolume should be cut out beginning at the 0,0,100 pixel from the
original data. How would I write my RequestInformation() and
RequestData() methods? Should I also be implementing
RequestUpdateExtent in my custom Reader? Do I need to set the
WholeExtent on the outinfo? Do I need to set the UpdateExtent for the
outInfo? Ideally, we would like the user to use a UI to set the VOI
and then the RequestData act upon the newly set VOI to determine what
subvolume to extract.
currently I have the following for RequestInformation()
//
------------------------------------------------------------------------
-----
vtkTypeInt32 vtkH5RoboMetReader::RequestInformation2(vtkInformation
*vtkNotUsed(request),
vtkInformationVector
**vtkNotUsed(inputVector),
vtkInformationVector
*outputVector)
{
std::cout << "#--- RequestInformation Start... " << std::endl;
int newFile = (vtkH5RoboMetReader::StringsEqual(this->FileName,
this->CurrentFileName) == 0);
if ( !newFile ) //The file has NOT changed
{
return 1;
}
this->SetCurrentFileName(this->GetFileName());
vtkInformation* outInfo = outputVector->GetInformationObject(0);
vtkTypeInt32 error = this->loadInformationFromMXAFile();
if (error < 0)
{
return 0; // Return error Code
}
// Set Data Spacing and Origin
this->DataOrigin[2] = static_cast<double>(this->StartSlice);
outInfo->Set( vtkDataObject::ORIGIN(), this->DataOrigin, 3 );
// Calculate data spacing using conversion factor, slice thickness,
and slice increment.
// Store this in the DataSpacing data member and then add it to the
info object.
// Spacing in x and y becomes the scaling factor ( number of microns
per pixel ) and
// spacing in z becomes the spacing in microns between slices which
should be the value
// of SliceThickness.
this->DataSpacing[0] = this->DataSpacing[1] = 1.0; //this-
>ScalingFactor;
this->DataSpacing[2] = 1.0; //this->SliceThickness;
outInfo->Set( vtkDataObject::SPACING(), this->DataSpacing, 3 );
this->GetOutput()->SetScalarType(VTK_TYPE_UINT8);
this->GetOutput()->SetNumberOfScalarComponents( 1);
this->GetOutput()->GetPointData()->GetScalars()->SetName("RoboMet
Voxels");
this->GetOutput()->GetPointData()->SetActiveScalars("RoboMet
Voxels");
//Set the DataExtent info
std::cout<<"DataExtent ("<<this->DataExtent[0]<<", "<<this->DataExtent
[1]<<", "<<this->DataExtent[2]<<", "<<
this->DataExtent[3]<<", "<<this->DataExtent[4]<<", "<<this-
>DataExtent[5]<<")"<<std::endl;
VOI[0] = 0;
VOI[1] = 1291;
VOI[2] = 0;
VOI[3] = 967;
VOI[4] = 100;
VOI[5] = 100;
outInfo->Set( vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), this-
>DataExtent, 6 );
std::cout << "#--- RequestInformation End" << std::endl;
return 1;
}
Currently I have the following for RequestData:
//----------------------------------------------------------------------
-------------
vtkTypeInt32 vtkH5RoboMetReader::RequestData( vtkInformation*
vtkNotUsed(request),
vtkInformationVector** vtkNotUsed(inputVector),
vtkInformationVector* outputVector )
{
std::cout << "\n**--- RequestData Starting \tTimes="<<++loop_count <<
" Modified Time: " << this->MTime.GetMTime() << std::endl;
vtkDebugMacro( << "Entering RequestData method");
if (NULL == this->FileName) {
vtkDebugMacro( << "FileName must be specified");
return 0;
}
vtkInformation* outInfo = outputVector->GetInformationObject(0);
vtkImageData* output = vtkImageData::SafeDownCast(outInfo->Get
(vtkDataObject::DATA_OBJECT()));
vtkTypeInt32 requestedExtent[6];
VOI[0] = 0;
VOI[1] = 1291;
VOI[2] = 0;
VOI[3] = 967;
VOI[4] = 100;
VOI[5] = 101;
vtkTypeInt32 error = 1;
//Read the file and load up the top left "corner" of data
error = loadSingleFrame(outInfo, output, this->VOI);
std::cout << "**----RequestData Ending" << " Modified Time: " << this-
>MTime.GetMTime() << std::endl;
return error;
}
--
Mike Jackson
imikejackson & gmail * com
More information about the vtkusers
mailing list