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.

167 lines
6.2 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkSelector.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 vtkSelector.h
* @brief Computes the portion of a dataset which is inside a selection
*
* This is an abstract superclass for types of selection operations. Subclasses
* generally only need to override `ComputeSelectedElements`.
*/
#ifndef vtkSelector_h
#define vtkSelector_h
#include "vtkFiltersExtractionModule.h" // For export macro
#include "vtkObject.h"
#include "vtkSmartPointer.h" // For vtkSmartPointer
class vtkCompositeDataSet;
class vtkDataObject;
class vtkSelectionNode;
class vtkSignedCharArray;
class vtkTable;
class vtkDataObjectTree;
class vtkUniformGridAMR;
class VTKFILTERSEXTRACTION_EXPORT vtkSelector : public vtkObject
{
public:
vtkTypeMacro(vtkSelector, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Sets the vtkSelectionNode used by this selection operator and initializes
* the data structures in the selection operator based on the selection.
*
* (for example in the vtkFrustumSelector this creates the vtkPlanes
* implicit function to represent the frustum).
*
* @param node The selection node that determines the behavior of this operator.
*/
virtual void Initialize(vtkSelectionNode* node);
/**
* Does any cleanup of objects created in Initialize
*/
virtual void Finalize() {}
/**
* Given an input and the vtkSelectionNode passed into the Initialize() method, add to the
* output a vtkSignedChar attribute array indicating whether each element is inside (1)
* or outside (0) the selection. The attribute (point data or cell data) is determined
* by the vtkSelection that owns the vtkSelectionNode set in Initialize(). The insidedness
* array is named with the value of InsidednessArrayName. If input is a vtkCompositeDataSet,
* the insidedness array is added to each block.
*
*/
virtual void Execute(vtkDataObject* input, vtkDataObject* output);
//@{
/**
* Get/Set the name of the array to use for the insidedness array to add to
* the output in `Execute` call.
*/
vtkSetMacro(InsidednessArrayName, std::string);
vtkGetMacro(InsidednessArrayName, std::string);
//@}
protected:
vtkSelector();
virtual ~vtkSelector() override;
// Contains the selection criteria.
vtkSelectionNode* Node = nullptr;
// Name of the insidedness array added to the output when the selection criteria is
// evaluated by this operator.
std::string InsidednessArrayName;
/**
* This method computes whether or not each element in the dataset is inside the selection
* and populates the given array with 0 (outside the selection) or 1 (inside the selection).
*
* The vtkDataObject passed in will never be a `vtkCompositeDataSet` subclass.
*
* What type of elements are operated over is determined by the vtkSelectionNode's
* field association. The insidednessArray passed in should have the correct number of elements
* for that field type or it will be resized.
*
* Returns true for successful completion. The operator should only return false
* when it cannot operate on the inputs. In which case, it is assumed that the
* insidednessArray may have been left untouched by this method and the calling code
* will fill it with 0.
*/
virtual bool ComputeSelectedElements(
vtkDataObject* input, vtkSignedCharArray* insidednessArray) = 0;
enum SelectionMode
{
INCLUDE,
EXCLUDE,
INHERIT
};
/**
* Returns whether the AMR block is to be processed. Return `INCLUDE` to
* indicate it must be processed or `EXCLUDE` to indicate it must not be
* processed. If the selector cannot make an exact determination for the given
* level, index it should return `INHERIT`. If the selection did not specify
* which AMR block to extract, then too return `INHERIT`.
*/
virtual SelectionMode GetAMRBlockSelection(unsigned int level, unsigned int index);
/**
* Returns whether the block is to be processed. Return `INCLUDE` to
* indicate it must be processed or `EXCLUDE` to indicate it must not be
* processed. If the selector cannot make an exact determination for the given
* level and index, it should return `INHERIT`. Note, returning `INCLUDE` or
* `EXCLUDE` has impact on all nodes in the subtree unless any of the node
* explicitly overrides the block selection mode.
*/
virtual SelectionMode GetBlockSelection(unsigned int compositeIndex);
/**
* Creates an array suitable for storing insideness. The array is named using
* this->InsidednessArrayName and is sized to exactly `numElems` values.
*/
vtkSmartPointer<vtkSignedCharArray> CreateInsidednessArray(vtkIdType numElems);
/**
* Given a data object and selected points, return an array indicating the
* insidedness of cells that contain at least one of the selected points.
*/
vtkSmartPointer<vtkSignedCharArray> ComputeCellsContainingSelectedPoints(
vtkDataObject* data, vtkSignedCharArray* selectedPoints);
/**
* Handle expanding to connected cells or point, if requested. This method is
* called in `Execute`. Subclass that override `Execute` should ensure they
* call this method to handle expanding to connected elements, as requested.
*
* Note: this method will modify `output`.
*/
void ExpandToConnectedElements(vtkDataObject* output);
private:
vtkSelector(const vtkSelector&) = delete;
void operator=(const vtkSelector&) = delete;
void ProcessBlock(vtkDataObject* inputBlock, vtkDataObject* outputBlock, bool forceFalse);
void ProcessAMR(vtkUniformGridAMR* input, vtkCompositeDataSet* output);
void ProcessDataObjectTree(vtkDataObjectTree* input, vtkDataObjectTree* output,
SelectionMode inheritedSelectionMode, unsigned int compositeIndex = 0);
};
#endif