You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
4.6 KiB
154 lines
4.6 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkProgrammableAttributeDataFilter.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.
|
|
|
|
=========================================================================*/
|
|
#include "vtkProgrammableAttributeDataFilter.h"
|
|
|
|
#include "vtkCellData.h"
|
|
#include "vtkDataSetCollection.h"
|
|
#include "vtkGarbageCollector.h"
|
|
#include "vtkInformation.h"
|
|
#include "vtkInformationVector.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkPointData.h"
|
|
|
|
vtkCxxRevisionMacro(vtkProgrammableAttributeDataFilter, "$Revision: 1.22 $");
|
|
vtkStandardNewMacro(vtkProgrammableAttributeDataFilter);
|
|
|
|
vtkProgrammableAttributeDataFilter::vtkProgrammableAttributeDataFilter()
|
|
{
|
|
this->ExecuteMethod = NULL;
|
|
this->ExecuteMethodArg = NULL;
|
|
this->ExecuteMethodArgDelete = NULL;
|
|
this->InputList = vtkDataSetCollection::New();
|
|
}
|
|
|
|
vtkProgrammableAttributeDataFilter::~vtkProgrammableAttributeDataFilter()
|
|
{
|
|
// delete the current arg if there is one and a delete meth
|
|
if ((this->ExecuteMethodArg)&&(this->ExecuteMethodArgDelete))
|
|
{
|
|
(*this->ExecuteMethodArgDelete)(this->ExecuteMethodArg);
|
|
}
|
|
if (this->InputList)
|
|
{
|
|
this->InputList->Delete();
|
|
this->InputList = NULL;
|
|
}
|
|
}
|
|
|
|
// Add a dataset to the list of data to process.
|
|
void vtkProgrammableAttributeDataFilter::AddInput(vtkDataSet *ds)
|
|
{
|
|
if ( ! this->InputList->IsItemPresent(ds) )
|
|
{
|
|
this->Modified();
|
|
this->InputList->AddItem(ds);
|
|
}
|
|
}
|
|
|
|
// Remove a dataset from the list of data to process.
|
|
void vtkProgrammableAttributeDataFilter::RemoveInput(vtkDataSet *ds)
|
|
{
|
|
if ( this->InputList->IsItemPresent(ds) )
|
|
{
|
|
this->Modified();
|
|
this->InputList->RemoveItem(ds);
|
|
}
|
|
}
|
|
|
|
// Specify the function to use to operate on the point attribute data. Note
|
|
// that the function takes a single (void *) argument.
|
|
void vtkProgrammableAttributeDataFilter::SetExecuteMethod(void (*f)(void *), void *arg)
|
|
{
|
|
if ( f != this->ExecuteMethod || arg != this->ExecuteMethodArg )
|
|
{
|
|
// delete the current arg if there is one and a delete meth
|
|
if ((this->ExecuteMethodArg)&&(this->ExecuteMethodArgDelete))
|
|
{
|
|
(*this->ExecuteMethodArgDelete)(this->ExecuteMethodArg);
|
|
}
|
|
this->ExecuteMethod = f;
|
|
this->ExecuteMethodArg = arg;
|
|
this->Modified();
|
|
}
|
|
}
|
|
|
|
// Set the arg delete method. This is used to free user memory.
|
|
void vtkProgrammableAttributeDataFilter::SetExecuteMethodArgDelete(void (*f)(void *))
|
|
{
|
|
if ( f != this->ExecuteMethodArgDelete)
|
|
{
|
|
this->ExecuteMethodArgDelete = f;
|
|
this->Modified();
|
|
}
|
|
}
|
|
|
|
int vtkProgrammableAttributeDataFilter::RequestData(
|
|
vtkInformation *vtkNotUsed(request),
|
|
vtkInformationVector **inputVector,
|
|
vtkInformationVector *outputVector)
|
|
{
|
|
// get the info objects
|
|
vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
|
|
vtkInformation *outInfo = outputVector->GetInformationObject(0);
|
|
|
|
// get the input and ouptut
|
|
vtkDataSet *input = vtkDataSet::SafeDownCast(
|
|
inInfo->Get(vtkDataObject::DATA_OBJECT()));
|
|
vtkDataSet *output = vtkDataSet::SafeDownCast(
|
|
outInfo->Get(vtkDataObject::DATA_OBJECT()));
|
|
|
|
vtkDebugMacro(<<"Executing programmable point data filter");
|
|
|
|
// First, copy the input to the output as a starting point
|
|
output->CopyStructure( input );
|
|
|
|
// Output data is the same as input data by default.
|
|
output->GetCellData()->PassData(input->GetCellData());
|
|
output->GetPointData()->PassData(input->GetPointData());
|
|
|
|
// Now invoke the procedure, if specified.
|
|
if ( this->ExecuteMethod != NULL )
|
|
{
|
|
(*this->ExecuteMethod)(this->ExecuteMethodArg);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
void vtkProgrammableAttributeDataFilter::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "Input DataSets:\n";
|
|
this->InputList->PrintSelf(os,indent.GetNextIndent());
|
|
|
|
if ( this->ExecuteMethod )
|
|
{
|
|
os << indent << "An ExecuteMethod has been defined\n";
|
|
}
|
|
else
|
|
{
|
|
os << indent << "An ExecuteMethod has NOT been defined\n";
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void
|
|
vtkProgrammableAttributeDataFilter
|
|
::ReportReferences(vtkGarbageCollector* collector)
|
|
{
|
|
this->Superclass::ReportReferences(collector);
|
|
vtkGarbageCollectorReport(collector, this->InputList, "InputList");
|
|
}
|
|
|