[Paraview] Custom plugin reader with time series

Dominik Szczerba domi at vision.ee.ethz.ch
Sun May 11 04:31:21 EDT 2008


OK so this is basically about reading the series myself explicitly. But 
one thing is not clear to me: I am deriving my readers from 
vtkDataReader, after UnstructuredGridReader and StructuredPointsReader, 
who can read time series somehow, so this functionality must be already 
in somewhere (upstream). There is no explicit time series handling in 
those classes and yet they work, so why mine do not? I can see that you 
do derive your reader from vtkUnstructuredGridAlgorithm, and not 
vtkDataReader, why? I wonder if I really have to re-implement it and if 
there is no simpler way to achieve the goal, like taking advantage of 
some existing functionality.
Thanks, Dominik

Mike Jackson wrote:
> 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
>> _______________________________________________

-- 
Dominik Szczerba, Ph.D.
Computer Vision Lab CH-8092 Zurich
http://www.vision.ee.ethz.ch/~domi


More information about the ParaView mailing list