You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
5.0 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkImageAppend.h
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.
=========================================================================*/
/**
* @class vtkImageAppend
* @brief Collects data from multiple inputs into one image.
*
* vtkImageAppend takes the components from multiple inputs and merges
* them into one output. The output images are append along the "AppendAxis".
* Except for the append axis, all inputs must have the same extent.
* All inputs must have the same number of scalar components.
* A future extension might be to pad or clip inputs to have the same extent.
* The output has the same origin and spacing as the first input.
* The origin and spacing of all other inputs are ignored. All inputs
* must have the same scalar type.
*/
#ifndef vtkImageAppend_h
#define vtkImageAppend_h
#include "vtkFiltersCoreModule.h" // For export macro
#include "vtkThreadedImageAlgorithm.h"
class VTKFILTERSCORE_EXPORT vtkImageAppend : public vtkThreadedImageAlgorithm
{
public:
static vtkImageAppend* New();
vtkTypeMacro(vtkImageAppend, vtkThreadedImageAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Replace one of the input connections with a new input. You can
* only replace input connections that you previously created with
* AddInputConnection() or, in the case of the first input,
* with SetInputConnection().
*/
virtual void ReplaceNthInputConnection(int idx, vtkAlgorithmOutput* input);
//@{
/**
* Assign a data object as input. Note that this method does not
* establish a pipeline connection. Use SetInputConnection() to
* setup a pipeline connection.
*/
void SetInputData(int num, vtkDataObject* input);
void SetInputData(vtkDataObject* input) { this->SetInputData(0, input); }
//@}
//@{
/**
* Get one input to this filter. This method is only for support of
* old-style pipeline connections. When writing new code you should
* use vtkAlgorithm::GetInputConnection(0, num).
*/
vtkDataObject* GetInput(int num);
vtkDataObject* GetInput() { return this->GetInput(0); }
//@}
/**
* Get the number of inputs to this filter. This method is only for
* support of old-style pipeline connections. When writing new code
* you should use vtkAlgorithm::GetNumberOfInputConnections(0).
*/
int GetNumberOfInputs() { return this->GetNumberOfInputConnections(0); }
//@{
/**
* This axis is expanded to hold the multiple images.
* The default AppendAxis is the X axis.
* If you want to create a volue from a series of XY images, then you should
* set the AppendAxis to 2 (Z axis).
*/
vtkSetMacro(AppendAxis, int);
vtkGetMacro(AppendAxis, int);
//@}
//@{
/**
* By default "PreserveExtents" is off and the append axis is used.
* When "PreseveExtents" is on, the extent of the inputs is used to
* place the image in the output. The whole extent of the output is
* the union of the input whole extents. Any portion of the
* output not covered by the inputs is set to zero. The origin and
* spacing is taken from the first input.
*/
vtkSetMacro(PreserveExtents, vtkTypeBool);
vtkGetMacro(PreserveExtents, vtkTypeBool);
vtkBooleanMacro(PreserveExtents, vtkTypeBool);
//@}
protected:
vtkImageAppend();
~vtkImageAppend() override;
vtkTypeBool PreserveExtents;
int AppendAxis;
// Array holds the AppendAxisExtent shift for each input.
int* Shifts;
int RequestInformation(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
int RequestUpdateExtent(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
void ThreadedRequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector, vtkImageData*** inData, vtkImageData** outData, int ext[6],
int id) override;
// see vtkAlgorithm for docs.
int FillInputPortInformation(int, vtkInformation*) override;
void InitOutput(int outExt[6], vtkImageData* outData);
void InternalComputeInputUpdateExtent(int* inExt, int* outExt, int* inWextent, int whichInput);
// overridden to allocate all of the output arrays, not just active scalars
void AllocateOutputData(vtkImageData* out, vtkInformation* outInfo, int* uExtent) override;
vtkImageData* AllocateOutputData(vtkDataObject* out, vtkInformation* outInfo) override;
// overridden to prevent shallow copies across, since we have to do it elementwise
void CopyAttributeData(
vtkImageData* in, vtkImageData* out, vtkInformationVector** inputVector) override;
private:
vtkImageAppend(const vtkImageAppend&) = delete;
void operator=(const vtkImageAppend&) = delete;
};
#endif