[Paraview] Custom plugin reader with time series

Mike Jackson imikejackson at gmail.com
Sat May 10 09:15:05 EDT 2008


Take a look at <http://titanium.imts.us/viewvc/Task_4/PVDislocation/src/DislocationReaders/vtkPrdsMultiOutDislocationReader.cxx?view=markup>
 to see how I did a time series reader.

Basically in RequestInformation  you will need to determine the the
range of times that your data covers, probably by opening each file or
some other means. Then set
    double timeRange[2];
    timeRange[0] = lowestTimeValue
    timeRange[1] = highesetTimeValue
    outInfo->Set(vtkStreamingDemandDrivenPipeline::TIME_RANGE(),
timeRange, 2);

Also, you will need to have the following in your header:

   vtkSetMacro(TimeStep, int);
   vtkGetMacro(TimeStep, int);

 int GetNumberOfTimeSteps();

Now, down in the RequestData() Method you can get the requested time
step from the
pipeline and then open and read the data from the proper data file.

int tsLength = outInfo->Length(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
  double* steps = outInfo->Get(vtkStreamingDemandDrivenPipeline::TIME_STEPS());
  // Check if a particular time was requested.
  if(outInfo->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS()))
  {
    // Get the requested time step. We only supprt requests of a single time
    // step in this reader right now
    double *requestedTimeSteps =
outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEPS());
    this->TimeValue = requestedTimeSteps[0];

    // find the first time value larger than requested time value
    // this logic could be improved
    int cnt = 0;
    while (cnt < tsLength-1 && steps[cnt] < this->TimeValue)
      {
      cnt++;
      }
    this->ActualTimeStep = cnt;
  }

  if (this->TimeStep > -1)
  {
    this->ActualTimeStep = this->TimeStep;
  }

  if (this->ActualTimeStep >= this->TimeStepRange[0] &&
this->ActualTimeStep <= this->TimeStepRange[1]) {
    vtkSmartPointer<DislocationReader> reader =
vtkSmartPointer<DislocationReader>::New();
    reader->SetFileName(this->FileName);
    reader->SetTimeStep(this->ActualTimeStep);
    //reader->SetInformationVector(outputVector);
    reader->SetFileOffsets(this->FileOffsets);
    reader->read();
    vtkUnstructuredGrid* grid;
    grid = reader->GetDislocations();
    dislocations->ShallowCopy(grid);

   // dislocations->SetBlock(0, grid);    // Block 0 is the Dislocation Data
    grid = reader->GetSimulationBox();
    simBox->ShallowCopy(grid);
    //dislocations->SetBlock(1, grid); // Block 1 is the Simulation Limits
  } else {
      std::cout << "vtkPrdsMultiOutDislocationReader: Timestep was out
of Range: " << this->ActualTimeStep << std::endl;
      std::cout << "vtkPrdsMultiOutDislocationReader: Timestep Range:"
<< this->TimeStepRange[0] << " -> " << this->TimeStepRange[1] <<
std::endl;
      return 0;
  }


This code is specific to my case where I have a whole separate reader
for my data where I feed it the name of the file to read and then tell
it to read the file and get the output. This may also be the case for
you also.

Hope some of the helps.

Mike

On Sat, May 10, 2008 at 6:03 AM, Dominik Szczerba
<domi at vision.ee.ethz.ch> wrote:
> Hi,
> I have successfully implemented a reader for my data as a PV plugin. It
> loads separate files correctly, refuses, however, to read the whole series
> (file_01.h5, file_02.h5, etc.). How do I go about achieving the same effect
> as the native readers to have a series as transient data?
> Thanks for any hints.
> --
> Dominik Szczerba, Ph.D.
> Computer Vision Lab CH-8092 Zurich
> http://www.vision.ee.ethz.ch/~domi
> _______________________________________________


More information about the ParaView mailing list