VTK/Examples/Developers/vtkAlgorithm Source
From KitwarePublic
< VTK | Examples | Developers
This example demonstrates how to create a source that returns a custom class. To test that it is working, the class vtkTest simply stores a double named 'Value' that is instantiated to the value of 4.5. Example.cxx instantiates a vtkTestSource which produces a vtkTest.
Contents |
AlgorithmSourceExample.cxx
#include <vtkSmartPointer.h> #include "vtkTestSource.h" #include "vtkTest.h" int main(int, char *[]) { vtkTestSource* source = vtkTestSource::New(); source->Update(); vtkTest* test = source->GetOutput(); std::cout << test->GetValue() << std::endl; return EXIT_SUCCESS; }
vtkTestSource.h
#ifndef __vtkTestSource_h #define __vtkTestSource_h #include "vtkAlgorithm.h" class vtkDataSet; class vtkTest; class vtkTestSource : public vtkAlgorithm { public: static vtkTestSource *New(); vtkTypeRevisionMacro(vtkTestSource,vtkAlgorithm); void PrintSelf(ostream& os, vtkIndent indent); // Description: // Get the output data object for a port on this algorithm. vtkTest* GetOutput(); vtkTest* GetOutput(int); virtual void SetOutput(vtkDataObject* d); // Description: // see vtkAlgorithm for details virtual int ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*); protected: vtkTestSource(); ~vtkTestSource(); // Description: // This is called by the superclass. // This is the method you should override. virtual int RequestDataObject( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector ); // convenience method virtual int RequestInformation( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector ); // Description: // This is called by the superclass. // This is the method you should override. virtual int RequestData( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector ); // Description: // This is called by the superclass. // This is the method you should override. virtual int RequestUpdateExtent( vtkInformation*, vtkInformationVector**, vtkInformationVector* ); virtual int FillOutputPortInformation( int port, vtkInformation* info ); private: vtkTestSource( const vtkTestSource& ); // Not implemented. void operator = ( const vtkTestSource& ); // Not implemented. }; #endif
vtkTestSource.cxx
#include "vtkTestSource.h" #include "vtkTest.h" #include "vtkCommand.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkObjectFactory.h" #include "vtkStreamingDemandDrivenPipeline.h" vtkCxxRevisionMacro(vtkTestSource, "$Revision: 1.1 $"); vtkStandardNewMacro(vtkTestSource); //---------------------------------------------------------------------------- vtkTestSource::vtkTestSource() { this->SetNumberOfInputPorts( 0 ); this->SetNumberOfOutputPorts( 1 ); } //---------------------------------------------------------------------------- vtkTestSource::~vtkTestSource() { } //---------------------------------------------------------------------------- void vtkTestSource::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //---------------------------------------------------------------------------- vtkTest* vtkTestSource::GetOutput() { return this->GetOutput(0); } //---------------------------------------------------------------------------- vtkTest* vtkTestSource::GetOutput(int port) { return vtkTest::SafeDownCast(this->GetOutputDataObject(port)); } //---------------------------------------------------------------------------- void vtkTestSource::SetOutput(vtkDataObject* d) { this->GetExecutive()->SetOutputData(0, d); } //---------------------------------------------------------------------------- int vtkTestSource::ProcessRequest(vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { // Create an output object of the correct type. if(request->Has(vtkDemandDrivenPipeline::REQUEST_DATA_OBJECT())) { return this->RequestDataObject(request, inputVector, outputVector); } // generate the data if(request->Has(vtkDemandDrivenPipeline::REQUEST_DATA())) { return this->RequestData(request, inputVector, outputVector); } if(request->Has(vtkStreamingDemandDrivenPipeline::REQUEST_UPDATE_EXTENT())) { return this->RequestUpdateExtent(request, inputVector, outputVector); } // execute information if(request->Has(vtkDemandDrivenPipeline::REQUEST_INFORMATION())) { return this->RequestInformation(request, inputVector, outputVector); } return this->Superclass::ProcessRequest(request, inputVector, outputVector); } //---------------------------------------------------------------------------- int vtkTestSource::FillOutputPortInformation( int vtkNotUsed(port), vtkInformation* info) { // now add our info info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkTest"); return 1; } //---------------------------------------------------------------------------- int vtkTestSource::RequestDataObject( vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* outputVector ) { for ( int i = 0; i < this->GetNumberOfOutputPorts(); ++i ) { vtkInformation* outInfo = outputVector->GetInformationObject( i ); vtkTest* output = vtkTest::SafeDownCast( outInfo->Get( vtkDataObject::DATA_OBJECT() ) ); if ( ! output ) { output = vtkTest::New(); outInfo->Set( vtkDataObject::DATA_OBJECT(), output ); output->FastDelete(); output->SetPipelineInformation( outInfo ); this->GetOutputPortInformation( i )->Set( vtkDataObject::DATA_EXTENT_TYPE(), output->GetExtentType() ); } } return 1; } //---------------------------------------------------------------------------- int vtkTestSource::RequestInformation( vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* vtkNotUsed(outputVector)) { // do nothing let subclasses handle it return 1; } //---------------------------------------------------------------------------- int vtkTestSource::RequestUpdateExtent( vtkInformation* vtkNotUsed(request), vtkInformationVector** inputVector, vtkInformationVector* vtkNotUsed(outputVector)) { int numInputPorts = this->GetNumberOfInputPorts(); for (int i=0; i<numInputPorts; i++) { int numInputConnections = this->GetNumberOfInputConnections(i); for (int j=0; j<numInputConnections; j++) { vtkInformation* inputInfo = inputVector[i]->GetInformationObject(j); inputInfo->Set(vtkStreamingDemandDrivenPipeline::EXACT_EXTENT(), 1); } } return 1; } //---------------------------------------------------------------------------- // This is the superclasses style of Execute method. Convert it into // an imaging style Execute method. int vtkTestSource::RequestData( vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed( inputVector ), vtkInformationVector* vtkNotUsed(outputVector) ) { // do nothing let subclasses handle it return 1; }
vtkTest.h
#ifndef __vtkTest_h #define __vtkTest_h #include "vtkDataObject.h" class vtkTest : public vtkDataObject { public: static vtkTest* New(); vtkTypeRevisionMacro(vtkTest,vtkDataObject); void PrintSelf( ostream& os, vtkIndent indent ); vtkGetMacro(Value, double); protected: vtkTest(); ~vtkTest(); private: vtkTest( const vtkTest& ); // Not implemented. void operator = ( const vtkTest& ); // Not implemented. double Value; }; #endif
vtkTest.cxx
#include "vtkTest.h" #include "vtkObjectFactory.h" vtkStandardNewMacro(vtkTest); vtkCxxRevisionMacro(vtkTest,"$Revision: 1.46 $"); vtkTest::vtkTest() { this->Value = 4.5; } vtkTest::~vtkTest() { } void vtkTest::PrintSelf( ostream& os, vtkIndent indent ) { this->Superclass::PrintSelf( os, indent ); }
CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
PROJECT(AlgorithmSourceExample)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(AlgorithmSourceExample AlgorithmSourceExample.cxx
vtkTest.cxx
vtkTestSource.cxx
)
TARGET_LINK_LIBRARIES(AlgorithmSourceExample vtkHybrid)