VTK/Examples/Cxx/Developers/FilterSelfProgress
From KitwarePublic
< VTK | Examples | Cxx(Redirected from VTK/Examples/Developers/FilterProgress)
While you can let the user get the filter progresses like this: http://www.vtk.org/Wiki/VTK/Examples/Developers/ProgressReport
, it is often nice to have a filter report its progress itself.
Contents |
vtkTestFilter.h
#ifndef __vtkTestFilter_h #define __vtkTestFilter_h #include "vtkPolyDataAlgorithm.h" class vtkTestFilter : public vtkPolyDataAlgorithm { public: vtkTypeRevisionMacro(vtkTestFilter,vtkAlgorithm); static vtkTestFilter *New(); protected: vtkTestFilter(); ~vtkTestFilter(){} int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *); static void ProgressFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData); private: vtkTestFilter(const vtkTestFilter&); // Not implemented. void operator=(const vtkTestFilter&); // Not implemented. }; #endif
vtkTestFilter.cxx
#include "vtkSmartPointer.h" #include "vtkObjectFactory.h" #include "vtkStreamingDemandDrivenPipeline.h" #include "vtkInformationVector.h" #include "vtkInformation.h" #include "vtkDataObject.h" #include "vtkCallbackCommand.h" #include "vtkTestFilter.h" vtkCxxRevisionMacro(vtkTestFilter, "$Revision: 1.70 $"); vtkStandardNewMacro(vtkTestFilter); vtkTestFilter::vtkTestFilter() { vtkSmartPointer<vtkCallbackCommand> progressCallback = vtkSmartPointer<vtkCallbackCommand>::New(); progressCallback->SetCallback(this->ProgressFunction); this->AddObserver(vtkCommand::ProgressEvent, progressCallback); } void vtkTestFilter::ProgressFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData) { vtkTestFilter* testFilter = static_cast<vtkTestFilter*>(caller); cout << "Progress: " << testFilter->GetProgress() << endl; } int vtkTestFilter::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 vtkPolyData *input = vtkPolyData::SafeDownCast( inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkPolyData *output = vtkPolyData::SafeDownCast( outInfo->Get(vtkDataObject::DATA_OBJECT())); for(vtkIdType i = 0; i < input->GetNumberOfPoints(); i++) { this->UpdateProgress(static_cast<double>(i)/input->GetNumberOfPoints()); } output->ShallowCopy(input); return 1; }
ProgressInternal.cxx
#include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkPolyData.h> #include <vtkSphereSource.h> #include <vtkCallbackCommand.h> #include <vtkCommand.h> #include "vtkTestFilter.h" void ProgressFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData); int main(int argc, char **argv) { vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->Update(); vtkSmartPointer<vtkTestFilter> testFilter = vtkSmartPointer<vtkTestFilter>::New(); testFilter->SetInputConnection(sphereSource->GetOutputPort()); testFilter->Update(); return EXIT_SUCCESS; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) PROJECT(ProgressInternal) FIND_PACKAGE(VTK REQUIRED) INCLUDE(${VTK_USE_FILE}) ADD_EXECUTABLE(ProgressInternal ProgressInternal.cxx vtkTestFilter.cxx) TARGET_LINK_LIBRARIES(ProgressInternal vtkHybrid)