[vtkusers] correct way of reusing filters in loop

John Platt jcplatt at dsl.pipex.com
Fri Jan 9 18:51:00 EST 2009


Hi Marcel,

Each time Update() is called within the loop, any previous output from
the threshold + geometry filters will be cleared. At the end of the loop
the append filter only has 1 input with data based on the threshold at
the last iteration.

If you want to save the output from each iteration, try something like

for(...){
	threshold->ThresholdBetween(*it,*it);
	vtkPolyData* gfOut = vtkPolyData::New();
	gf->SetOutput( gfOut );
	gfOut->Delete();
	append->SetInput(gf->GetOutput());
	gf->Update();
	... 
}

At the end of the loop the append filter should have multiple inputs
with the data from each threshold change saved in all the new gfOut's
that have been created.

HTH

John.

-----Original Message-----
From: c674332 at web.de [mailto:c674332 at web.de] 
Sent: 09 January 2009 18:17
To: John Platt
Subject: RE: [vtkusers] correct way of reusing filters in loop

Hi,

thanks for your reply! I liked your idea, but it seems that whenever
creating the pipeline from outside of the loop only the data with the
first *it will be appended. It seems to be a problem with the append
filter, because I checked the number of cells in the output of the
threshold filter and it changed in every loop, same applies to the
geometry filter.

Anyway, I am glad you replied because it really helped me understanding
the pipeline concept of vtk.

Best wishes

Marcel


On Wed, 2009-01-07 at 14:01 +0000, John Platt wrote:
> Hi,
> 
> Try creating the pipeline once only, outside of the loop -
> 
> vtkThreshold* threshold = vtkThreshold::New();
> threshold->SetInput(ug);
> vtkGeometryFilter* gf = new vtkGeometryFilter::New();
> gf->SetInput(threshold->GetOutput());
> vtkAppendPolyData* append = vtkAppendPolyData::New();
> append->SetInput(gf->GetOutput());
> 
> In your loop just change the filter parameters -
> 
> for(...){
> 	threshold->ThresholdBetween(*it,*it);
> 	append->Update();
> 	... 
> }
> 
> append->Delete();
> gf->Delete();
> threshold->Delete();
> 
> 
> HTH
> 
> John.
> 
> -----Original Message-----
> From: vtkusers-bounces at vtk.org [mailto:vtkusers-bounces at vtk.org] On
> Behalf Of c674
> Sent: 07 January 2009 11:32
> To: vtkusers at vtk.org
> Subject: [vtkusers] correct way of reusing filters in loop
> 
> 
> Hi,
> 
> this works fine, but it is slow and messy, because I create new
> vtkThreshold and vtkGeometryFilter every loop:
> 
> vtkAppendPolyData* append = vtkAppendPolyData::New();
> for(...){
> vtkThreshold* threshold = vtkThreshold::New();
> threshold->SetInput(ug);
> threshold->ThresholdBetween(*it,*it);
> threshold->Update();
> vtkGeometryFilter* gf = new vtkGeometryFilter::New();
> gf->SetInput(threshold->GetOutput());
> gf->Update();
> append->SetInput(gf->GetOutput());
> append->Update();
> vtkUnstructuredGrid* tug = threshold->GetOutput();
> if(tug->GetNumberOfCells() < 5) ...
> ...
> gf->Delete();
> threshold->Delete();
> }
> 
> Therefore I would rather do this:
> 
> vtkAppendPolyData* append = vtkAppendPolyData::New();
> vtkThreshold* threshold = vtkThreshold::New();
> vtkGeometryFilter* gf = vtkGeometryFilter::New();
> threshold->SetReleaseFlagOn();
> gf->SetReleaseFlagOn();
> for(...){
> threshold->SetInput(ug);
> threshold->ThresholdBetween(*it,*it);
> threshold->Update();
> gf->SetInput(threshold->GetOutput());
> gf->Update();
> append->SetInput(gf->GetOutput());
> append->Update();
> vtkUnstructuredGrid* tug = threshold->GetOutput();
> if(tug->GetNumberOfCells() < 5) ...
> ...
> tug->Register(0);
> tug->SetSource(0);
> tug->Delete();
> }
> threshold->Delete();
> gf->Delete();
> 
> But this gives me errors:
> ERROR: In /build/buildd/vtk-5.0.3/Filtering/vtkImageData.cxx, line
1450
> vtkImageData (0xb52293c8): GetScalarPointer: Pixel (123, 0, 42) not in
> memory.
>  Current extent= (0, 49, 0, 49, 0, 49)
> 
> and if I only create the threshold every loop I don't get errors, but
> the
> results are strange.
> My guess is, that the results from the former loop are not thrown
away,
> but
> kept and the new results are only added to them or so. How do I reuse
> these
> filters correctly?
> 
> Thanks in advance!
> 






More information about the vtkusers mailing list