[Paraview] XY plotting via filter extending vtkRectilinearGridAlgorithm, resulting plot always empty
Christine Corbett Moran
corbett at physik.uzh.ch
Mon Oct 5 15:30:50 EDT 2009
Hi,
I want to begin adding some non-trivial 2d plotting capabilities to my
ParaView plugin; in that interest I've implemented a filter which is
derived from vtkRectilinearGridAlgorithm. For now, I am trying only a
simple example, where my X coordinates are the particle ids, my Y and
Z coordinates are dummy arrays with one element, and my data is the id
to the power 2. When I act my filter, the XY plot view and a new 3D
view appear. However the XY plot is empty, as is the 3D view. I can
get something to appear in the 3D view by adding a glyph to the
pipeline (and the result makes sense), but nothing I do seems to get
it the XY plot view to actually plot.
I have included the RequestData portion of my filter at the end of the
message as well as the information tab of the object inspector of the
filter. Everything looks normal to me (except I am not sure why the
number of cells is less than the number of points?). Can anyone see
the problem? Is there something more I need to do? I've already done a
lot of searching of the archives, playing around with the parameters,
and reading the vtk documentation but haven't found the bug or the
missing call.
The information tab of the object inspector displays:
Type: Rectilinear Grid
Number of Cells: 1000
Number of Points: 1001
Data Arrays:
Name | Data Type | Data Ranges
data values | int | [0,1e+06]
Extents
X Extent: 0 to 1000 (dimension: 1001)
Y Extent: 0 to 0 (dimension: 1)
Z Extent: 0 to 0 (dimension: 1)
Bounds
X range: 0 to 1e+03
Y range: 0 to 0
Z range 0 to 0
And my request data method is:
//----------------------------------------------------------------------------
int vtkMassFunctionFilter::RequestData(vtkInformation*,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector)
{
// Get input and output data.
vtkPointSet* input = vtkPointSet::GetData(inputVector[0]);
vtkRectilinearGrid* output = vtkRectilinearGrid::GetData(outputVector);
// Setting the dimensions of this to be equal to our number of points,
// in X, and equal to 1 in the Y and Z directions,
// as these are dummy arrays.
output->SetDimensions(input->GetPoints()->GetNumberOfPoints(),1,1);
output->SetWholeExtent(0,input->GetPoints()->GetNumberOfPoints(),\
0,0,\
0,0);
// Allocate the arrays for the X,Y, and Z coordinates, and inserts a
// single value for the dummy arrays, as well as allocate the array
// for the scalar data
vtkSmartPointer<vtkDoubleArray> XArray=vtkSmartPointer<vtkDoubleArray>::New();
XArray->SetNumberOfComponents(1);
XArray->SetNumberOfTuples(input->GetPoints()->GetNumberOfPoints());
vtkSmartPointer<vtkDoubleArray>
DummyYArray=vtkSmartPointer<vtkDoubleArray>::New();
DummyYArray->SetNumberOfComponents(1);
DummyYArray->SetNumberOfTuples(1);
DummyYArray->InsertValue(0,0);
vtkSmartPointer<vtkDoubleArray>
DummyZArray=vtkSmartPointer<vtkDoubleArray>::New();
DummyZArray->SetNumberOfComponents(1);
DummyZArray->SetNumberOfTuples(1);
DummyZArray->InsertValue(0,0);
vtkSmartPointer<vtkIntArray> dataValues=vtkSmartPointer<vtkIntArray>::New();
dataValues->SetNumberOfComponents(1);
dataValues->SetNumberOfTuples(input->GetPoints()->GetNumberOfPoints());
dataValues->SetName("data values");
for(int nextPointId = 0;\
nextPointId < input->GetPoints()->GetNumberOfPoints();\
++nextPointId)
{
XArray->InsertValue(nextPointId,nextPointId);
dataValues->InsertValue(nextPointId,pow(nextPointId,2));
}
// Updating the output
output->SetXCoordinates(XArray);
output->SetYCoordinates(DummyYArray);
output->SetZCoordinates(DummyZArray);
output->GetPointData()->SetScalars(dataValues);
return 1;
}
More information about the ParaView
mailing list