[vtk-developers] Bug in vtkCompositeDataPipeline?

Bill McGrory mcgrory at aerosft.com
Fri May 26 10:59:44 EDT 2006


On Fri, 2006-05-26 at 10:32 -0400, Jeff Lee wrote:
> 
> Bill McGrory wrote:
> > I'm not sure I understand what you're saying.
> > I understand that vtkStructuredGridOutlineFilter only accepts
> > vtkStructuredGrid as input.
> >
> >
> > It is my understanding that vtkMultiGroupDataGeometryFilter handles the
> > the case of a simple filter, and sends the children of a
> > multigroupdataset one at a time. I don't think the problem is with the
> > pipeline after the dataset, but with the pipeline getting the data from
> > a source.
> >   
> I guess I got confused, does this all work when you manually create the 
> sgrids, and fails when you try to use the source?  I thought that 
> neither way would work because you are setting the input of the 
> StructuredGridOutlineFilter which doesn't handle MultiBlockDataSets at all.
> -J

Yes, that's correct. It's an issue of the source/no source.
As Berk suggested in another post, I'm going to try to write a Filter to
create my multiblockdataset, and get it to work correctly with the new
pipeline.

> > I'm attaching my test code.
> > there is a #if loop on line 113 used to switch back and forth.
> >
> >
> > On Fri, 2006-05-26 at 08:45 -0400, Jeff Lee wrote:
> >   
> >> So is this right, you are setting the input of the 
> >> vtkStructuredGridOutlineFilter  with a vtkMultiBlockDataSet?  If not, 
> >> can you post a prototype pipeline?  vtkStructuredGridOutlineFilter 
> >> doesn't accept any input other than vtkStructuredGrid.  
> >> FillInputPortInformation could take a dataset and do the appropriate 
> >> thing for a multiblock dataset consisting of structured grids, or just 
> >> process the structured grids.  But this should probably be another 
> >> filter along the lines of vtkMultiGroupDataGeometryFilter... 
> >> -Jeff
> >>
> >> Bill McGrory wrote:
> >>     
> >>> Yes, that is correct.
> >>> I have two datasets constructed from two custom sources.
> >>> I put these two datasets into a multiblock dataset.
> >>>
> >>> multiblock dataset is then fed to a structuredgridoutline filter.
> >>>
> >>> this is fed to a vtkMultiGroupDataGeometry filter and mapped.
> >>>
> >>> Before adding the patches listed below, the vtkStructuredGridSource
> >>> never receives a ExecuteData call.
> >>>
> >>> If I fill the two datasets by hand, before adding them to the multiblock
> >>> dataset then everything works as expected.
> >>>
> >>> Likewise, if I simply feed the vtkStructuredGridSource->GetOutput()
> >>> directly to the Outline filter (bypass the multiblock dataset) then the
> >>> source correctly gets the ExecuteData call as well.
> >>>
> >>> Regards
> >>> Bill
> >>>  
> >>> On Thu, 2006-05-25 at 16:55 -0400, Berk Geveci wrote:
> >>>   
> >>>       
> >>>> I am not sure I understand. You have a few datasets, you add these to
> >>>> a multiblock dataset, you process this multiblock dataset with a
> >>>> filter. Is that right?
> >>>>
> >>>> On 5/25/06, Bill McGrory <mcgrory at aerosft.com> wrote:
> >>>>         I've been trying to get a
> >>>>         vtkMultiBlockDataSet to work properly with vtkStructuredGrid's
> >>>>         which are
> >>>>         output from a vtkStructuredGridSource
> >>>>         
> >>>>         >From what I can tell, it appears that the
> >>>>         the  vtkCompositeDataPipeline 
> >>>>         is unaware of child vtkDataObject->Source, so none of the data
> >>>>         ever gets
> >>>>         loaded.
> >>>>         
> >>>>         I have constructed a work-around which appears (superficially
> >>>>         at least)
> >>>>         to work for my particular case, which is basically, if a
> >>>>         Source exists 
> >>>>         for the original vtkDataObject in the *ForBlock() routines,
> >>>>         call the
> >>>>         relevant Update's before performing the ShallowCopy
> >>>>         
> >>>>         patch is as follows
> >>>>         
> >>>>         Index: vtkCompositeDataPipeline.cxx
> >>>>         =================================================================== 
> >>>>         RCS
> >>>>         file: /cvsroot/VTK/VTK/Filtering/vtkCompositeDataPipeline.cxx,v
> >>>>         retrieving revision 1.34
> >>>>         diff -u -r1.34 vtkCompositeDataPipeline.cxx
> >>>>         --- vtkCompositeDataPipeline.cxx        7 Dec 2005 16:21:29
> >>>>         -0000       1.34
> >>>>         +++ vtkCompositeDataPipeline.cxx        25 May 2006 19:48:48
> >>>>         -0000
> >>>>         @@ -35,6 +35,8 @@
> >>>>         #include "vtkStructuredGrid.h"
> >>>>         #include "vtkUniformGrid.h"
> >>>>         
> >>>>         +#include "vtkSource.h" 
> >>>>         +
> >>>>         vtkCxxRevisionMacro(vtkCompositeDataPipeline, "$Revision: 1.34
> >>>>         $");
> >>>>         vtkStandardNewMacro(vtkCompositeDataPipeline);
> >>>>         
> >>>>         @@ -46,6 +48,28 @@
> >>>>         
> >>>>         vtkInformationKeyMacro(vtkCompositeDataPipeline,INPUT_REQUIRED_COMPOSITE_DATA_TYPE, String); 
> >>>>         vtkInformationKeyMacro(vtkCompositeDataPipeline,UPDATE_BLOCKS,
> >>>>         ObjectBase);
> >>>>         
> >>>>         +class vtkCompositeDataPipelineToDataObjectFriendship
> >>>>         +{
> >>>>         +public:
> >>>>         +  static void UpdateDataObject(vtkDataObject* obj)
> >>>>         +    {
> >>>>         +               if(obj->Source)
> >>>>         +               {
> >>>>         +                       obj->Source->Update();
> >>>>         +               }
> >>>>         +
> >>>>         +    }
> >>>>         +
> >>>>         +  static void UpdateInformation(vtkDataObject* obj)
> >>>>         +    {
> >>>>         +               if(obj->Source)
> >>>>         +               {
> >>>>         +                       obj->Source->UpdateInformation();
> >>>>         +               }
> >>>>         +
> >>>>         +    }
> >>>>         +};
> >>>>         +
> >>>>         //---------------------------------------------------------------------------- 
> >>>>         vtkCompositeDataPipeline::vtkCompositeDataPipeline()
> >>>>         {
> >>>>         @@ -490,6 +514,7 @@
> >>>>                  info->Get(vtkDataObject::DATA_OBJECT());
> >>>>                if (dobj && dobjCopy)
> >>>>                  {
> >>>>         +
> >>>>         vtkCompositeDataPipelineToDataObjectFriendship::UpdateInformation(dobj); 
> >>>>                  dobjCopy->ShallowCopy(dobj);
> >>>>                  dobjCopy->CopyInformation(dobj);
> >>>>                  }
> >>>>         @@ -1089,6 +1114,7 @@
> >>>>         
> >>>>                  if (dobj && dobjCopy)
> >>>>                    {
> >>>>         +
> >>>>         vtkCompositeDataPipelineToDataObjectFriendship::UpdateDataObject(dobj); 
> >>>>                    dobjCopy->ShallowCopy(dobj);
> >>>>                    }
> >>>>                  }
> >>>>         
> >>>>         
> >>>>         Is this really a bug, and is this an appropriate fix?
> >>>>         Or am I doing something wrong up the pipeline, such that I
> >>>>         shouldn't
> >>>>         need to do this? 
> >>>>         
> >>>>         Regards
> >>>>         Bill
> >>>>         _______________________________________________
> >>>>         vtk-developers mailing list
> >>>>         vtk-developers at vtk.org
> >>>>         http://www.vtk.org/mailman/listinfo/vtk-developers
> >>>>
> >>>>     
> >>>>         
> >>> _______________________________________________
> >>> vtk-developers mailing list
> >>> vtk-developers at vtk.org
> >>> http://www.vtk.org/mailman/listinfo/vtk-developers
> >>>
> >>>
> >>>   
> >>>       
> >
> >   
> > ------------------------------------------------------------------------
> >
> > /*=========================================================================
> >
> >   Program:   Visualization Toolkit
> >   Module:    $RCSfile: SGrid.cxx,v $
> >
> >   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
> >   All rights reserved.
> >   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
> >
> >      This software is distributed WITHOUT ANY WARRANTY; without even
> >      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
> >      PURPOSE.  See the above copyright notice for more information.
> >
> > =========================================================================*/
> > // This example shows how to manually create a structured grid.
> > // The basic idea is to instantiate vtkStructuredGrid, set its dimensions,
> > // and then assign points defining the grid coordinate. The number of
> > // points must equal the number of points implicit in the dimensions
> > // (i.e., dimX*dimY*dimZ). Also, data attributes (either point or cell)
> > // can be added to the dataset.
> > //
> > // 
> > #include "vtkActor.h"
> > #include "vtkCamera.h"
> > #include "vtkCommand.h"
> > #include "vtkFloatArray.h"
> > #include "vtkHedgeHog.h"
> > #include "vtkImageActor.h"
> > #include "vtkImageMapToColors.h"
> > #include "vtkInteractorStyleTrackballCamera.h"
> > #include "vtkMath.h"
> > #include "vtkPoints.h"
> > #include "vtkPointData.h"
> > #include "vtkPolyData.h"
> > #include "vtkPolyDataMapper.h"
> > #include "vtkPolyDataNormals.h"
> > #include "vtkProperty.h"
> > #include "vtkRenderer.h"
> > #include "vtkRenderWindow.h"
> > #include "vtkRenderWindowInteractor.h"
> > #include "vtkStructuredGrid.h"
> > #include "vtkStructuredGridGeometryFilter.h"
> > #include "vtkStructuredGridOutlineFilter.h"
> > #include "vtkMultiBlockDataSet.h"
> > #include "vtkMultiGroupDataGeometryFilter.h"
> >
> > #include "vtkStructuredGridSource.h"
> > #include "vtkObjectFactory.h"
> > #include "vtkInformation.h"
> > #include "vtkInformationVector.h"
> > #include "vtkDemandDrivenPipeline.h"
> > #include "vtkStreamingDemandDrivenPipeline.h"
> > #include "vtkSource.h"
> >
> > // Define callbacks
> >
> >
> > void AllocGrid(vtkStructuredGrid *sgrid, float myoffset);
> >
> > class MyStructuredGridSource
> > 	:	public vtkStructuredGridSource
> > {
> >
> > public:
> > 	
> > 	vtkTypeRevisionMacro(MyStructuredGridSource,vtkStructuredGridSource);
> >
> > 	void PrintSelf(ostream& os, vtkIndent indent);
> >
> > 	static MyStructuredGridSource *New();
> >
> > 	virtual int 	ProcessRequest(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector);
> > 	
> > 	int			 	RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector);
> >
> > public:
> > 	
> > 	float myoffset;
> >
> > protected:  
> >
> > 	
> > 	MyStructuredGridSource();
> > 	~MyStructuredGridSource();
> >
> > 	virtual void 	ExecuteData (vtkDataObject *output);
> > 	
> > private:
> >
> > 	MyStructuredGridSource(const MyStructuredGridSource&);  // Not implemented.
> > 	void operator=(const MyStructuredGridSource&);  // Not implemented.
> >
> > };
> >
> > int
> > main( int argc, char *argv[] )
> > {
> > 	// Create a renderer.
> >
> > 	vtkRenderer *ren = vtkRenderer::New();
> >     ren->SetBackground(1,1,1);
> >     ren->TwoSidedLightingOn();
> >     ren->LightFollowCameraOn();
> >     ren->GetActiveCamera()->Elevation(30.0);
> >     ren->GetActiveCamera()->Azimuth(30.0);
> >     ren->GetActiveCamera()->Zoom(10.0);
> >
> > 	// Load two vtkStructuredGrid's into a multi-block dataset
> >
> > 	vtkMultiBlockDataSet* mb = vtkMultiBlockDataSet::New();
> >   
> >
> > #if 0
> >
> > 	// First way is to get the vtkStructureGrid from a custom vtkStructuredGridSource
> >
> > 	MyStructuredGridSource *sgridsrc0 = MyStructuredGridSource::New();
> > 	MyStructuredGridSource *sgridsrc1 = MyStructuredGridSource::New();
> >   
> > 	sgridsrc0->myoffset = 0.;
> > 	sgridsrc1->myoffset = 3.;
> >
> > 	vtkStructuredGrid *sgrid0 = sgridsrc0->GetOutput();
> > 	vtkStructuredGrid *sgrid1 = sgridsrc1->GetOutput();
> >
> > #else 
> >
> > 	// Second way is to simply create the sgrid's by hand
> >
> > 	vtkStructuredGrid *sgrid0 = vtkStructuredGrid::New();
> > 	vtkStructuredGrid *sgrid1 = vtkStructuredGrid::New();
> >   
> > 	AllocGrid(sgrid0, 0.);
> > 	AllocGrid(sgrid1, 3.);
> >
> > #endif
> >
> > 	mb->SetDataSet(0, 0, sgrid0);
> > 	mb->SetDataSet(1, 0, sgrid1);
> >
> > 	// Now put the sgrid's into a vtkStructuredGridOutlineFilter
> >
> > 	vtkStructuredGridOutlineFilter *oFilter = vtkStructuredGridOutlineFilter::New();
> > 	vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
> >
> > 	oFilter->SetInput(mb);
> >
> > 	vtkMultiGroupDataGeometryFilter *filter = vtkMultiGroupDataGeometryFilter::New();
> > 	filter->SetInputConnection(0, oFilter->GetOutputPort(0));
> > 	oFilter->Delete();
> > 		
> > 	mapper->SetInputConnection(0, filter->GetOutputPort(0));
> > 	filter->Delete();
> >
> > 	vtkActor* actor = vtkActor::New();
> > 	actor->SetMapper(mapper);
> > 	actor->GetProperty()->SetColor(0,0,0);
> >
> > 	ren->AddActor(actor);
> >
> > 	mapper->Delete();
> > 	actor->Delete();
> >
> > 	// Define the render window
> > 	vtkRenderWindow *renWin = vtkRenderWindow::New();
> > 	renWin->AddRenderer(ren);
> > 	renWin->SetSize(600,600);
> >
> > 	// Define a window interactor to move the scene around
> > 	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
> > 	iren->SetRenderWindow(renWin);
> >
> > 	// Set the interactor style to a trackball camera.
> > 	vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
> >     iren->SetInteractorStyle(style);
> >
> > 	// Interact with data
> >
> > 	renWin->Render();
> >
> >
> > 	iren->Initialize();
> > 	iren->Start();
> >
> > 	ren->Delete();
> > 	renWin->Delete();
> > 	iren->Delete();
> > 	style->Delete();
> >
> > 	return 0;
> >
> > }
> >
> >
> > vtkCxxRevisionMacro(MyStructuredGridSource, "$Revision: 0.1 $");
> >
> > vtkStandardNewMacro(MyStructuredGridSource);
> >
> > MyStructuredGridSource::MyStructuredGridSource()
> > 		:	vtkStructuredGridSource()
> > {
> > }
> >
> > MyStructuredGridSource::~MyStructuredGridSource()
> > {
> > }
> >
> > void
> > MyStructuredGridSource::PrintSelf(ostream& os, vtkIndent indent)
> > {
> > 	this->Superclass::PrintSelf(os, indent);
> > }
> >
> >
> > int
> > MyStructuredGridSource::ProcessRequest(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
> > {
> > 	if(request->Has(vtkDemandDrivenPipeline::REQUEST_INFORMATION())) {
> >
> > 		return this->RequestInformation(request, inputVector, outputVector);
> >
> >     } 
> >
> > 	return this->Superclass::ProcessRequest(request, inputVector, outputVector);
> > }
> >
> > int
> > MyStructuredGridSource::RequestInformation(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
> > {
> >
> > 	vtkInformation *outInfo = outputVector->GetInformationObject(0);
> >
> > 	int ext[6];
> > 	
> > 	ext[0] = 0;
> > 	ext[1] = 13;
> > 	ext[2] = 0;
> > 	ext[3] = 11;
> > 	ext[4] = 0;
> > 	ext[5] = 11;
> > 		
> > 	--ext[1];
> > 	--ext[3];
> > 	--ext[5];
> >
> > 	outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),
> > 				 ext, 6);
> > 		
> > 	return 1;
> > }
> >
> >
> >
> > void
> > MyStructuredGridSource::ExecuteData(vtkDataObject *output)
> > {
> >
> > 	vtkStructuredGrid *sgrid = vtkStructuredGrid::SafeDownCast(output);
> > 	
> > 	AllocGrid(sgrid,myoffset);
> >
> > }
> >
> >
> > void
> > AllocGrid(vtkStructuredGrid *sgrid, float myoffset)
> > {
> >   int i, j, k, kOffset, jOffset, offset;
> >   float x[3];
> >
> >   int dims[3]={13,11,11};
> >   
> >
> >   float radius, rMin=0.5, rMax=1.0, deltaRad;
> >   float theta, deltaZ;
> >
> >
> > 	sgrid->SetWholeExtent(0,dims[0]-1,0,dims[1]-1,0,dims[2]-1);
> > 	sgrid->SetDimensions(dims);
> >
> > 	// A 1-D array of grid points (r cos, r sin, z) where theta(i), r(j), z(k)
> >
> > 	vtkPoints *points = vtkPoints::New();
> >     points->Allocate(dims[0]*dims[1]*dims[2]);
> >
> > 	// Create a hemi-cylindrical grid
> >
> > 	deltaZ = 2.0 / (dims[2]-1);
> > 	deltaRad = (rMax-rMin) / (dims[1]-1);
> >
> > 	for (k=0; k<dims[2]; k++) {
> >
> > 		x[2] = myoffset -1.0 + k*deltaZ;
> > 		kOffset = k * dims[0] * dims[1];
> >
> > 		for (j=0; j<dims[1]; j++) {
> >
> > 			radius = rMin + j*deltaRad;
> > 			jOffset = j * dims[0];
> >
> > 			for (i=0; i<dims[0]; i++) {
> >
> > 				theta = i * 15.0 * vtkMath::DegreesToRadians();
> >
> > 				x[0] = radius * cos(theta);
> > 				x[1] = radius * sin(theta);
> >
> > 				offset = i + jOffset + kOffset;
> >
> > 				points->InsertPoint(offset,x);
> >
> > 			}
> > 		}
> > 	}
> >
> > 	// Set the grid points
> > 	sgrid->SetPoints(points);
> > 	points->Delete();
> > 	
> > }
> >   
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > vtk-developers mailing list
> > vtk-developers at vtk.org
> > http://www.vtk.org/mailman/listinfo/vtk-developers
> >   
> 





More information about the vtk-developers mailing list