/*========================================================================= Program: Visualization Toolkit Module: vtkGraphAlgorithm.cxx 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. =========================================================================*/ /*------------------------------------------------------------------------- Copyright 2008 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. -------------------------------------------------------------------------*/ #include "vtkGraphAlgorithm.h" #include "vtkCommand.h" #include "vtkGraph.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkObjectFactory.h" #include "vtkStreamingDemandDrivenPipeline.h" vtkStandardNewMacro(vtkGraphAlgorithm); //------------------------------------------------------------------------------ vtkGraphAlgorithm::vtkGraphAlgorithm() { // by default assume filters have one input and one output // subclasses that deviate should modify this setting this->SetNumberOfInputPorts(1); this->SetNumberOfOutputPorts(1); } //------------------------------------------------------------------------------ vtkGraphAlgorithm::~vtkGraphAlgorithm() = default; //------------------------------------------------------------------------------ void vtkGraphAlgorithm::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os, indent); } //------------------------------------------------------------------------------ vtkTypeBool vtkGraphAlgorithm::ProcessRequest( vtkInformation* request, vtkInformationVector** inputVector, vtkInformationVector* 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); } // create the output if (request->Has(vtkDemandDrivenPipeline::REQUEST_DATA_OBJECT())) { return this->RequestDataObject(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 vtkGraphAlgorithm::FillOutputPortInformation(int vtkNotUsed(port), vtkInformation* info) { // now add our info info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkGraph"); return 1; } //------------------------------------------------------------------------------ int vtkGraphAlgorithm::FillInputPortInformation(int vtkNotUsed(port), vtkInformation* info) { info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkGraph"); return 1; } //------------------------------------------------------------------------------ vtkGraph* vtkGraphAlgorithm::GetOutput(int index) { return vtkGraph::SafeDownCast(this->GetOutputDataObject(index)); } //------------------------------------------------------------------------------ void vtkGraphAlgorithm::SetInputData(int index, vtkDataObject* input) { this->SetInputDataInternal(index, input); } //------------------------------------------------------------------------------ int vtkGraphAlgorithm::RequestInformation(vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* vtkNotUsed(outputVector)) { // do nothing let subclasses handle it return 1; } //------------------------------------------------------------------------------ int vtkGraphAlgorithm::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 vtkGraphAlgorithm::RequestData(vtkInformation* vtkNotUsed(request), vtkInformationVector** vtkNotUsed(inputVector), vtkInformationVector* vtkNotUsed(outputVector)) { return 0; } //------------------------------------------------------------------------------ int vtkGraphAlgorithm::RequestDataObject( vtkInformation*, vtkInformationVector** inputVector, vtkInformationVector* outputVector) { vtkInformation* inInfo = inputVector[0]->GetInformationObject(0); if (!inInfo) { return 0; } vtkGraph* input = vtkGraph::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); if (input) { // for each output for (int i = 0; i < this->GetNumberOfOutputPorts(); ++i) { vtkInformation* info = outputVector->GetInformationObject(i); vtkGraph* output = vtkGraph::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT())); if (!output || !output->IsA(input->GetClassName())) { output = input->NewInstance(); info->Set(vtkDataObject::DATA_OBJECT(), output); output->Delete(); } } return 1; } return 0; }